Move hilt injected objects into viewmodels everywhere

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2025-01-23 20:05:27 +07:00
parent e09864a8e8
commit e3ebbe37d2
30 changed files with 281 additions and 132 deletions

View File

@@ -24,6 +24,7 @@ import android.os.Bundle
import android.view.View
import androidx.activity.addCallback
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat.Type.displayCutout
@@ -34,30 +35,23 @@ import androidx.navigation.FloatingWindow
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupWithNavController
import com.aurora.extensions.isNAndAbove
import com.aurora.store.data.helper.UpdateHelper
import com.aurora.store.data.model.NetworkStatus
import com.aurora.store.data.receiver.MigrationReceiver
import com.aurora.store.databinding.ActivityMainBinding
import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_DEFAULT_SELECTED_TAB
import com.aurora.store.view.ui.sheets.NetworkDialogSheet
import com.aurora.store.data.providers.NetworkProvider
import com.aurora.store.util.PackageUtil
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import javax.inject.Inject
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var networkProvider: NetworkProvider
@Inject
lateinit var updateHelper: UpdateHelper
private val viewModel: MainViewModel by viewModels()
private lateinit var B: ActivityMainBinding
@@ -91,7 +85,7 @@ class MainActivity : AppCompatActivity() {
val navController = navHostFragment.navController
if (isNAndAbove && !PackageUtil.isTv(this)) {
networkProvider.status.onEach { networkStatus ->
viewModel.networkProvider.status.onEach { networkStatus ->
when (networkStatus) {
NetworkStatus.AVAILABLE -> {
if (!supportFragmentManager.isDestroyed && isIntroDone()) {
@@ -152,7 +146,7 @@ class MainActivity : AppCompatActivity() {
// Updates
lifecycleScope.launch {
updateHelper.updates.collectLatest { list ->
viewModel.updateHelper.updates.collectLatest { list ->
B.navView.getOrCreateBadge(R.id.updatesFragment).apply {
isVisible = !list.isNullOrEmpty()
number = list?.size ?: 0

View File

@@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store
import androidx.lifecycle.ViewModel
import com.aurora.store.data.helper.UpdateHelper
import com.aurora.store.data.providers.NetworkProvider
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class MainViewModel @Inject constructor(
val networkProvider: NetworkProvider,
val updateHelper: UpdateHelper
) : ViewModel()

View File

@@ -21,6 +21,7 @@ package com.aurora.store.view.ui.account
import android.os.Bundle
import android.view.View
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import coil3.load
import coil3.request.placeholder
@@ -31,17 +32,15 @@ import com.aurora.Constants.URL_LICENSE
import com.aurora.Constants.URL_TOS
import com.aurora.extensions.browse
import com.aurora.store.R
import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.databinding.FragmentAccountBinding
import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.viewmodel.account.AccountViewModel
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class AccountFragment : BaseFragment<FragmentAccountBinding>() {
@Inject
lateinit var authProvider: AuthProvider
private val viewModel: AccountViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -56,15 +55,16 @@ class AccountFragment : BaseFragment<FragmentAccountBinding>() {
binding.chipTos.setOnClickListener { browse(URL_TOS) }
}
authProvider.authData?.userProfile?.let {
val avatar = if (authProvider.isAnonymous) R.mipmap.ic_launcher else it.artwork.url
viewModel.authProvider.authData?.userProfile?.let {
val avatar =
if (viewModel.authProvider.isAnonymous) R.mipmap.ic_launcher else it.artwork.url
binding.imgAvatar.load(avatar) {
placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(32F))
}
binding.txtName.text = if (authProvider.isAnonymous) "Anonymous" else it.name
binding.txtName.text = if (viewModel.authProvider.isAnonymous) "Anonymous" else it.name
binding.txtEmail.text =
if (authProvider.isAnonymous) "anonymous@gmail.com" else it.email
if (viewModel.authProvider.isAnonymous) "anonymous@gmail.com" else it.email
}
binding.btnLogout.addOnClickListener {

View File

@@ -23,28 +23,27 @@ import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.navigation.fragment.findNavController
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.aurora.store.MobileNavigationDirections
import com.aurora.store.R
import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.databinding.FragmentAppsGamesBinding
import com.aurora.store.util.Preferences
import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.view.ui.commons.CategoryFragment
import com.aurora.store.view.ui.commons.ForYouFragment
import com.aurora.store.view.ui.commons.TopChartContainerFragment
import com.aurora.store.viewmodel.apps.AppsContainerViewModel
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class AppsContainerFragment : BaseFragment<FragmentAppsGamesBinding>() {
@Inject
lateinit var authProvider: AuthProvider
private val viewModel: AppsContainerViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -77,7 +76,7 @@ class AppsContainerFragment : BaseFragment<FragmentAppsGamesBinding>() {
binding.pager.adapter = ViewPagerAdapter(
childFragmentManager,
viewLifecycleOwner.lifecycle,
!authProvider.isAnonymous,
!viewModel.authProvider.isAnonymous,
isForYouEnabled
)

View File

@@ -48,6 +48,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.util.fastForEach
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import coil3.compose.AsyncImage
import coil3.request.ImageRequest
@@ -59,18 +60,16 @@ import com.aurora.extensions.getStyledAttributeColor
import com.aurora.extensions.setAppTheme
import com.aurora.store.MR
import com.aurora.store.R
import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.util.Preferences
import com.aurora.store.view.theme.AuroraTheme
import com.aurora.store.viewmodel.commons.MoreViewModel
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class MoreDialogFragment : DialogFragment() {
@Inject
lateinit var authProvider: AuthProvider
private val viewModel: MoreViewModel by viewModels()
private var primaryColor: Color = Color.White
private var onPrimaryColor: Color = Color.Black
@@ -240,10 +239,10 @@ class MoreDialogFragment : DialogFragment() {
AsyncImage(
model = ImageRequest.Builder(LocalContext.current)
.data(
if (authProvider.isAnonymous) {
if (viewModel.authProvider.isAnonymous) {
R.mipmap.ic_launcher
} else {
authProvider.authData?.userProfile?.artwork?.url
viewModel.authProvider.authData?.userProfile?.artwork?.url
}
)
.crossfade(true)
@@ -260,10 +259,10 @@ class MoreDialogFragment : DialogFragment() {
horizontalAlignment = Alignment.Start
) {
Text(
text = if (authProvider.isAnonymous) {
text = if (viewModel.authProvider.isAnonymous) {
stringResource(R.string.account_anonymous)
} else {
authProvider.authData?.userProfile?.name
viewModel.authProvider.authData?.userProfile?.name
?: stringResource(R.string.status_unavailable)
},
fontWeight = FontWeight.Normal,
@@ -273,10 +272,10 @@ class MoreDialogFragment : DialogFragment() {
overflow = TextOverflow.Ellipsis
)
Text(
text = if (authProvider.isAnonymous) {
text = if (viewModel.authProvider.isAnonymous) {
stringResource(R.string.account_anonymous_email)
} else {
authProvider.authData?.userProfile?.email
viewModel.authProvider.authData?.userProfile?.email
?: stringResource(R.string.status_unavailable)
},
fontWeight = FontWeight.Light,

View File

@@ -70,7 +70,6 @@ import com.aurora.store.data.model.DownloadStatus
import com.aurora.store.data.model.PermissionType
import com.aurora.store.data.model.ViewState
import com.aurora.store.data.model.ViewState.Loading.getDataAs
import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.databinding.FragmentDetailsBinding
import com.aurora.store.util.CertUtil
import com.aurora.store.util.CommonUtil
@@ -94,7 +93,6 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import java.util.Locale
import javax.inject.Inject
import com.aurora.gplayapi.data.models.datasafety.Report as DataSafetyReport
@AndroidEntryPoint
@@ -105,9 +103,6 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
private val args: AppDetailsFragmentArgs by navArgs()
@Inject
lateinit var authProvider: AuthProvider
private lateinit var app: App
private lateinit var iconDrawable: Drawable
@@ -198,7 +193,7 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
// App User Review
// We can not fetch it outside of this block, as we need the testing program status
if (!authProvider.isAnonymous && app.isInstalled) {
if (!viewModel.authProvider.isAnonymous && app.isInstalled) {
viewModel.fetchUserAppReview(app)
}
@@ -680,7 +675,7 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
}
binding.layoutDetailsApp.btnPrimaryAction.setOnClickListener {
if (authProvider.isAnonymous && !app.isFree) {
if (viewModel.authProvider.isAnonymous && !app.isFree) {
toast(R.string.toast_purchase_blocked)
return@setOnClickListener
} else if (app.versionCode == 0) {
@@ -744,7 +739,7 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
updateAppPermission(app)
// Allow users to handle beta subscriptions, if logged in by own account.
if (!authProvider.isAnonymous) {
if (!viewModel.authProvider.isAnonymous) {
// Update app name to the testing program name, if subscribed
app.testingProgram?.let {
if (it.isAvailable && it.isSubscribed) {
@@ -853,7 +848,7 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
private fun updateUserReview(review: Review? = null) {
binding.layoutDetailsReview.apply {
layoutUserReview.isVisible = !authProvider.isAnonymous
layoutUserReview.isVisible = !viewModel.authProvider.isAnonymous
btnPostReview.setOnClickListener {
viewModel.postAppReview(
app.packageName,

View File

@@ -21,6 +21,7 @@ package com.aurora.store.view.ui.details
import android.os.Bundle
import android.view.View
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.aurora.Constants
@@ -32,18 +33,15 @@ import com.aurora.store.databinding.FragmentGenericWithToolbarBinding
import com.aurora.store.view.epoxy.views.HeaderViewModel_
import com.aurora.store.view.epoxy.views.details.ExodusViewModel_
import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.viewmodel.details.DetailsExodusViewModel
import dagger.hilt.android.AndroidEntryPoint
import org.json.JSONObject
import javax.inject.Inject
@AndroidEntryPoint
class DetailsExodusFragment : BaseFragment<FragmentGenericWithToolbarBinding>() {
private val viewModel: DetailsExodusViewModel by viewModels()
private val args: DetailsExodusFragmentArgs by navArgs()
@Inject
lateinit var exodusTrackers: JSONObject
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -80,7 +78,7 @@ class DetailsExodusFragment : BaseFragment<FragmentGenericWithToolbarBinding>()
private fun getExodusTrackersFromReport(report: Report): List<ExodusTracker> {
val trackerObjects = report.trackers.map {
exodusTrackers.getJSONObject(it.toString())
viewModel.exodusTrackers.getJSONObject(it.toString())
}.toList()
return trackerObjects.map {

View File

@@ -22,30 +22,29 @@ package com.aurora.store.view.ui.downloads
import android.os.Bundle
import android.text.format.DateUtils
import android.view.View
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import com.aurora.Constants.GITLAB_URL
import com.aurora.extensions.browse
import com.aurora.store.R
import com.aurora.store.data.helper.DownloadHelper
import com.aurora.store.data.room.download.Download
import com.aurora.store.databinding.FragmentDownloadBinding
import com.aurora.store.view.epoxy.views.DownloadViewModel_
import com.aurora.store.view.epoxy.views.TextDividerViewModel_
import com.aurora.store.view.epoxy.views.app.NoAppViewModel_
import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.viewmodel.downloads.DownloadViewModel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import java.util.Date
import javax.inject.Inject
@AndroidEntryPoint
class DownloadFragment : BaseFragment<FragmentDownloadBinding>() {
@Inject
lateinit var downloadHelper: DownloadHelper
private val viewModel: DownloadViewModel by viewModels()
private lateinit var downloadList: List<Download>
@@ -59,19 +58,19 @@ class DownloadFragment : BaseFragment<FragmentDownloadBinding>() {
when (it.itemId) {
R.id.action_force_clear_all -> {
viewLifecycleOwner.lifecycleScope.launch(NonCancellable) {
downloadHelper.clearAllDownloads()
viewModel.downloadHelper.clearAllDownloads()
}
}
R.id.action_cancel_all -> {
viewLifecycleOwner.lifecycleScope.launch(NonCancellable) {
downloadHelper.cancelAll()
viewModel.downloadHelper.cancelAll()
}
}
R.id.action_clear_completed -> {
viewLifecycleOwner.lifecycleScope.launch(NonCancellable) {
downloadHelper.clearFinishedDownloads()
viewModel.downloadHelper.clearFinishedDownloads()
}
}
}
@@ -80,7 +79,7 @@ class DownloadFragment : BaseFragment<FragmentDownloadBinding>() {
}
viewLifecycleOwner.lifecycleScope.launch {
downloadHelper.downloadsList.collectLatest {
viewModel.downloadHelper.downloadsList.collectLatest {
downloadList = it
updateController(it.reversed())
}

View File

@@ -23,28 +23,27 @@ import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.navigation.fragment.findNavController
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.aurora.store.MobileNavigationDirections
import com.aurora.store.R
import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.databinding.FragmentAppsGamesBinding
import com.aurora.store.util.Preferences
import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.view.ui.commons.CategoryFragment
import com.aurora.store.view.ui.commons.ForYouFragment
import com.aurora.store.view.ui.commons.TopChartContainerFragment
import com.aurora.store.viewmodel.games.GamesContainerViewModel
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class GamesContainerFragment : BaseFragment<FragmentAppsGamesBinding>() {
@Inject
lateinit var authProvider: AuthProvider
private val viewModel: GamesContainerViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -77,7 +76,7 @@ class GamesContainerFragment : BaseFragment<FragmentAppsGamesBinding>() {
binding.pager.adapter = ViewPagerAdapter(
childFragmentManager,
viewLifecycleOwner.lifecycle,
!authProvider.isAnonymous,
!viewModel.authProvider.isAnonymous,
isForYouEnabled
)

View File

@@ -25,6 +25,7 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
@@ -32,7 +33,6 @@ import com.aurora.Constants
import com.aurora.extensions.areNotificationsEnabled
import com.aurora.extensions.isIgnoringBatteryOptimizations
import com.aurora.store.R
import com.aurora.store.data.helper.UpdateHelper
import com.aurora.store.data.model.UpdateMode
import com.aurora.store.data.work.CacheWorker
import com.aurora.store.databinding.FragmentOnboardingBinding
@@ -56,16 +56,15 @@ import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_EXTENDED
import com.aurora.store.util.Preferences.PREFERENCE_VENDING_VERSION
import com.aurora.store.util.save
import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.viewmodel.onboarding.OnboardingViewModel
import com.google.android.material.tabs.TabLayoutMediator
import com.jakewharton.processphoenix.ProcessPhoenix
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class OnboardingFragment : BaseFragment<FragmentOnboardingBinding>() {
@Inject
lateinit var updateHelper: UpdateHelper
private val viewModel: OnboardingViewModel by viewModels()
private var lastPosition = 0
@@ -193,6 +192,6 @@ class OnboardingFragment : BaseFragment<FragmentOnboardingBinding>() {
else -> UpdateMode.DISABLED
}
save(PREFERENCE_UPDATES_AUTO, updateMode.ordinal)
updateHelper.scheduleAutomatedCheck()
viewModel.updateHelper.scheduleAutomatedCheck()
}
}

View File

@@ -6,6 +6,7 @@ import android.app.Dialog
import android.os.Bundle
import android.view.WindowManager
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import com.aurora.extensions.showKeyboard
import com.aurora.extensions.toast
@@ -15,17 +16,15 @@ import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_PROXY_INFO
import com.aurora.store.util.Preferences.PREFERENCE_PROXY_URL
import com.aurora.store.util.save
import com.aurora.store.viewmodel.preferences.ProxyURLViewModel
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.textfield.TextInputLayout
import com.google.gson.Gson
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class ProxyURLDialog: DialogFragment() {
@Inject
lateinit var gson: Gson
private val viewModel: ProxyURLViewModel by viewModels()
private val textInputLayout: TextInputLayout?
get() = dialog?.findViewById(R.id.textInputLayout)
@@ -67,7 +66,7 @@ class ProxyURLDialog: DialogFragment() {
val proxyInfo = CommonUtil.parseProxyUrl(url)
if (proxyInfo != null) {
save(PREFERENCE_PROXY_URL, url)
save(PREFERENCE_PROXY_INFO, gson.toJson(proxyInfo))
save(PREFERENCE_PROXY_INFO, viewModel.gson.toJson(proxyInfo))
toast(R.string.toast_proxy_success)
findNavController().navigate(R.id.forceRestartDialog)
return

View File

@@ -22,12 +22,12 @@ package com.aurora.store.view.ui.preferences
import android.os.Bundle
import android.view.View
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.preference.ListPreference
import androidx.preference.SeekBarPreference
import androidx.preference.SwitchPreferenceCompat
import com.aurora.store.R
import com.aurora.store.data.helper.UpdateHelper
import com.aurora.store.data.model.PermissionType
import com.aurora.store.data.model.UpdateMode
import com.aurora.store.util.Preferences
@@ -37,14 +37,13 @@ import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_AUTO
import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_CHECK_INTERVAL
import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_EXTENDED
import com.aurora.store.util.save
import com.aurora.store.viewmodel.all.UpdatesViewModel
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class UpdatesPreference : BasePreferenceFragment() {
@Inject
lateinit var updateHelper: UpdateHelper
private val viewModel: UpdatesViewModel by viewModels()
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences_updates, rootKey)
@@ -56,7 +55,7 @@ class UpdatesPreference : BasePreferenceFragment() {
when (UpdateMode.entries[newValue.toString().toInt()]) {
UpdateMode.DISABLED -> {
updateCheckIntervalPref?.isEnabled = false
updateHelper.cancelAutomatedCheck()
viewModel.updateHelper.cancelAutomatedCheck()
requireContext().save(PREFERENCE_UPDATES_AUTO, 0)
true
}
@@ -64,14 +63,14 @@ class UpdatesPreference : BasePreferenceFragment() {
UpdateMode.CHECK_AND_NOTIFY -> {
if (permissionProvider.isGranted(PermissionType.POST_NOTIFICATIONS)) {
updateCheckIntervalPref?.isEnabled = true
updateHelper.scheduleAutomatedCheck()
viewModel.updateHelper.scheduleAutomatedCheck()
true
} else {
permissionProvider.request(PermissionType.POST_NOTIFICATIONS) {
if (it) {
updateCheckIntervalPref?.isEnabled = true
requireContext().save(PREFERENCE_UPDATES_AUTO, 1)
updateHelper.scheduleAutomatedCheck()
viewModel.updateHelper.scheduleAutomatedCheck()
activity?.recreate()
}
}
@@ -82,14 +81,14 @@ class UpdatesPreference : BasePreferenceFragment() {
UpdateMode.CHECK_AND_INSTALL -> {
if (permissionProvider.isGranted(PermissionType.DOZE_WHITELIST)) {
updateCheckIntervalPref?.isEnabled = true
updateHelper.scheduleAutomatedCheck()
viewModel.updateHelper.scheduleAutomatedCheck()
true
} else {
permissionProvider.request(PermissionType.DOZE_WHITELIST) {
if (it) {
updateCheckIntervalPref?.isEnabled = true
requireContext().save(PREFERENCE_UPDATES_AUTO, 2)
updateHelper.scheduleAutomatedCheck()
viewModel.updateHelper.scheduleAutomatedCheck()
activity?.recreate()
}
}
@@ -104,7 +103,7 @@ class UpdatesPreference : BasePreferenceFragment() {
findPreference<SeekBarPreference>(PREFERENCE_UPDATES_CHECK_INTERVAL)?.apply {
isEnabled = Preferences.getInteger(requireContext(), PREFERENCE_UPDATES_AUTO) != 0
setOnPreferenceChangeListener { _, _ ->
updateHelper.updateAutomatedCheck()
viewModel.updateHelper.updateAutomatedCheck()
true
}
}
@@ -113,21 +112,21 @@ class UpdatesPreference : BasePreferenceFragment() {
?.setOnPreferenceChangeListener { _, newValue ->
findPreference<SwitchPreferenceCompat>(PREFERENCE_FILTER_FDROID)?.isEnabled =
!newValue.toString().toBoolean()
updateHelper.checkUpdatesNow()
viewModel.updateHelper.checkUpdatesNow()
true
}
findPreference<SwitchPreferenceCompat>(PREFERENCE_FILTER_FDROID)?.apply {
isEnabled = !Preferences.getBoolean(requireContext(), PREFERENCE_FILTER_AURORA_ONLY)
setOnPreferenceChangeListener { _, _ ->
updateHelper.checkUpdatesNow()
viewModel.updateHelper.checkUpdatesNow()
true
}
}
findPreference<SwitchPreferenceCompat>(PREFERENCE_UPDATES_EXTENDED)
?.setOnPreferenceChangeListener { _, _ ->
updateHelper.checkUpdatesNow()
viewModel.updateHelper.checkUpdatesNow()
true
}
}

View File

@@ -32,12 +32,10 @@ import com.aurora.store.AuroraApp
import com.aurora.store.R
import com.aurora.store.data.event.BusEvent
import com.aurora.store.data.installer.AppInstaller
import com.aurora.store.data.providers.BlacklistProvider
import com.aurora.store.databinding.SheetAppMenuBinding
import com.aurora.store.util.PackageUtil
import com.aurora.store.viewmodel.sheets.SheetsViewModel
import com.aurora.store.viewmodel.sheets.AppMenuViewModel
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class AppMenuSheet : BaseDialogSheet<SheetAppMenuBinding>() {
@@ -46,10 +44,7 @@ class AppMenuSheet : BaseDialogSheet<SheetAppMenuBinding>() {
const val TAG = "APP_MENU_SHEET"
}
@Inject
lateinit var blacklistProvider: BlacklistProvider
private val viewModel: SheetsViewModel by viewModels()
private val viewModel: AppMenuViewModel by viewModels()
private val args: AppMenuSheetArgs by navArgs()
private val exportMimeType = "application/zip"
@@ -67,7 +62,7 @@ class AppMenuSheet : BaseDialogSheet<SheetAppMenuBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val isBlacklisted: Boolean = blacklistProvider.isBlacklisted(args.app.packageName)
val isBlacklisted: Boolean = viewModel.blacklistProvider.isBlacklisted(args.app.packageName)
with(binding.navigationView) {
//Switch strings for Add/Remove Blacklist
@@ -89,10 +84,10 @@ class AppMenuSheet : BaseDialogSheet<SheetAppMenuBinding>() {
R.id.action_blacklist -> {
if (isBlacklisted) {
blacklistProvider.whitelist(args.app.packageName)
viewModel.blacklistProvider.whitelist(args.app.packageName)
requireContext().toast(R.string.toast_apk_whitelisted)
} else {
blacklistProvider.blacklist(args.app.packageName)
viewModel.blacklistProvider.blacklist(args.app.packageName)
requireContext().toast(R.string.toast_apk_blacklisted)
}

View File

@@ -30,22 +30,20 @@ import androidx.navigation.fragment.navArgs
import com.aurora.extensions.copyToClipBoard
import com.aurora.extensions.toast
import com.aurora.store.R
import com.aurora.store.data.helper.DownloadHelper
import com.aurora.store.data.installer.AppInstaller
import com.aurora.store.data.model.DownloadStatus
import com.aurora.store.databinding.SheetDownloadMenuBinding
import com.aurora.store.util.PathUtil
import com.aurora.store.viewmodel.sheets.SheetsViewModel
import com.aurora.store.viewmodel.sheets.DownloadMenuViewModel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch
import javax.inject.Inject
@AndroidEntryPoint
class DownloadMenuSheet : BaseDialogSheet<SheetDownloadMenuBinding>() {
private val TAG = DownloadMenuSheet::class.java.simpleName
private val viewModel: SheetsViewModel by viewModels()
private val viewModel: DownloadMenuViewModel by viewModels()
private val args: DownloadMenuSheetArgs by navArgs()
private val playStoreURL = "https://play.google.com/store/apps/details?id="
@@ -61,12 +59,6 @@ class DownloadMenuSheet : BaseDialogSheet<SheetDownloadMenuBinding>() {
dismissAllowingStateLoss()
}
@Inject
lateinit var downloadHelper: DownloadHelper
@Inject
lateinit var appInstaller: AppInstaller
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -101,14 +93,14 @@ class DownloadMenuSheet : BaseDialogSheet<SheetDownloadMenuBinding>() {
R.id.action_cancel -> {
findViewTreeLifecycleOwner()?.lifecycleScope?.launch(NonCancellable) {
downloadHelper.cancelDownload(args.download.packageName)
viewModel.downloadHelper.cancelDownload(args.download.packageName)
}
dismissAllowingStateLoss()
}
R.id.action_clear -> {
findViewTreeLifecycleOwner()?.lifecycleScope?.launch(NonCancellable) {
downloadHelper.clearDownload(
viewModel.downloadHelper.clearDownload(
args.download.packageName,
args.download.versionCode
)
@@ -127,7 +119,7 @@ class DownloadMenuSheet : BaseDialogSheet<SheetDownloadMenuBinding>() {
private fun install() {
try {
appInstaller.getPreferredInstaller().install(args.download)
viewModel.appInstaller.getPreferredInstaller().install(args.download)
} catch (exception: Exception) {
Log.e(TAG, "Failed to install ${args.download.packageName}", exception)
if (exception is NullPointerException) {

View File

@@ -22,25 +22,24 @@ package com.aurora.store.view.ui.sheets
import android.content.DialogInterface
import android.os.Bundle
import android.view.View
import androidx.fragment.app.viewModels
import com.aurora.store.R
import com.aurora.store.data.model.Filter
import com.aurora.store.data.providers.FilterProvider
import com.aurora.store.databinding.SheetFilterBinding
import com.aurora.store.viewmodel.sheets.FilterViewModel
import com.google.android.material.chip.Chip
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class FilterSheet : BaseDialogSheet<SheetFilterBinding>() {
@Inject
lateinit var filterProvider: FilterProvider
private val viewModel: FilterViewModel by viewModels()
private lateinit var filter: Filter
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
filter = filterProvider.getSavedFilter()
filter = viewModel.filterProvider.getSavedFilter()
attachSingleChips()
attachMultipleChips()
@@ -48,7 +47,7 @@ class FilterSheet : BaseDialogSheet<SheetFilterBinding>() {
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
filterProvider.saveFilter(filter)
viewModel.filterProvider.saveFilter(filter)
}
private fun attachSingleChips() {

View File

@@ -32,14 +32,14 @@ import coil3.transform.RoundedCornersTransformation
import com.aurora.extensions.toast
import com.aurora.store.R
import com.aurora.store.databinding.SheetManualDownloadBinding
import com.aurora.store.viewmodel.sheets.SheetsViewModel
import com.aurora.store.viewmodel.sheets.ManualDownloadViewModel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@AndroidEntryPoint
class ManualDownloadSheet : BaseDialogSheet<SheetManualDownloadBinding>() {
private val viewModel: SheetsViewModel by viewModels()
private val viewModel: ManualDownloadViewModel by viewModels()
private val args: ManualDownloadSheetArgs by navArgs()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

View File

@@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.account
import androidx.lifecycle.ViewModel
import com.aurora.store.data.providers.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class AccountViewModel @Inject constructor(val authProvider: AuthProvider) : ViewModel()

View File

@@ -30,7 +30,7 @@ import javax.inject.Inject
@HiltViewModel
class UpdatesViewModel @Inject constructor(
private val updateHelper: UpdateHelper,
val updateHelper: UpdateHelper,
private val downloadHelper: DownloadHelper,
) : ViewModel() {

View File

@@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.apps
import androidx.lifecycle.ViewModel
import com.aurora.store.data.providers.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class AppsContainerViewModel @Inject constructor(val authProvider: AuthProvider) : ViewModel()

View File

@@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.commons
import androidx.lifecycle.ViewModel
import com.aurora.store.data.providers.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class MoreViewModel @Inject constructor(val authProvider: AuthProvider) : ViewModel()

View File

@@ -19,6 +19,7 @@ import com.aurora.store.data.helper.DownloadHelper
import com.aurora.store.data.model.ExodusReport
import com.aurora.store.data.model.PlexusReport
import com.aurora.store.data.model.Report
import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.data.room.favourite.Favourite
import com.aurora.store.data.room.favourite.FavouriteDao
import com.aurora.store.util.PackageUtil
@@ -40,6 +41,7 @@ import com.aurora.gplayapi.data.models.datasafety.Report as DataSafetyReport
@HiltViewModel
class AppDetailsViewModel @Inject constructor(
val authProvider: AuthProvider,
@ApplicationContext private val context: Context,
private val appDetailsHelper: AppDetailsHelper,
private val reviewsHelper: ReviewsHelper,

View File

@@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.details
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import org.json.JSONObject
import javax.inject.Inject
@HiltViewModel
class DetailsExodusViewModel @Inject constructor(val exodusTrackers: JSONObject) : ViewModel()

View File

@@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.downloads
import androidx.lifecycle.ViewModel
import com.aurora.store.data.helper.DownloadHelper
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class DownloadViewModel @Inject constructor(val downloadHelper: DownloadHelper) : ViewModel()

View File

@@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.games
import androidx.lifecycle.ViewModel
import com.aurora.store.data.providers.AuthProvider
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class GamesContainerViewModel @Inject constructor(val authProvider: AuthProvider) : ViewModel()

View File

@@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.onboarding
import androidx.lifecycle.ViewModel
import com.aurora.store.data.helper.UpdateHelper
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class OnboardingViewModel @Inject constructor(val updateHelper: UpdateHelper) : ViewModel()

View File

@@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.preferences
import androidx.lifecycle.ViewModel
import com.google.gson.Gson
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class ProxyURLViewModel @Inject constructor(val gson: Gson) : ViewModel()

View File

@@ -0,0 +1,23 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.sheets
import android.content.Context
import android.net.Uri
import androidx.lifecycle.ViewModel
import com.aurora.store.data.model.MinimalApp
import com.aurora.store.data.providers.BlacklistProvider
import com.aurora.store.data.work.ExportWorker
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class AppMenuViewModel @Inject constructor(val blacklistProvider: BlacklistProvider) : ViewModel() {
fun copyInstalledApp(context: Context, app: MinimalApp, uri: Uri) {
ExportWorker.exportInstalledApp(context, app, uri)
}
}

View File

@@ -0,0 +1,27 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.sheets
import android.content.Context
import android.net.Uri
import androidx.lifecycle.ViewModel
import com.aurora.store.data.helper.DownloadHelper
import com.aurora.store.data.installer.AppInstaller
import com.aurora.store.data.room.download.Download
import com.aurora.store.data.work.ExportWorker
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class DownloadMenuViewModel @Inject constructor(
val downloadHelper: DownloadHelper,
val appInstaller: AppInstaller
) : ViewModel() {
fun copyDownloadedApp(context: Context, download: Download, uri: Uri) {
ExportWorker.exportDownloadedApp(context, download, uri)
}
}

View File

@@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.sheets
import androidx.lifecycle.ViewModel
import com.aurora.store.data.providers.FilterProvider
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class FilterViewModel @Inject constructor(val filterProvider: FilterProvider) : ViewModel()

View File

@@ -1,7 +1,5 @@
package com.aurora.store.viewmodel.sheets
import android.content.Context
import android.net.Uri
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
@@ -9,9 +7,6 @@ import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.helpers.PurchaseHelper
import com.aurora.store.AuroraApp
import com.aurora.store.data.event.BusEvent
import com.aurora.store.data.model.MinimalApp
import com.aurora.store.data.room.download.Download
import com.aurora.store.data.work.ExportWorker
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -20,11 +15,11 @@ import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class SheetsViewModel @Inject constructor(
class ManualDownloadViewModel @Inject constructor(
private val purchaseHelper: PurchaseHelper
) : ViewModel() {
private val TAG = SheetsViewModel::class.java.simpleName
private val TAG = ManualDownloadViewModel::class.java.simpleName
private val _purchaseStatus = MutableSharedFlow<Boolean>()
val purchaseStatus = _purchaseStatus.asSharedFlow()
@@ -45,12 +40,4 @@ class SheetsViewModel @Inject constructor(
}
}
}
fun copyInstalledApp(context: Context, app: MinimalApp, uri: Uri) {
ExportWorker.exportInstalledApp(context, app, uri)
}
fun copyDownloadedApp(context: Context, download: Download, uri: Uri) {
ExportWorker.exportDownloadedApp(context, download, uri)
}
}