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 android.view.View
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat.Type.displayCutout import androidx.core.view.WindowInsetsCompat.Type.displayCutout
@@ -34,30 +35,23 @@ import androidx.navigation.FloatingWindow
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupWithNavController import androidx.navigation.ui.setupWithNavController
import com.aurora.extensions.isNAndAbove import com.aurora.extensions.isNAndAbove
import com.aurora.store.data.helper.UpdateHelper
import com.aurora.store.data.model.NetworkStatus import com.aurora.store.data.model.NetworkStatus
import com.aurora.store.data.receiver.MigrationReceiver import com.aurora.store.data.receiver.MigrationReceiver
import com.aurora.store.databinding.ActivityMainBinding import com.aurora.store.databinding.ActivityMainBinding
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_DEFAULT_SELECTED_TAB import com.aurora.store.util.Preferences.PREFERENCE_DEFAULT_SELECTED_TAB
import com.aurora.store.view.ui.sheets.NetworkDialogSheet import com.aurora.store.view.ui.sheets.NetworkDialogSheet
import com.aurora.store.data.providers.NetworkProvider
import com.aurora.store.util.PackageUtil import com.aurora.store.util.PackageUtil
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
@AndroidEntryPoint @AndroidEntryPoint
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
@Inject private val viewModel: MainViewModel by viewModels()
lateinit var networkProvider: NetworkProvider
@Inject
lateinit var updateHelper: UpdateHelper
private lateinit var B: ActivityMainBinding private lateinit var B: ActivityMainBinding
@@ -91,7 +85,7 @@ class MainActivity : AppCompatActivity() {
val navController = navHostFragment.navController val navController = navHostFragment.navController
if (isNAndAbove && !PackageUtil.isTv(this)) { if (isNAndAbove && !PackageUtil.isTv(this)) {
networkProvider.status.onEach { networkStatus -> viewModel.networkProvider.status.onEach { networkStatus ->
when (networkStatus) { when (networkStatus) {
NetworkStatus.AVAILABLE -> { NetworkStatus.AVAILABLE -> {
if (!supportFragmentManager.isDestroyed && isIntroDone()) { if (!supportFragmentManager.isDestroyed && isIntroDone()) {
@@ -152,7 +146,7 @@ class MainActivity : AppCompatActivity() {
// Updates // Updates
lifecycleScope.launch { lifecycleScope.launch {
updateHelper.updates.collectLatest { list -> viewModel.updateHelper.updates.collectLatest { list ->
B.navView.getOrCreateBadge(R.id.updatesFragment).apply { B.navView.getOrCreateBadge(R.id.updatesFragment).apply {
isVisible = !list.isNullOrEmpty() isVisible = !list.isNullOrEmpty()
number = list?.size ?: 0 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.os.Bundle
import android.view.View import android.view.View
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import coil3.load import coil3.load
import coil3.request.placeholder import coil3.request.placeholder
@@ -31,17 +32,15 @@ import com.aurora.Constants.URL_LICENSE
import com.aurora.Constants.URL_TOS import com.aurora.Constants.URL_TOS
import com.aurora.extensions.browse import com.aurora.extensions.browse
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.databinding.FragmentAccountBinding import com.aurora.store.databinding.FragmentAccountBinding
import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.viewmodel.account.AccountViewModel
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class AccountFragment : BaseFragment<FragmentAccountBinding>() { class AccountFragment : BaseFragment<FragmentAccountBinding>() {
@Inject private val viewModel: AccountViewModel by viewModels()
lateinit var authProvider: AuthProvider
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@@ -56,15 +55,16 @@ class AccountFragment : BaseFragment<FragmentAccountBinding>() {
binding.chipTos.setOnClickListener { browse(URL_TOS) } binding.chipTos.setOnClickListener { browse(URL_TOS) }
} }
authProvider.authData?.userProfile?.let { viewModel.authProvider.authData?.userProfile?.let {
val avatar = if (authProvider.isAnonymous) R.mipmap.ic_launcher else it.artwork.url val avatar =
if (viewModel.authProvider.isAnonymous) R.mipmap.ic_launcher else it.artwork.url
binding.imgAvatar.load(avatar) { binding.imgAvatar.load(avatar) {
placeholder(R.drawable.bg_placeholder) placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(32F)) 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 = 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 { binding.btnLogout.addOnClickListener {

View File

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

View File

@@ -48,6 +48,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.compose.ui.util.fastForEach import androidx.compose.ui.util.fastForEach
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import coil3.compose.AsyncImage import coil3.compose.AsyncImage
import coil3.request.ImageRequest import coil3.request.ImageRequest
@@ -59,18 +60,16 @@ import com.aurora.extensions.getStyledAttributeColor
import com.aurora.extensions.setAppTheme import com.aurora.extensions.setAppTheme
import com.aurora.store.MR import com.aurora.store.MR
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
import com.aurora.store.view.theme.AuroraTheme import com.aurora.store.view.theme.AuroraTheme
import com.aurora.store.viewmodel.commons.MoreViewModel
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class MoreDialogFragment : DialogFragment() { class MoreDialogFragment : DialogFragment() {
@Inject private val viewModel: MoreViewModel by viewModels()
lateinit var authProvider: AuthProvider
private var primaryColor: Color = Color.White private var primaryColor: Color = Color.White
private var onPrimaryColor: Color = Color.Black private var onPrimaryColor: Color = Color.Black
@@ -240,10 +239,10 @@ class MoreDialogFragment : DialogFragment() {
AsyncImage( AsyncImage(
model = ImageRequest.Builder(LocalContext.current) model = ImageRequest.Builder(LocalContext.current)
.data( .data(
if (authProvider.isAnonymous) { if (viewModel.authProvider.isAnonymous) {
R.mipmap.ic_launcher R.mipmap.ic_launcher
} else { } else {
authProvider.authData?.userProfile?.artwork?.url viewModel.authProvider.authData?.userProfile?.artwork?.url
} }
) )
.crossfade(true) .crossfade(true)
@@ -260,10 +259,10 @@ class MoreDialogFragment : DialogFragment() {
horizontalAlignment = Alignment.Start horizontalAlignment = Alignment.Start
) { ) {
Text( Text(
text = if (authProvider.isAnonymous) { text = if (viewModel.authProvider.isAnonymous) {
stringResource(R.string.account_anonymous) stringResource(R.string.account_anonymous)
} else { } else {
authProvider.authData?.userProfile?.name viewModel.authProvider.authData?.userProfile?.name
?: stringResource(R.string.status_unavailable) ?: stringResource(R.string.status_unavailable)
}, },
fontWeight = FontWeight.Normal, fontWeight = FontWeight.Normal,
@@ -273,10 +272,10 @@ class MoreDialogFragment : DialogFragment() {
overflow = TextOverflow.Ellipsis overflow = TextOverflow.Ellipsis
) )
Text( Text(
text = if (authProvider.isAnonymous) { text = if (viewModel.authProvider.isAnonymous) {
stringResource(R.string.account_anonymous_email) stringResource(R.string.account_anonymous_email)
} else { } else {
authProvider.authData?.userProfile?.email viewModel.authProvider.authData?.userProfile?.email
?: stringResource(R.string.status_unavailable) ?: stringResource(R.string.status_unavailable)
}, },
fontWeight = FontWeight.Light, 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.PermissionType
import com.aurora.store.data.model.ViewState import com.aurora.store.data.model.ViewState
import com.aurora.store.data.model.ViewState.Loading.getDataAs 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.databinding.FragmentDetailsBinding
import com.aurora.store.util.CertUtil import com.aurora.store.util.CertUtil
import com.aurora.store.util.CommonUtil import com.aurora.store.util.CommonUtil
@@ -94,7 +93,6 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.Locale import java.util.Locale
import javax.inject.Inject
import com.aurora.gplayapi.data.models.datasafety.Report as DataSafetyReport import com.aurora.gplayapi.data.models.datasafety.Report as DataSafetyReport
@AndroidEntryPoint @AndroidEntryPoint
@@ -105,9 +103,6 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
private val args: AppDetailsFragmentArgs by navArgs() private val args: AppDetailsFragmentArgs by navArgs()
@Inject
lateinit var authProvider: AuthProvider
private lateinit var app: App private lateinit var app: App
private lateinit var iconDrawable: Drawable private lateinit var iconDrawable: Drawable
@@ -198,7 +193,7 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
// App User Review // App User Review
// We can not fetch it outside of this block, as we need the testing program status // 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) viewModel.fetchUserAppReview(app)
} }
@@ -680,7 +675,7 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
} }
binding.layoutDetailsApp.btnPrimaryAction.setOnClickListener { binding.layoutDetailsApp.btnPrimaryAction.setOnClickListener {
if (authProvider.isAnonymous && !app.isFree) { if (viewModel.authProvider.isAnonymous && !app.isFree) {
toast(R.string.toast_purchase_blocked) toast(R.string.toast_purchase_blocked)
return@setOnClickListener return@setOnClickListener
} else if (app.versionCode == 0) { } else if (app.versionCode == 0) {
@@ -744,7 +739,7 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
updateAppPermission(app) updateAppPermission(app)
// Allow users to handle beta subscriptions, if logged in by own account. // 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 // Update app name to the testing program name, if subscribed
app.testingProgram?.let { app.testingProgram?.let {
if (it.isAvailable && it.isSubscribed) { if (it.isAvailable && it.isSubscribed) {
@@ -853,7 +848,7 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
private fun updateUserReview(review: Review? = null) { private fun updateUserReview(review: Review? = null) {
binding.layoutDetailsReview.apply { binding.layoutDetailsReview.apply {
layoutUserReview.isVisible = !authProvider.isAnonymous layoutUserReview.isVisible = !viewModel.authProvider.isAnonymous
btnPostReview.setOnClickListener { btnPostReview.setOnClickListener {
viewModel.postAppReview( viewModel.postAppReview(
app.packageName, app.packageName,

View File

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

View File

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

View File

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

View File

@@ -25,6 +25,7 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
@@ -32,7 +33,6 @@ import com.aurora.Constants
import com.aurora.extensions.areNotificationsEnabled import com.aurora.extensions.areNotificationsEnabled
import com.aurora.extensions.isIgnoringBatteryOptimizations import com.aurora.extensions.isIgnoringBatteryOptimizations
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.helper.UpdateHelper
import com.aurora.store.data.model.UpdateMode import com.aurora.store.data.model.UpdateMode
import com.aurora.store.data.work.CacheWorker import com.aurora.store.data.work.CacheWorker
import com.aurora.store.databinding.FragmentOnboardingBinding 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.Preferences.PREFERENCE_VENDING_VERSION
import com.aurora.store.util.save import com.aurora.store.util.save
import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.view.ui.commons.BaseFragment
import com.aurora.store.viewmodel.onboarding.OnboardingViewModel
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import com.jakewharton.processphoenix.ProcessPhoenix import com.jakewharton.processphoenix.ProcessPhoenix
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class OnboardingFragment : BaseFragment<FragmentOnboardingBinding>() { class OnboardingFragment : BaseFragment<FragmentOnboardingBinding>() {
@Inject private val viewModel: OnboardingViewModel by viewModels()
lateinit var updateHelper: UpdateHelper
private var lastPosition = 0 private var lastPosition = 0
@@ -193,6 +192,6 @@ class OnboardingFragment : BaseFragment<FragmentOnboardingBinding>() {
else -> UpdateMode.DISABLED else -> UpdateMode.DISABLED
} }
save(PREFERENCE_UPDATES_AUTO, updateMode.ordinal) 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.os.Bundle
import android.view.WindowManager import android.view.WindowManager
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.aurora.extensions.showKeyboard import com.aurora.extensions.showKeyboard
import com.aurora.extensions.toast 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_INFO
import com.aurora.store.util.Preferences.PREFERENCE_PROXY_URL import com.aurora.store.util.Preferences.PREFERENCE_PROXY_URL
import com.aurora.store.util.save 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.dialog.MaterialAlertDialogBuilder
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
import com.google.gson.Gson
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class ProxyURLDialog: DialogFragment() { class ProxyURLDialog: DialogFragment() {
@Inject private val viewModel: ProxyURLViewModel by viewModels()
lateinit var gson: Gson
private val textInputLayout: TextInputLayout? private val textInputLayout: TextInputLayout?
get() = dialog?.findViewById(R.id.textInputLayout) get() = dialog?.findViewById(R.id.textInputLayout)
@@ -67,7 +66,7 @@ class ProxyURLDialog: DialogFragment() {
val proxyInfo = CommonUtil.parseProxyUrl(url) val proxyInfo = CommonUtil.parseProxyUrl(url)
if (proxyInfo != null) { if (proxyInfo != null) {
save(PREFERENCE_PROXY_URL, url) 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) toast(R.string.toast_proxy_success)
findNavController().navigate(R.id.forceRestartDialog) findNavController().navigate(R.id.forceRestartDialog)
return return

View File

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

View File

@@ -32,12 +32,10 @@ import com.aurora.store.AuroraApp
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.event.BusEvent import com.aurora.store.data.event.BusEvent
import com.aurora.store.data.installer.AppInstaller import com.aurora.store.data.installer.AppInstaller
import com.aurora.store.data.providers.BlacklistProvider
import com.aurora.store.databinding.SheetAppMenuBinding import com.aurora.store.databinding.SheetAppMenuBinding
import com.aurora.store.util.PackageUtil 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 dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class AppMenuSheet : BaseDialogSheet<SheetAppMenuBinding>() { class AppMenuSheet : BaseDialogSheet<SheetAppMenuBinding>() {
@@ -46,10 +44,7 @@ class AppMenuSheet : BaseDialogSheet<SheetAppMenuBinding>() {
const val TAG = "APP_MENU_SHEET" const val TAG = "APP_MENU_SHEET"
} }
@Inject private val viewModel: AppMenuViewModel by viewModels()
lateinit var blacklistProvider: BlacklistProvider
private val viewModel: SheetsViewModel by viewModels()
private val args: AppMenuSheetArgs by navArgs() private val args: AppMenuSheetArgs by navArgs()
private val exportMimeType = "application/zip" private val exportMimeType = "application/zip"
@@ -67,7 +62,7 @@ class AppMenuSheet : BaseDialogSheet<SheetAppMenuBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val isBlacklisted: Boolean = blacklistProvider.isBlacklisted(args.app.packageName) val isBlacklisted: Boolean = viewModel.blacklistProvider.isBlacklisted(args.app.packageName)
with(binding.navigationView) { with(binding.navigationView) {
//Switch strings for Add/Remove Blacklist //Switch strings for Add/Remove Blacklist
@@ -89,10 +84,10 @@ class AppMenuSheet : BaseDialogSheet<SheetAppMenuBinding>() {
R.id.action_blacklist -> { R.id.action_blacklist -> {
if (isBlacklisted) { if (isBlacklisted) {
blacklistProvider.whitelist(args.app.packageName) viewModel.blacklistProvider.whitelist(args.app.packageName)
requireContext().toast(R.string.toast_apk_whitelisted) requireContext().toast(R.string.toast_apk_whitelisted)
} else { } else {
blacklistProvider.blacklist(args.app.packageName) viewModel.blacklistProvider.blacklist(args.app.packageName)
requireContext().toast(R.string.toast_apk_blacklisted) 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.copyToClipBoard
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.aurora.store.R 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.data.model.DownloadStatus
import com.aurora.store.databinding.SheetDownloadMenuBinding import com.aurora.store.databinding.SheetDownloadMenuBinding
import com.aurora.store.util.PathUtil 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 dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class DownloadMenuSheet : BaseDialogSheet<SheetDownloadMenuBinding>() { class DownloadMenuSheet : BaseDialogSheet<SheetDownloadMenuBinding>() {
private val TAG = DownloadMenuSheet::class.java.simpleName 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 args: DownloadMenuSheetArgs by navArgs()
private val playStoreURL = "https://play.google.com/store/apps/details?id=" private val playStoreURL = "https://play.google.com/store/apps/details?id="
@@ -61,12 +59,6 @@ class DownloadMenuSheet : BaseDialogSheet<SheetDownloadMenuBinding>() {
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
@Inject
lateinit var downloadHelper: DownloadHelper
@Inject
lateinit var appInstaller: AppInstaller
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@@ -101,14 +93,14 @@ class DownloadMenuSheet : BaseDialogSheet<SheetDownloadMenuBinding>() {
R.id.action_cancel -> { R.id.action_cancel -> {
findViewTreeLifecycleOwner()?.lifecycleScope?.launch(NonCancellable) { findViewTreeLifecycleOwner()?.lifecycleScope?.launch(NonCancellable) {
downloadHelper.cancelDownload(args.download.packageName) viewModel.downloadHelper.cancelDownload(args.download.packageName)
} }
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
R.id.action_clear -> { R.id.action_clear -> {
findViewTreeLifecycleOwner()?.lifecycleScope?.launch(NonCancellable) { findViewTreeLifecycleOwner()?.lifecycleScope?.launch(NonCancellable) {
downloadHelper.clearDownload( viewModel.downloadHelper.clearDownload(
args.download.packageName, args.download.packageName,
args.download.versionCode args.download.versionCode
) )
@@ -127,7 +119,7 @@ class DownloadMenuSheet : BaseDialogSheet<SheetDownloadMenuBinding>() {
private fun install() { private fun install() {
try { try {
appInstaller.getPreferredInstaller().install(args.download) viewModel.appInstaller.getPreferredInstaller().install(args.download)
} catch (exception: Exception) { } catch (exception: Exception) {
Log.e(TAG, "Failed to install ${args.download.packageName}", exception) Log.e(TAG, "Failed to install ${args.download.packageName}", exception)
if (exception is NullPointerException) { if (exception is NullPointerException) {

View File

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

View File

@@ -32,14 +32,14 @@ import coil3.transform.RoundedCornersTransformation
import com.aurora.extensions.toast import com.aurora.extensions.toast
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.SheetManualDownloadBinding 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 dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@AndroidEntryPoint @AndroidEntryPoint
class ManualDownloadSheet : BaseDialogSheet<SheetManualDownloadBinding>() { class ManualDownloadSheet : BaseDialogSheet<SheetManualDownloadBinding>() {
private val viewModel: SheetsViewModel by viewModels() private val viewModel: ManualDownloadViewModel by viewModels()
private val args: ManualDownloadSheetArgs by navArgs() private val args: ManualDownloadSheetArgs by navArgs()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 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 @HiltViewModel
class UpdatesViewModel @Inject constructor( class UpdatesViewModel @Inject constructor(
private val updateHelper: UpdateHelper, val updateHelper: UpdateHelper,
private val downloadHelper: DownloadHelper, private val downloadHelper: DownloadHelper,
) : ViewModel() { ) : 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.ExodusReport
import com.aurora.store.data.model.PlexusReport import com.aurora.store.data.model.PlexusReport
import com.aurora.store.data.model.Report 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.Favourite
import com.aurora.store.data.room.favourite.FavouriteDao import com.aurora.store.data.room.favourite.FavouriteDao
import com.aurora.store.util.PackageUtil import com.aurora.store.util.PackageUtil
@@ -40,6 +41,7 @@ import com.aurora.gplayapi.data.models.datasafety.Report as DataSafetyReport
@HiltViewModel @HiltViewModel
class AppDetailsViewModel @Inject constructor( class AppDetailsViewModel @Inject constructor(
val authProvider: AuthProvider,
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val appDetailsHelper: AppDetailsHelper, private val appDetailsHelper: AppDetailsHelper,
private val reviewsHelper: ReviewsHelper, 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 package com.aurora.store.viewmodel.sheets
import android.content.Context
import android.net.Uri
import android.util.Log import android.util.Log
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
@@ -9,9 +7,6 @@ import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.helpers.PurchaseHelper import com.aurora.gplayapi.helpers.PurchaseHelper
import com.aurora.store.AuroraApp import com.aurora.store.AuroraApp
import com.aurora.store.data.event.BusEvent 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 dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
@@ -20,11 +15,11 @@ import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
class SheetsViewModel @Inject constructor( class ManualDownloadViewModel @Inject constructor(
private val purchaseHelper: PurchaseHelper private val purchaseHelper: PurchaseHelper
) : ViewModel() { ) : ViewModel() {
private val TAG = SheetsViewModel::class.java.simpleName private val TAG = ManualDownloadViewModel::class.java.simpleName
private val _purchaseStatus = MutableSharedFlow<Boolean>() private val _purchaseStatus = MutableSharedFlow<Boolean>()
val purchaseStatus = _purchaseStatus.asSharedFlow() 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)
}
} }