mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 07:13:00 +00:00 
			
		
		
		
	Add comment view model
This commit is contained in:
		| @@ -294,11 +294,9 @@ dependencies { | |||||||
|     implementation 'androidx.activity:activity-compose' |     implementation 'androidx.activity:activity-compose' | ||||||
|     implementation 'androidx.compose.ui:ui-tooling-preview' |     implementation 'androidx.compose.ui:ui-tooling-preview' | ||||||
|     implementation 'androidx.compose.ui:ui-text:1.7.0-beta04' // Needed for parsing HTML to AnnotatedString |     implementation 'androidx.compose.ui:ui-text:1.7.0-beta04' // Needed for parsing HTML to AnnotatedString | ||||||
|     implementation 'com.github.nanihadesuka:LazyColumnScrollbar:2.1.0' |     implementation 'androidx.lifecycle:lifecycle-viewmodel-compose' | ||||||
|  |  | ||||||
|     // Paging |  | ||||||
|     implementation 'androidx.paging:paging-rxjava3:3.3.0' |  | ||||||
|     implementation 'androidx.paging:paging-compose:3.3.0' |     implementation 'androidx.paging:paging-compose:3.3.0' | ||||||
|  |     implementation 'com.github.nanihadesuka:LazyColumnScrollbar:2.1.0' | ||||||
|  |  | ||||||
| /** Debugging **/ | /** Debugging **/ | ||||||
|     // Memory leak detection |     // Memory leak detection | ||||||
|   | |||||||
| @@ -144,14 +144,14 @@ fun Comment(comment: CommentsInfoItem) { | |||||||
|     if (showReplies) { |     if (showReplies) { | ||||||
|         ModalBottomSheet(onDismissRequest = { showReplies = false }) { |         ModalBottomSheet(onDismissRequest = { showReplies = false }) { | ||||||
|             val coroutineScope = rememberCoroutineScope() |             val coroutineScope = rememberCoroutineScope() | ||||||
|             val flow = remember(coroutineScope) { |             val flow = remember { | ||||||
|                 Pager(PagingConfig(pageSize = 20, enablePlaceholders = false)) { |                 Pager(PagingConfig(pageSize = 20, enablePlaceholders = false)) { | ||||||
|                     CommentsSource(comment.serviceId, comment.url, comment.replies) |                     CommentsSource(comment.serviceId, comment.url, comment.replies) | ||||||
|                 }.flow |                 }.flow | ||||||
|                     .cachedIn(coroutineScope) |                     .cachedIn(coroutineScope) | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             CommentSection(parentComment = comment, commentsData = flow) |             CommentSection(parentComment = comment, commentsFlow = flow) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -36,9 +36,9 @@ import org.schabi.newpipe.paging.CommentsDisabledException | |||||||
| @Composable | @Composable | ||||||
| fun CommentSection( | fun CommentSection( | ||||||
|     parentComment: CommentsInfoItem? = null, |     parentComment: CommentsInfoItem? = null, | ||||||
|     commentsData: Flow<PagingData<CommentsInfoItem>> |     commentsFlow: Flow<PagingData<CommentsInfoItem>> | ||||||
| ) { | ) { | ||||||
|     val comments = commentsData.collectAsLazyPagingItems() |     val comments = commentsFlow.collectAsLazyPagingItems() | ||||||
|     val itemCount by remember { derivedStateOf { comments.itemCount } } |     val itemCount by remember { derivedStateOf { comments.itemCount } } | ||||||
|  |  | ||||||
|     Surface(color = MaterialTheme.colorScheme.background) { |     Surface(color = MaterialTheme.colorScheme.background) { | ||||||
| @@ -113,7 +113,7 @@ private fun CommentSectionPreview( | |||||||
|     @PreviewParameter(CommentDataProvider::class) pagingData: PagingData<CommentsInfoItem> |     @PreviewParameter(CommentDataProvider::class) pagingData: PagingData<CommentsInfoItem> | ||||||
| ) { | ) { | ||||||
|     AppTheme { |     AppTheme { | ||||||
|         CommentSection(commentsData = flowOf(pagingData)) |         CommentSection(commentsFlow = flowOf(pagingData)) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -137,6 +137,6 @@ private fun CommentRepliesPreview() { | |||||||
|     val flow = flowOf(PagingData.from(replies)) |     val flow = flowOf(PagingData.from(replies)) | ||||||
|  |  | ||||||
|     AppTheme { |     AppTheme { | ||||||
|         CommentSection(parentComment = comment, commentsData = flow) |         CommentSection(parentComment = comment, commentsFlow = flow) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,60 +2,37 @@ package org.schabi.newpipe.fragments.list.comments | |||||||
|  |  | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.view.LayoutInflater | import android.view.LayoutInflater | ||||||
| import android.view.View |  | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
| import androidx.compose.runtime.remember |  | ||||||
| import androidx.compose.runtime.rememberCoroutineScope |  | ||||||
| import androidx.compose.ui.platform.ComposeView | import androidx.compose.ui.platform.ComposeView | ||||||
| import androidx.compose.ui.platform.ViewCompositionStrategy | import androidx.compose.ui.platform.ViewCompositionStrategy | ||||||
| import androidx.core.os.bundleOf | import androidx.core.os.bundleOf | ||||||
| import androidx.fragment.app.Fragment | import androidx.fragment.app.Fragment | ||||||
| import androidx.paging.Pager | import androidx.lifecycle.viewmodel.compose.viewModel | ||||||
| import androidx.paging.PagingConfig |  | ||||||
| import androidx.paging.cachedIn |  | ||||||
| import org.schabi.newpipe.compose.comment.CommentSection | import org.schabi.newpipe.compose.comment.CommentSection | ||||||
| import org.schabi.newpipe.compose.theme.AppTheme | import org.schabi.newpipe.compose.theme.AppTheme | ||||||
| import org.schabi.newpipe.paging.CommentsSource | import org.schabi.newpipe.util.KEY_SERVICE_ID | ||||||
| import org.schabi.newpipe.util.NO_SERVICE_ID | import org.schabi.newpipe.util.KEY_URL | ||||||
|  | import org.schabi.newpipe.viewmodels.CommentsViewModel | ||||||
|  |  | ||||||
| class CommentsFragment : Fragment() { | class CommentsFragment : Fragment() { | ||||||
|     override fun onCreateView( |     override fun onCreateView( | ||||||
|         inflater: LayoutInflater, |         inflater: LayoutInflater, | ||||||
|         container: ViewGroup?, |         container: ViewGroup?, | ||||||
|         savedInstanceState: Bundle? |         savedInstanceState: Bundle? | ||||||
|     ): View { |     ) = ComposeView(requireContext()).apply { | ||||||
|         val arguments = requireArguments() |  | ||||||
|         val serviceId = arguments.getInt(SERVICE_ID, NO_SERVICE_ID) |  | ||||||
|         val url = arguments.getString(URL) |  | ||||||
|  |  | ||||||
|         return ComposeView(requireContext()).apply { |  | ||||||
|         setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) |         setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) | ||||||
|         setContent { |         setContent { | ||||||
|                 val coroutineScope = rememberCoroutineScope() |             val viewModel = viewModel<CommentsViewModel>() | ||||||
|                 val flow = remember(coroutineScope) { |  | ||||||
|                     Pager(PagingConfig(pageSize = 20, enablePlaceholders = false)) { |  | ||||||
|                         CommentsSource(serviceId, url, null) |  | ||||||
|                     }.flow |  | ||||||
|                         .cachedIn(coroutineScope) |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|             AppTheme { |             AppTheme { | ||||||
|                     CommentSection(commentsData = flow) |                 CommentSection(commentsFlow = viewModel.comments) | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     companion object { |     companion object { | ||||||
|         private const val SERVICE_ID = "serviceId" |  | ||||||
|         private const val URL = "url" |  | ||||||
|  |  | ||||||
|         @JvmStatic |         @JvmStatic | ||||||
|         fun getInstance(serviceId: Int, url: String?) = CommentsFragment().apply { |         fun getInstance(serviceId: Int, url: String?) = CommentsFragment().apply { | ||||||
|             arguments = bundleOf( |             arguments = bundleOf(KEY_SERVICE_ID to serviceId, KEY_URL to url) | ||||||
|                 SERVICE_ID to serviceId, |  | ||||||
|                 URL to url |  | ||||||
|             ) |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,22 @@ | |||||||
|  | package org.schabi.newpipe.viewmodels | ||||||
|  |  | ||||||
|  | import androidx.lifecycle.SavedStateHandle | ||||||
|  | import androidx.lifecycle.ViewModel | ||||||
|  | import androidx.lifecycle.viewModelScope | ||||||
|  | import androidx.paging.Pager | ||||||
|  | import androidx.paging.PagingConfig | ||||||
|  | import androidx.paging.cachedIn | ||||||
|  | import org.schabi.newpipe.paging.CommentsSource | ||||||
|  | import org.schabi.newpipe.util.KEY_SERVICE_ID | ||||||
|  | import org.schabi.newpipe.util.KEY_URL | ||||||
|  | import org.schabi.newpipe.util.NO_SERVICE_ID | ||||||
|  |  | ||||||
|  | class CommentsViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { | ||||||
|  |     private val serviceId = savedStateHandle[KEY_SERVICE_ID] ?: NO_SERVICE_ID | ||||||
|  |     private val url = savedStateHandle.get<String>(KEY_URL) | ||||||
|  |  | ||||||
|  |     val comments = Pager(PagingConfig(pageSize = 20, enablePlaceholders = false)) { | ||||||
|  |         CommentsSource(serviceId, url, null) | ||||||
|  |     }.flow | ||||||
|  |         .cachedIn(viewModelScope) | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Isira Seneviratne
					Isira Seneviratne