From e45999b9bc01617fd7f8633fb5db024cc6672107 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 17 Sep 2025 11:14:41 +0530 Subject: [PATCH] viewmodel: details: Relocate and rename viewmodels Signed-off-by: Aayush Gupta --- .../store/compose/ui/details/ExodusScreen.kt | 8 +- .../store/compose/ui/details/MoreScreen.kt | 8 +- .../compose/ui/details/PermissionScreen.kt | 8 +- .../store/compose/ui/details/ReviewScreen.kt | 10 +- .../details/DetailsClusterViewModel.kt | 126 ------------------ ...sExodusViewModel.kt => ExodusViewModel.kt} | 6 +- ...tailsMoreViewModel.kt => MoreViewModel.kt} | 8 +- ...ionViewModel.kt => PermissionViewModel.kt} | 6 +- .../ReviewViewModel.kt} | 19 ++- 9 files changed, 36 insertions(+), 163 deletions(-) delete mode 100644 app/src/main/java/com/aurora/store/viewmodel/details/DetailsClusterViewModel.kt rename app/src/main/java/com/aurora/store/viewmodel/details/{DetailsExodusViewModel.kt => ExodusViewModel.kt} (90%) rename app/src/main/java/com/aurora/store/viewmodel/details/{DetailsMoreViewModel.kt => MoreViewModel.kt} (84%) rename app/src/main/java/com/aurora/store/viewmodel/details/{DetailsPermissionViewModel.kt => PermissionViewModel.kt} (86%) rename app/src/main/java/com/aurora/store/viewmodel/{review/DetailsReviewViewModel.kt => details/ReviewViewModel.kt} (79%) diff --git a/app/src/main/java/com/aurora/store/compose/ui/details/ExodusScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/details/ExodusScreen.kt index 6a948f15c..11bd1395c 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/details/ExodusScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/details/ExodusScreen.kt @@ -34,16 +34,16 @@ import com.aurora.store.compose.composables.details.ExodusComposable import com.aurora.store.compose.preview.AppPreviewProvider import com.aurora.store.data.model.ExodusTracker import com.aurora.store.viewmodel.details.AppDetailsViewModel -import com.aurora.store.viewmodel.details.DetailsExodusViewModel +import com.aurora.store.viewmodel.details.ExodusViewModel @Composable fun ExodusScreen( packageName: String, onNavigateUp: () -> Unit, appDetailsViewModel: AppDetailsViewModel = hiltViewModel(key = packageName), - detailsExodusViewModel: DetailsExodusViewModel = hiltViewModel( + exodusViewModel: ExodusViewModel = hiltViewModel( key = "$packageName/exodus", - creationCallback = { factory: DetailsExodusViewModel.Factory -> + creationCallback = { factory: ExodusViewModel.Factory -> factory.create(appDetailsViewModel.exodusReport.value!!) } ), @@ -51,7 +51,7 @@ fun ExodusScreen( ) { val app by appDetailsViewModel.app.collectAsStateWithLifecycle() val exodusReport by appDetailsViewModel.exodusReport.collectAsStateWithLifecycle() - val trackers by detailsExodusViewModel.trackers.collectAsStateWithLifecycle() + val trackers by exodusViewModel.trackers.collectAsStateWithLifecycle() val topAppBarTitle = when { windowAdaptiveInfo.isWindowCompact -> app!!.displayName diff --git a/app/src/main/java/com/aurora/store/compose/ui/details/MoreScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/details/MoreScreen.kt index 40f5b649d..00a4cae3d 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/details/MoreScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/details/MoreScreen.kt @@ -43,7 +43,7 @@ import com.aurora.store.compose.composables.app.AppComposable import com.aurora.store.compose.preview.AppPreviewProvider import com.aurora.store.compose.preview.coilPreviewProvider import com.aurora.store.viewmodel.details.AppDetailsViewModel -import com.aurora.store.viewmodel.details.DetailsMoreViewModel +import com.aurora.store.viewmodel.details.MoreViewModel import java.util.Locale @Composable @@ -52,15 +52,15 @@ fun MoreScreen( onNavigateUp: () -> Unit, onNavigateToAppDetails: (packageName: String) -> Unit, appDetailsViewModel: AppDetailsViewModel = hiltViewModel(key = packageName), - detailsMoreViewModel: DetailsMoreViewModel = hiltViewModel( + moreViewModel: MoreViewModel = hiltViewModel( key = "$packageName/more", - creationCallback = { factory: DetailsMoreViewModel.Factory -> + creationCallback = { factory: MoreViewModel.Factory -> factory.create(appDetailsViewModel.app.value!!.dependencies.dependentPackages) } ) ) { val app by appDetailsViewModel.app.collectAsStateWithLifecycle() - val dependencies by detailsMoreViewModel.dependentApps.collectAsStateWithLifecycle() + val dependencies by moreViewModel.dependentApps.collectAsStateWithLifecycle() ScreenContent( app = app!!, diff --git a/app/src/main/java/com/aurora/store/compose/ui/details/PermissionScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/details/PermissionScreen.kt index 7dc72cf4f..a8677e581 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/details/PermissionScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/details/PermissionScreen.kt @@ -33,7 +33,7 @@ import com.aurora.store.compose.composables.InfoComposable import com.aurora.store.compose.composables.TopAppBarComposable import com.aurora.store.compose.preview.AppPreviewProvider import com.aurora.store.viewmodel.details.AppDetailsViewModel -import com.aurora.store.viewmodel.details.DetailsPermissionViewModel +import com.aurora.store.viewmodel.details.PermissionViewModel import java.util.Locale @Composable @@ -41,16 +41,16 @@ fun PermissionScreen( packageName: String, onNavigateUp: () -> Unit, appDetailsViewModel: AppDetailsViewModel = hiltViewModel(key = packageName), - detailsPermissionViewModel: DetailsPermissionViewModel = hiltViewModel( + permissionViewModel: PermissionViewModel = hiltViewModel( key = "$packageName/permission", - creationCallback = { factory: DetailsPermissionViewModel.Factory -> + creationCallback = { factory: PermissionViewModel.Factory -> factory.create(appDetailsViewModel.app.value!!.permissions) } ), windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() ) { val app by appDetailsViewModel.app.collectAsStateWithLifecycle() - val permissionsInfo by detailsPermissionViewModel.permissionsInfo.collectAsStateWithLifecycle() + val permissionsInfo by permissionViewModel.permissionsInfo.collectAsStateWithLifecycle() val topAppBarTitle = when { windowAdaptiveInfo.isWindowCompact -> app!!.displayName diff --git a/app/src/main/java/com/aurora/store/compose/ui/details/ReviewScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/details/ReviewScreen.kt index e482138b4..b78050706 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/details/ReviewScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/details/ReviewScreen.kt @@ -49,7 +49,7 @@ import com.aurora.store.compose.composables.details.ReviewComposable import com.aurora.store.compose.preview.ReviewPreviewProvider import com.aurora.store.compose.preview.coilPreviewProvider import com.aurora.store.viewmodel.details.AppDetailsViewModel -import com.aurora.store.viewmodel.review.DetailsReviewViewModel +import com.aurora.store.viewmodel.details.ReviewViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlin.random.Random @@ -58,16 +58,16 @@ fun ReviewScreen( packageName: String, onNavigateUp: () -> Unit, appDetailsViewModel: AppDetailsViewModel = hiltViewModel(key = packageName), - detailsReviewViewModel: DetailsReviewViewModel = hiltViewModel( + reviewViewModel: ReviewViewModel = hiltViewModel( key = "$packageName/review", - creationCallback = { factory: DetailsReviewViewModel.Factory -> + creationCallback = { factory: ReviewViewModel.Factory -> factory.create(appDetailsViewModel.app.value!!.packageName) } ), windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() ) { val app by appDetailsViewModel.app.collectAsStateWithLifecycle() - val reviews = detailsReviewViewModel.reviews.collectAsLazyPagingItems() + val reviews = reviewViewModel.reviews.collectAsLazyPagingItems() val topAppBarTitle = when { windowAdaptiveInfo.isWindowCompact -> app!!.displayName @@ -78,7 +78,7 @@ fun ReviewScreen( topAppBarTitle = topAppBarTitle, reviews = reviews, onNavigateUp = onNavigateUp, - onFilter = { filter -> detailsReviewViewModel.fetchReviews(filter) } + onFilter = { filter -> reviewViewModel.fetchReviews(filter) } ) } diff --git a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsClusterViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/details/DetailsClusterViewModel.kt deleted file mode 100644 index d2a14e28d..000000000 --- a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsClusterViewModel.kt +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Aurora Store - * Copyright (C) 2021, Rahul Kumar Patel - * - * Aurora Store is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * Aurora Store is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Aurora Store. If not, see . - * - */ - -package com.aurora.store.viewmodel.details - -import android.util.Log -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.aurora.gplayapi.data.models.StreamBundle -import com.aurora.gplayapi.data.models.StreamCluster -import com.aurora.gplayapi.helpers.AppDetailsHelper -import com.aurora.gplayapi.helpers.StreamHelper -import com.aurora.gplayapi.helpers.contracts.StreamContract -import com.aurora.store.AppStreamStash -import com.aurora.store.data.model.ViewState -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.supervisorScope -import javax.inject.Inject - -@HiltViewModel -class DetailsClusterViewModel @Inject constructor( - private val appDetailsHelper: AppDetailsHelper, - private val streamHelper: StreamHelper -) : ViewModel() { - - private val TAG = DetailsClusterViewModel::class.java.simpleName - - val liveData: MutableLiveData = MutableLiveData() - private val stash: AppStreamStash = mutableMapOf() - - lateinit var type: StreamContract.Type - lateinit var category: StreamContract.Category - - fun getStreamBundle(streamUrl: String) { - viewModelScope.launch(Dispatchers.IO) { - supervisorScope { - val bundle = targetBundle(streamUrl) - if (bundle.streamClusters.isNotEmpty()) { - liveData.postValue(ViewState.Success(stash)) - } - - try { - if (!bundle.hasCluster() || bundle.hasNext()) { - val newBundle = appDetailsHelper.getDetailsStream(streamUrl) - - val mergedBundle = bundle.copy( - streamClusters = bundle.streamClusters + newBundle.streamClusters, - streamNextPageUrl = newBundle.streamNextPageUrl - ) - stash[streamUrl] = mergedBundle - - liveData.postValue(ViewState.Success(stash)) - } - } catch (e: Exception) { - liveData.postValue(ViewState.Error(e.message)) - } - } - } - } - - fun observeCluster(url: String, streamCluster: StreamCluster) { - viewModelScope.launch(Dispatchers.IO) { - supervisorScope { - try { - if (streamCluster.hasNext()) { - val newCluster = - streamHelper.getNextStreamCluster(streamCluster.clusterNextPageUrl) - updateCluster(url, streamCluster.id, newCluster) - liveData.postValue(ViewState.Success(stash)) - } else { - Log.i(TAG, "End of cluster") - } - } catch (e: Exception) { - liveData.postValue(ViewState.Error(e.message)) - } - } - } - } - - private fun updateCluster( - url: String, - clusterID: Int, - newCluster: StreamCluster - ) { - val bundle = targetBundle(url) - bundle.streamClusters[clusterID]?.let { oldCluster -> - val mergedCluster = oldCluster.copy( - clusterNextPageUrl = newCluster.clusterNextPageUrl, - clusterAppList = oldCluster.clusterAppList + newCluster.clusterAppList - ) - - val newStreamClusters = bundle.streamClusters.toMutableMap().apply { - this[clusterID] = mergedCluster - } - - stash.put(url, bundle.copy(streamClusters = newStreamClusters)) - } - } - - private fun targetBundle(url: String): StreamBundle { - val streamBundle = stash.getOrPut(url) { - StreamBundle() - } - - return streamBundle - } -} diff --git a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsExodusViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/details/ExodusViewModel.kt similarity index 90% rename from app/src/main/java/com/aurora/store/viewmodel/details/DetailsExodusViewModel.kt rename to app/src/main/java/com/aurora/store/viewmodel/details/ExodusViewModel.kt index 6ea5a3345..828f3c105 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsExodusViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/details/ExodusViewModel.kt @@ -19,15 +19,15 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.json.JSONObject -@HiltViewModel(assistedFactory = DetailsExodusViewModel.Factory::class) -class DetailsExodusViewModel @AssistedInject constructor( +@HiltViewModel(assistedFactory = ExodusViewModel.Factory::class) +class ExodusViewModel @AssistedInject constructor( @Assisted private val exodusReport: Report, private val exodusTrackers: JSONObject ) : ViewModel() { @AssistedFactory interface Factory { - fun create(exodusReport: Report): DetailsExodusViewModel + fun create(exodusReport: Report): ExodusViewModel } private val _trackers = MutableStateFlow>(emptyList()) diff --git a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsMoreViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/details/MoreViewModel.kt similarity index 84% rename from app/src/main/java/com/aurora/store/viewmodel/details/DetailsMoreViewModel.kt rename to app/src/main/java/com/aurora/store/viewmodel/details/MoreViewModel.kt index c8d277338..31be60d49 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsMoreViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/details/MoreViewModel.kt @@ -20,18 +20,18 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -@HiltViewModel(assistedFactory = DetailsMoreViewModel.Factory::class) -class DetailsMoreViewModel @AssistedInject constructor( +@HiltViewModel(assistedFactory = MoreViewModel.Factory::class) +class MoreViewModel @AssistedInject constructor( @Assisted private val dependencies: List, private val appDetailsHelper: AppDetailsHelper ) : ViewModel() { @AssistedFactory interface Factory { - fun create(dependencies: List): DetailsMoreViewModel + fun create(dependencies: List): MoreViewModel } - private val TAG = DetailsMoreViewModel::class.java.simpleName + private val TAG = MoreViewModel::class.java.simpleName private val _dependentApps = MutableStateFlow?>(emptyList()) val dependentApps = _dependentApps.asStateFlow() diff --git a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsPermissionViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/details/PermissionViewModel.kt similarity index 86% rename from app/src/main/java/com/aurora/store/viewmodel/details/DetailsPermissionViewModel.kt rename to app/src/main/java/com/aurora/store/viewmodel/details/PermissionViewModel.kt index 457d0a41a..7e5e7b1e1 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsPermissionViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/details/PermissionViewModel.kt @@ -17,15 +17,15 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -@HiltViewModel(assistedFactory = DetailsPermissionViewModel.Factory::class) -class DetailsPermissionViewModel @AssistedInject constructor( +@HiltViewModel(assistedFactory = PermissionViewModel.Factory::class) +class PermissionViewModel @AssistedInject constructor( @Assisted private val permissions: List, @ApplicationContext private val context: Context ): ViewModel() { @AssistedFactory interface Factory { - fun create(permissions: List): DetailsPermissionViewModel + fun create(permissions: List): PermissionViewModel } private val _permissionsInfo = MutableStateFlow>(emptyMap()) diff --git a/app/src/main/java/com/aurora/store/viewmodel/review/DetailsReviewViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/details/ReviewViewModel.kt similarity index 79% rename from app/src/main/java/com/aurora/store/viewmodel/review/DetailsReviewViewModel.kt rename to app/src/main/java/com/aurora/store/viewmodel/details/ReviewViewModel.kt index 49f46e73d..8eaf26372 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/review/DetailsReviewViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/details/ReviewViewModel.kt @@ -1,10 +1,9 @@ /* - * SPDX-FileCopyrightText: 2021-2023 AuroraOSS - * SPDX-FileCopyrightText: 2024-2025 The Calyx Institute + * SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-License-Identifier: GPL-3.0-or-later */ -package com.aurora.store.viewmodel.review +package com.aurora.store.viewmodel.details import android.util.Log import androidx.lifecycle.ViewModel @@ -13,7 +12,7 @@ import androidx.paging.PagingData import androidx.paging.cachedIn import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.helpers.ReviewsHelper -import com.aurora.store.data.paging.GenericPagingSource.Companion.createPager +import com.aurora.store.data.paging.GenericPagingSource import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -24,20 +23,20 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -@HiltViewModel(assistedFactory = DetailsReviewViewModel.Factory::class) -class DetailsReviewViewModel @AssistedInject constructor( +@HiltViewModel(assistedFactory = ReviewViewModel.Factory::class) +class ReviewViewModel @AssistedInject constructor( @Assisted private val packageName: String, private val reviewsHelper: ReviewsHelper ) : ViewModel() { @AssistedFactory interface Factory { - fun create(packageName: String): DetailsReviewViewModel + fun create(packageName: String): ReviewViewModel } - private val TAG = DetailsReviewViewModel::class.java.simpleName + private val TAG = ReviewViewModel::class.java.simpleName - private val _reviews = MutableStateFlow>(PagingData.empty()) + private val _reviews = MutableStateFlow>(PagingData.Companion.empty()) val reviews = _reviews.asStateFlow() init { @@ -47,7 +46,7 @@ class DetailsReviewViewModel @AssistedInject constructor( fun fetchReviews(filter: Review.Filter = Review.Filter.ALL) { var reviewsNextPageUrl: String? = null - createPager { page -> + GenericPagingSource.Companion.createPager { page -> try { when (page) { 1 -> reviewsHelper.getReviews(packageName, filter).also {