Refine microG install logic & ui states

This commit is contained in:
Rahul Patel
2025-12-24 02:28:08 +05:30
parent a68acce413
commit 75abb23b70
9 changed files with 186 additions and 47 deletions

View File

@@ -58,7 +58,7 @@ class InstallerStatusReceiver : BaseInstallerStatusReceiver() {
} }
} }
override fun postStatus(status: Int, packageName: String?, extra: String?, context: Context) { override fun postStatus(status: Int, packageName: String, extra: String?, context: Context) {
super.postStatus(status, packageName, extra, context) super.postStatus(status, packageName, extra, context)
if (::apiClient.isInitialized && apiClient.isConnected) { if (::apiClient.isInitialized && apiClient.isConnected) {

View File

@@ -5,7 +5,7 @@ import com.aurora.extensions.isHuawei
object FlavouredUtil : IFlavouredUtil { object FlavouredUtil : IFlavouredUtil {
override val defaultDispensers = emptySet() override val defaultDispensers : Set<String> = emptySet()
override fun promptMicroGInstall(context: Context): Boolean { override fun promptMicroGInstall(context: Context): Boolean {
return isHuawei && return isHuawei &&

View File

@@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.Checkbox import androidx.compose.material3.Checkbox
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@@ -32,21 +33,22 @@ import com.aurora.extensions.browse
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.compose.preview.PreviewTemplate import com.aurora.store.compose.preview.PreviewTemplate
import com.aurora.store.data.model.Link import com.aurora.store.data.model.Link
import com.aurora.store.viewmodel.onboarding.MicroGUIState
/** /**
* Composable to display suggestion to install microG * Composable to display suggestion to install microG
* @param modifier Modifier for the composable * @param modifier Modifier for the composable
* @param isTOSChecked Whether the TOS checkbox is checked
* @param onInstall Callback when user requests installing microG bundle * @param onInstall Callback when user requests installing microG bundle
*/ */
@Composable @Composable
fun MicroG( fun MicroG(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
isTOSChecked: Boolean = false, uiState: MicroGUIState,
onInstall: () -> Unit = {} onInstall: () -> Unit = {},
onCheckedChange: (Boolean) -> Unit = {}
) { ) {
val context = LocalContext.current val context = LocalContext.current
var isChecked by rememberSaveable { mutableStateOf(isTOSChecked) } var isChecked by rememberSaveable { mutableStateOf(false) }
val links = listOf( val links = listOf(
Link( Link(
id = 2, id = 2,
@@ -101,16 +103,22 @@ fun MicroG(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = dimensionResource(R.dimen.padding_xlarge)), .padding(vertical = dimensionResource(R.dimen.padding_xlarge)),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(dimensionResource(R.dimen.margin_small)) verticalArrangement = Arrangement.spacedBy(dimensionResource(R.dimen.margin_small))
) { ) {
Row( Row(
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy( horizontalArrangement = Arrangement.spacedBy(
dimensionResource(R.dimen.padding_small) dimensionResource(R.dimen.padding_small)
) ),
) { ) {
Checkbox(checked = isChecked, onCheckedChange = { isChecked = !isChecked }) Checkbox(
checked = isChecked,
onCheckedChange = {
isChecked = it
onCheckedChange(it)
},
enabled = !uiState.isInstalled && !uiState.isDownloading
)
Text( Text(
text = stringResource(R.string.onboarding_gms_agreement), text = stringResource(R.string.onboarding_gms_agreement),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
@@ -118,9 +126,21 @@ fun MicroG(
overflow = TextOverflow.Ellipsis overflow = TextOverflow.Ellipsis
) )
} }
Button(onClick = onInstall, enabled = isChecked) { Button(
onClick = onInstall,
enabled = isChecked && !uiState.isDownloading && !uiState.isInstalled,
modifier = Modifier.fillMaxWidth()
) {
Text( Text(
text = stringResource(R.string.action_install_microG) text = if (uiState.isDownloading)
stringResource(R.string.action_installing)
else
stringResource(R.string.action_install_microG)
)
}
if (uiState.isDownloading) {
LinearProgressIndicator(
modifier = Modifier.fillMaxWidth()
) )
} }
} }
@@ -131,6 +151,6 @@ fun MicroG(
@Composable @Composable
private fun MicroGPreview() { private fun MicroGPreview() {
PreviewTemplate { PreviewTemplate {
MicroG(isTOSChecked = true) MicroG(uiState = MicroGUIState())
} }
} }

View File

@@ -42,6 +42,7 @@ import com.aurora.store.compose.preview.PreviewTemplate
import com.aurora.store.data.model.PermissionType import com.aurora.store.data.model.PermissionType
import com.aurora.store.data.providers.PermissionProvider import com.aurora.store.data.providers.PermissionProvider
import com.aurora.store.viewmodel.details.AppDetailsViewModel import com.aurora.store.viewmodel.details.AppDetailsViewModel
import com.aurora.store.viewmodel.onboarding.MicroGUIState
import com.aurora.store.viewmodel.onboarding.MicroGViewModel import com.aurora.store.viewmodel.onboarding.MicroGViewModel
@Composable @Composable
@@ -61,6 +62,7 @@ fun MicroGScreen(
ScreenContent( ScreenContent(
topAppBarTitle = topAppBarTitle, topAppBarTitle = topAppBarTitle,
uiState = viewModel.uiState,
onNavigateUp = onNavigateUp, onNavigateUp = onNavigateUp,
onInstall = { viewModel.downloadMicroG() }, onInstall = { viewModel.downloadMicroG() },
onIgnore = onIgnore onIgnore = onIgnore
@@ -70,6 +72,7 @@ fun MicroGScreen(
@Composable @Composable
private fun ScreenContent( private fun ScreenContent(
topAppBarTitle: String? = null, topAppBarTitle: String? = null,
uiState: MicroGUIState = MicroGUIState(),
onNavigateUp: () -> Unit = {}, onNavigateUp: () -> Unit = {},
onInstall: () -> Unit = {}, onInstall: () -> Unit = {},
onIgnore: () -> Unit = {}, onIgnore: () -> Unit = {},
@@ -104,7 +107,8 @@ private fun ScreenContent(
else -> context.toast(R.string.permissions_denied) else -> context.toast(R.string.permissions_denied)
} }
} },
uiState = uiState
) )
Row( Row(

View File

@@ -27,17 +27,27 @@ import com.aurora.store.compose.composable.MicroG
import com.aurora.store.compose.preview.PreviewTemplate import com.aurora.store.compose.preview.PreviewTemplate
import com.aurora.store.data.model.PermissionType import com.aurora.store.data.model.PermissionType
import com.aurora.store.data.providers.PermissionProvider import com.aurora.store.data.providers.PermissionProvider
import com.aurora.store.viewmodel.onboarding.MicroGUIState
import com.aurora.store.viewmodel.onboarding.MicroGViewModel import com.aurora.store.viewmodel.onboarding.MicroGViewModel
@Composable @Composable
fun MicroGPage(viewModel: MicroGViewModel = hiltViewModel()) { fun MicroGPage(
onCheckedChange: (Boolean) -> Unit = {},
viewModel: MicroGViewModel = hiltViewModel(),
) {
ScreenContent( ScreenContent(
onInstall = { viewModel.downloadMicroG() } uiState = viewModel.uiState,
onInstall = { viewModel.downloadMicroG() },
onMicrogTOCChange = onCheckedChange,
) )
} }
@Composable @Composable
private fun ScreenContent(onInstall: () -> Unit = {}) { private fun ScreenContent(
uiState: MicroGUIState,
onInstall: () -> Unit = {},
onMicrogTOCChange: (Boolean) -> Unit = {}
) {
val context = LocalContext.current val context = LocalContext.current
Column( Column(
@@ -71,9 +81,13 @@ private fun ScreenContent(onInstall: () -> Unit = {}) {
onInstall() onInstall()
} }
else -> context.toast(R.string.permissions_denied) else -> context.toast(
R.string.permissions_denied
)
} }
} },
uiState = uiState,
onCheckedChange = onMicrogTOCChange
) )
} }
@@ -83,6 +97,8 @@ private fun ScreenContent(onInstall: () -> Unit = {}) {
@Composable @Composable
private fun MicroGPagePreview() { private fun MicroGPagePreview() {
PreviewTemplate { PreviewTemplate {
ScreenContent() ScreenContent(
uiState = MicroGUIState(),
)
} }
} }

View File

@@ -25,7 +25,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
@@ -37,22 +36,25 @@ import com.aurora.store.compose.composable.Logo
import com.aurora.store.compose.composable.PageIndicator import com.aurora.store.compose.composable.PageIndicator
import com.aurora.store.compose.preview.PreviewTemplate import com.aurora.store.compose.preview.PreviewTemplate
import com.aurora.store.compose.ui.onboarding.navigation.OnboardingPage import com.aurora.store.compose.ui.onboarding.navigation.OnboardingPage
import com.aurora.store.util.FlavouredUtil import com.aurora.store.viewmodel.onboarding.OnboardingUiState
import com.aurora.store.viewmodel.onboarding.OnboardingViewModel import com.aurora.store.viewmodel.onboarding.OnboardingViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Composable @Composable
fun OnboardingScreen(viewModel: OnboardingViewModel = hiltViewModel()) { fun OnboardingScreen(viewModel: OnboardingViewModel = hiltViewModel()) {
val context = LocalContext.current
val pages = listOfNotNull( val pages = listOfNotNull(
OnboardingPage.WELCOME, OnboardingPage.WELCOME,
OnboardingPage.PERMISSIONS, OnboardingPage.PERMISSIONS,
if (FlavouredUtil.promptMicroGInstall(context)) OnboardingPage.MICRO_G else null if (viewModel.isMicroGPromptRequired) OnboardingPage.MICRO_G else null
) )
ScreenContent( ScreenContent(
pages = pages, pages = pages,
onFinishOnboarding = { viewModel.finishOnboarding() } onFinishOnboarding = {
viewModel.finishOnboarding()
},
uiState = viewModel.uiState,
onCheckedChange = viewModel::onMicroGCheckedChange
) )
} }
@@ -60,6 +62,8 @@ fun OnboardingScreen(viewModel: OnboardingViewModel = hiltViewModel()) {
private fun ScreenContent( private fun ScreenContent(
pages: List<OnboardingPage> = emptyList(), pages: List<OnboardingPage> = emptyList(),
onFinishOnboarding: () -> Unit = {}, onFinishOnboarding: () -> Unit = {},
uiState: OnboardingUiState,
onCheckedChange: (Boolean) -> Unit,
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo()
) { ) {
val pagerState = rememberPagerState { pages.size } val pagerState = rememberPagerState { pages.size }
@@ -70,10 +74,10 @@ private fun ScreenContent(
} }
@Composable @Composable
fun SetupActions() { fun SetupActions(uiState: OnboardingUiState) {
val horizontalButtonPadding = when { val horizontalButtonPadding = when {
windowAdaptiveInfo.isWindowCompact -> dimensionResource(R.dimen.padding_medium) windowAdaptiveInfo.isWindowCompact -> dimensionResource(R.dimen.padding_medium)
else -> dimensionResource(R.dimen.padding_xlarge) else -> dimensionResource(R.dimen.padding_xlarge)
} }
Row( Row(
@@ -91,14 +95,14 @@ private fun ScreenContent(
) { ) {
val buttonWidthModifier = when { val buttonWidthModifier = when {
windowAdaptiveInfo.isWindowCompact -> Modifier.weight(1F) windowAdaptiveInfo.isWindowCompact -> Modifier.weight(1F)
else -> Modifier.widthIn(min = dimensionResource(R.dimen.width_button)) else -> Modifier.widthIn(min = dimensionResource(R.dimen.width_button))
} }
TextButton( TextButton(
modifier = buttonWidthModifier, modifier = buttonWidthModifier,
onClick = { onClick = {
when (pagerState.currentPage) { when (pagerState.currentPage) {
0 -> onFinishOnboarding() 0 -> onFinishOnboarding()
else -> { else -> {
coroutineScope.launch { coroutineScope.launch {
pagerState.animateScrollToPage(pagerState.currentPage - 1) pagerState.animateScrollToPage(pagerState.currentPage - 1)
@@ -109,7 +113,7 @@ private fun ScreenContent(
) { ) {
Text( Text(
text = when (pagerState.currentPage) { text = when (pagerState.currentPage) {
0 -> stringResource(R.string.action_skip) 0 -> stringResource(R.string.action_skip)
else -> stringResource(R.string.action_back) else -> stringResource(R.string.action_back)
}, },
maxLines = 1, maxLines = 1,
@@ -119,10 +123,11 @@ private fun ScreenContent(
Button( Button(
modifier = buttonWidthModifier, modifier = buttonWidthModifier,
enabled = !isFinalPage() || (!uiState.isMicroBundleChecked || uiState.isMicroGBundleInstalled),
onClick = { onClick = {
when { when {
isFinalPage() -> onFinishOnboarding() isFinalPage() -> onFinishOnboarding()
else -> { else -> {
coroutineScope.launch { coroutineScope.launch {
pagerState.animateScrollToPage(pagerState.currentPage + 1) pagerState.animateScrollToPage(pagerState.currentPage + 1)
} }
@@ -133,7 +138,7 @@ private fun ScreenContent(
Text( Text(
text = when { text = when {
isFinalPage() -> stringResource(R.string.action_finish) isFinalPage() -> stringResource(R.string.action_finish)
else -> stringResource(R.string.action_next) else -> stringResource(R.string.action_next)
}, },
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis overflow = TextOverflow.Ellipsis
@@ -173,14 +178,14 @@ private fun ScreenContent(
verticalAlignment = Alignment.Top verticalAlignment = Alignment.Top
) { page -> ) { page ->
when (pages[page]) { when (pages[page]) {
OnboardingPage.WELCOME -> WelcomePage() OnboardingPage.WELCOME -> WelcomePage()
OnboardingPage.PERMISSIONS -> PermissionsPage() OnboardingPage.PERMISSIONS -> PermissionsPage()
OnboardingPage.MICRO_G -> MicroGPage() OnboardingPage.MICRO_G -> MicroGPage(onCheckedChange = onCheckedChange)
} }
} }
} }
SetupActions() SetupActions(uiState)
} }
} }
} }
@@ -190,7 +195,9 @@ private fun ScreenContent(
private fun OnboardingScreenPreview() { private fun OnboardingScreenPreview() {
PreviewTemplate { PreviewTemplate {
ScreenContent( ScreenContent(
pages = listOf(OnboardingPage.WELCOME, OnboardingPage.PERMISSIONS) pages = listOf(OnboardingPage.WELCOME, OnboardingPage.PERMISSIONS),
uiState = OnboardingUiState(),
onCheckedChange = {}
) )
} }
} }

View File

@@ -5,31 +5,60 @@
package com.aurora.store.viewmodel.onboarding package com.aurora.store.viewmodel.onboarding
import android.content.Context
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.aurora.Constants.PACKAGE_NAME_GMS import com.aurora.Constants.PACKAGE_NAME_GMS
import com.aurora.Constants.PACKAGE_NAME_PLAY_STORE import com.aurora.Constants.PACKAGE_NAME_PLAY_STORE
import com.aurora.gplayapi.data.models.PlayFile import com.aurora.gplayapi.data.models.PlayFile
import com.aurora.store.AuroraApp
import com.aurora.store.data.event.InstallerEvent
import com.aurora.store.data.helper.DownloadHelper import com.aurora.store.data.helper.DownloadHelper
import com.aurora.store.data.room.suite.ExternalApk import com.aurora.store.data.room.suite.ExternalApk
import com.aurora.store.util.PackageUtil
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
data class MicroGUIState(
var isDownloading: Boolean = false,
var isInstalled: Boolean = false
)
@HiltViewModel @HiltViewModel
class MicroGViewModel @Inject constructor( class MicroGViewModel @Inject constructor(
@ApplicationContext
private val context: Context,
private val downloadHelper: DownloadHelper private val downloadHelper: DownloadHelper
) : ViewModel() { ) : ViewModel() {
companion object { companion object {
private const val MICROG_DOWNLOAD_URL = private const val MICROG_DOWNLOAD_URL =
"https://github.com/microg/GmsCore/releases/download" "https://github.com/microg/GmsCore/releases/download"
private const val MICROG_VERSION = "v0.3.6.244735" private const val MICROG_VERSION = "v0.3.11.250932"
private const val GMS_VERSION_CODE = 244735012 private const val GMS_VERSION_CODE = 250932022
private const val COMPANION_VERSION_CODE = 84022612 private const val COMPANION_VERSION_CODE = 84022622
} }
init {
AuroraApp.events.installerEvent.onEach {
when (it) {
is InstallerEvent.Installed -> confirmBundleInstall(it.packageName)
else -> {}
}
}.launchIn(AuroraApp.scope)
}
var uiState: MicroGUIState by mutableStateOf(MicroGUIState())
private set
private val microGServiceApk = ExternalApk( private val microGServiceApk = ExternalApk(
packageName = PACKAGE_NAME_GMS, packageName = PACKAGE_NAME_GMS,
versionCode = GMS_VERSION_CODE.toLong(), versionCode = GMS_VERSION_CODE.toLong(),
@@ -41,8 +70,8 @@ class MicroGViewModel @Inject constructor(
PlayFile( PlayFile(
url = "$MICROG_DOWNLOAD_URL/$MICROG_VERSION/$PACKAGE_NAME_GMS-$GMS_VERSION_CODE-hw.apk", url = "$MICROG_DOWNLOAD_URL/$MICROG_VERSION/$PACKAGE_NAME_GMS-$GMS_VERSION_CODE-hw.apk",
name = "$PACKAGE_NAME_GMS-$GMS_VERSION_CODE-hw.apk", name = "$PACKAGE_NAME_GMS-$GMS_VERSION_CODE-hw.apk",
size = 32509431, size = 92386474,
sha256 = "2f14df2974811b576bfafa6167a97e3b3032f2bd6e6ec3887a833fd2fa350dda" sha256 = "2894a93544a8d7ca8f6ca96e7cc697647a7e0862165b6a02f8cd26822759b9cc"
) )
) )
) )
@@ -58,16 +87,33 @@ class MicroGViewModel @Inject constructor(
PlayFile( PlayFile(
url = "$MICROG_DOWNLOAD_URL/$MICROG_VERSION/$PACKAGE_NAME_PLAY_STORE-$COMPANION_VERSION_CODE-hw.apk", url = "$MICROG_DOWNLOAD_URL/$MICROG_VERSION/$PACKAGE_NAME_PLAY_STORE-$COMPANION_VERSION_CODE-hw.apk",
name = "$PACKAGE_NAME_PLAY_STORE-$COMPANION_VERSION_CODE-hw.apk", name = "$PACKAGE_NAME_PLAY_STORE-$COMPANION_VERSION_CODE-hw.apk",
size = 3915551, size = 4626291,
sha256 = "6835b09016cef0fc3469b4a36b1720427ad3f81161cf20b188f0dadb5f8594e1" sha256 = "b9623b8da8791c7e887efca941434b20e517c8a42ca4fda713625957edcc84eb"
) )
) )
) )
fun downloadMicroG() { fun downloadMicroG() {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
downloadHelper.enqueueStandalone(microGServiceApk) if (microGCompanionApk.isInstalled(context)) {
downloadHelper.enqueueStandalone(microGCompanionApk) AuroraApp.events.send(InstallerEvent.Installed(PACKAGE_NAME_PLAY_STORE))
} else {
downloadHelper.enqueueStandalone(microGCompanionApk)
uiState = uiState.copy(isDownloading = true)
}
if (microGServiceApk.isInstalled(context)) {
AuroraApp.events.send(InstallerEvent.Installed(PACKAGE_NAME_GMS))
} else {
downloadHelper.enqueueStandalone(microGServiceApk)
uiState = uiState.copy(isDownloading = true)
}
}
}
fun confirmBundleInstall(packageName: String) {
if (PackageUtil.isMicroGBundleInstalled(context)) {
uiState = uiState.copy(isInstalled = true, isDownloading = false)
} }
} }
} }

View File

@@ -7,13 +7,23 @@ package com.aurora.store.viewmodel.onboarding
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import com.aurora.Constants.PACKAGE_NAME_GMS
import com.aurora.Constants.PACKAGE_NAME_PLAY_STORE
import com.aurora.extensions.areNotificationsEnabled import com.aurora.extensions.areNotificationsEnabled
import com.aurora.extensions.isIgnoringBatteryOptimizations import com.aurora.extensions.isIgnoringBatteryOptimizations
import com.aurora.store.AuroraApp
import com.aurora.store.BuildConfig
import com.aurora.store.data.event.InstallerEvent
import com.aurora.store.data.helper.UpdateHelper 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.providers.BlacklistProvider
import com.aurora.store.data.work.CacheWorker import com.aurora.store.data.work.CacheWorker
import com.aurora.store.util.FlavouredUtil import com.aurora.store.util.FlavouredUtil
import com.aurora.store.util.PackageUtil
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_AUTO_DELETE import com.aurora.store.util.Preferences.PREFERENCE_AUTO_DELETE
import com.aurora.store.util.Preferences.PREFERENCE_DEFAULT_SELECTED_TAB import com.aurora.store.util.Preferences.PREFERENCE_DEFAULT_SELECTED_TAB
@@ -32,19 +42,51 @@ import com.aurora.store.util.save
import com.jakewharton.processphoenix.ProcessPhoenix import com.jakewharton.processphoenix.ProcessPhoenix
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import javax.inject.Inject import javax.inject.Inject
data class OnboardingUiState(
val isMicroBundleChecked: Boolean = false,
val isMicroGBundleInstalled: Boolean = false
)
@HiltViewModel @HiltViewModel
class OnboardingViewModel @Inject constructor( class OnboardingViewModel @Inject constructor(
val updateHelper: UpdateHelper, val updateHelper: UpdateHelper,
val blacklistProvider: BlacklistProvider,
@ApplicationContext private val context: Context @ApplicationContext private val context: Context
) : ViewModel() { ) : ViewModel() {
private val TAG = OnboardingViewModel::class.java.simpleName private val TAG = OnboardingViewModel::class.java.simpleName
val isMicroGPromptRequired = FlavouredUtil.promptMicroGInstall(context)
var uiState by mutableStateOf(OnboardingUiState())
private set
fun onMicroGCheckedChange(value: Boolean) {
uiState = uiState.copy(isMicroBundleChecked = value)
}
init {
AuroraApp.events.installerEvent.onEach {
when (it) {
is InstallerEvent.Installed -> confirmBundleInstall()
else -> {}
}
}.launchIn(AuroraApp.scope)
}
fun finishOnboarding() { fun finishOnboarding() {
Log.i(TAG, "Finishing onboarding with defaults") Log.i(TAG, "Finishing onboarding with defaults")
context.saveDefaultPreferences() context.saveDefaultPreferences()
if (BuildConfig.FLAVOR == "huawei") {
blacklistProvider.blacklist(PACKAGE_NAME_GMS)
blacklistProvider.blacklist(PACKAGE_NAME_PLAY_STORE)
}
setupAutoUpdates() setupAutoUpdates()
CacheWorker.scheduleAutomatedCacheCleanup(context) CacheWorker.scheduleAutomatedCacheCleanup(context)
Preferences.putBooleanNow(context, PREFERENCE_INTRO, true) Preferences.putBooleanNow(context, PREFERENCE_INTRO, true)
@@ -53,6 +95,12 @@ class OnboardingViewModel @Inject constructor(
ProcessPhoenix.triggerRebirth(context) ProcessPhoenix.triggerRebirth(context)
} }
private fun confirmBundleInstall() {
if (PackageUtil.isMicroGBundleInstalled(context)) {
uiState = uiState.copy(isMicroGBundleInstalled = true)
}
}
private fun setupAutoUpdates() { private fun setupAutoUpdates() {
val updateMode = when { val updateMode = when {
context.isIgnoringBatteryOptimizations() -> UpdateMode.CHECK_AND_INSTALL context.isIgnoringBatteryOptimizations() -> UpdateMode.CHECK_AND_INSTALL

View File

@@ -24,9 +24,7 @@ dependencyResolutionManagement {
} }
// Only included in huawei variants // Only included in huawei variants
maven("https://developer.huawei.com/repo/") { maven("https://developer.huawei.com/repo/") {
content {
includeModule("com.huawei.hms", "ag-coreservice")
}
} }
} }
} }