Refine microG install logic & ui states
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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 &&
|
||||||
|
|||||||
@@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 = {}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user