use microGInstaller if available & minor ui state fix

This commit is contained in:
Rahul Patel
2025-12-24 15:09:23 +05:30
parent dd7f495e26
commit 434d285732
10 changed files with 83 additions and 31 deletions

View File

@@ -69,4 +69,9 @@ object Constants {
const val PACKAGE_NAME_GMS = "com.google.android.gms"
const val PACKAGE_NAME_PLAY_STORE = "com.android.vending"
const val PACKAGE_NAME_APP_GALLERY = "com.huawei.appmarket"
// FLAVOURS
const val FLAVOUR_VANILLA = "vanilla"
const val FLAVOUR_HUAWEI = "huawei"
const val FLAVOUR_PRELOAD = "preload"
}

View File

@@ -492,7 +492,7 @@ private fun ScreenContentApp(
is ExtraScreen.MicroG -> MicroGScreen(
packageName = app.packageName,
onNavigateUp = ::onNavigateBack,
onIgnore = { onInstall(ignoreMicroG = true) }
onIgnore = { onInstall(ignoreMicroG = it) }
)
is Screen.DevProfile -> DevProfileScreen(

View File

@@ -49,7 +49,7 @@ import com.aurora.store.viewmodel.onboarding.MicroGViewModel
fun MicroGScreen(
packageName: String,
onNavigateUp: () -> Unit,
onIgnore: () -> Unit,
onIgnore: (Boolean) -> Unit,
appDetailsViewModel: AppDetailsViewModel = hiltViewModel(key = packageName),
viewModel: MicroGViewModel = hiltViewModel(),
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo()
@@ -57,7 +57,7 @@ fun MicroGScreen(
val app by appDetailsViewModel.app.collectAsStateWithLifecycle()
val topAppBarTitle = when {
windowAdaptiveInfo.isWindowCompact -> app!!.displayName
else -> stringResource(R.string.onboarding_title_gsf)
else -> stringResource(R.string.onboarding_title_gsf)
}
ScreenContent(
@@ -75,7 +75,7 @@ private fun ScreenContent(
uiState: MicroGUIState = MicroGUIState(),
onNavigateUp: () -> Unit = {},
onInstall: () -> Unit = {},
onIgnore: () -> Unit = {},
onIgnore: (Boolean) -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo()
) {
val context = LocalContext.current
@@ -101,7 +101,10 @@ private fun ScreenContent(
modifier = Modifier.weight(1F),
onInstall = {
when {
PermissionProvider.isGranted(context, PermissionType.INSTALL_UNKNOWN_APPS) -> {
PermissionProvider.isGranted(
context,
PermissionType.INSTALL_UNKNOWN_APPS
) -> {
onInstall()
}
@@ -128,10 +131,14 @@ private fun ScreenContent(
Button(
modifier = Modifier.weight(1F),
onClick = onIgnore
onClick = { onIgnore(uiState.isInstalled) },
enabled = !uiState.isDownloading
) {
Text(
text = stringResource(R.string.action_ignore),
text = if (uiState.isInstalled)
stringResource(R.string.action_install)
else
stringResource(R.string.action_ignore),
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
@@ -143,7 +150,7 @@ private fun ScreenContent(
@Preview
@Composable
private fun MicroGScreenPreview(@PreviewParameter(AppPreviewProvider ::class) app: App) {
private fun MicroGScreenPreview(@PreviewParameter(AppPreviewProvider::class) app: App) {
PreviewTemplate {
ScreenContent(topAppBarTitle = app.displayName)
}

View File

@@ -166,6 +166,10 @@ class AppInstaller @Inject constructor(
private val defaultInstaller: IInstaller
get() = sessionInstaller
fun getMicroGInstaller(): IInstaller {
return microGInstaller
}
fun getPreferredInstaller(): IInstaller {
return when (getCurrentInstaller(context)) {
Installer.SESSION -> sessionInstaller

View File

@@ -26,6 +26,10 @@ object MigrationHelper {
override fun migrate(db: SupportSQLiteDatabase) = migrateFrom4To5(db)
}
val MIGRATION_5_6 = object : Migration(5, 6) {
override fun migrate(db: SupportSQLiteDatabase) = migrateFrom5To6(db)
}
private const val TAG = "MigrationHelper"
private fun migrateFrom1To2(database: SupportSQLiteDatabase) {
@@ -83,4 +87,21 @@ object MigrationHelper {
database.endTransaction()
}
}
/**
* Add requiresGMS column to download table for checking if app requires GMS to install.
*/
private fun migrateFrom5To6(database: SupportSQLiteDatabase) {
database.beginTransaction()
try {
database.execSQL(
"ALTER TABLE `download` ADD COLUMN requiresGMS INTEGER NOT NULL DEFAULT 0"
)
database.setTransactionSuccessful()
} catch (exception: Exception) {
Log.e(TAG, "Failed while migrating from database version 5 to 6", exception)
} finally {
database.endTransaction()
}
}
}

View File

@@ -6,6 +6,7 @@ import com.aurora.store.data.room.MigrationHelper.MIGRATION_1_2
import com.aurora.store.data.room.MigrationHelper.MIGRATION_2_3
import com.aurora.store.data.room.MigrationHelper.MIGRATION_3_4
import com.aurora.store.data.room.MigrationHelper.MIGRATION_4_5
import com.aurora.store.data.room.MigrationHelper.MIGRATION_5_6
import com.aurora.store.data.room.download.DownloadConverter
import com.aurora.store.data.room.download.DownloadDao
import com.aurora.store.data.room.favourite.FavouriteDao
@@ -30,7 +31,7 @@ object RoomModule {
downloadConverter: DownloadConverter
): AuroraDatabase {
return Room.databaseBuilder(context, AuroraDatabase::class.java, DATABASE)
.addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5)
.addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, MIGRATION_5_6)
.addTypeConverter(downloadConverter)
.build()
}

View File

@@ -5,6 +5,7 @@ import android.os.Parcelable
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.aurora.extensions.requiresGMS
import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.PlayFile
import com.aurora.store.data.model.DownloadStatus
@@ -35,7 +36,8 @@ data class Download(
var fileList: List<PlayFile>,
val sharedLibs: List<SharedLib>,
val targetSdk: Int = 1,
val downloadedAt: Long = 0
val downloadedAt: Long = 0,
val requiresGMS: Boolean = false
) : Parcelable {
val isFinished get() = status in DownloadStatus.finished
val isRunning get() = status in DownloadStatus.running
@@ -61,7 +63,8 @@ data class Download(
app.fileList.filterNot { it.url.isBlank() },
app.dependencies.dependentLibraries.map { SharedLib.fromApp(it) },
app.targetSdk,
Date().time
Date().time,
app.requiresGMS()
)
}

View File

@@ -19,7 +19,9 @@ import androidx.work.ForegroundInfo
import androidx.work.WorkInfo.Companion.STOP_REASON_CANCELLED_BY_APP
import androidx.work.WorkInfo.Companion.STOP_REASON_USER
import androidx.work.WorkerParameters
import com.aurora.Constants.FLAVOUR_HUAWEI
import com.aurora.extensions.copyTo
import com.aurora.extensions.isHuawei
import com.aurora.extensions.isPAndAbove
import com.aurora.extensions.isQAndAbove
import com.aurora.extensions.isSAndAbove
@@ -28,6 +30,7 @@ import com.aurora.gplayapi.data.models.PlayFile
import com.aurora.gplayapi.helpers.PurchaseHelper
import com.aurora.gplayapi.network.IHttpClient
import com.aurora.store.AuroraApp
import com.aurora.store.BuildConfig
import com.aurora.store.R
import com.aurora.store.data.event.InstallerEvent
import com.aurora.store.data.helper.DownloadHelper
@@ -40,7 +43,9 @@ import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.data.room.download.Download
import com.aurora.store.data.room.download.DownloadDao
import com.aurora.store.util.CertUtil
import com.aurora.store.util.FlavouredUtil
import com.aurora.store.util.NotificationUtil
import com.aurora.store.util.PackageUtil
import com.aurora.store.util.PathUtil
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
@@ -88,8 +93,11 @@ class DownloadWorker @AssistedInject constructor(
inner class NoNetworkException : Exception(context.getString(R.string.title_no_network))
inner class NothingToDownloadException : Exception(context.getString(R.string.purchase_no_file))
inner class DownloadFailedException : Exception(context.getString(R.string.download_failed))
inner class DownloadCancelledException : Exception(context.getString(R.string.download_canceled))
inner class VerificationFailedException : Exception(context.getString(R.string.verification_failed))
inner class DownloadCancelledException :
Exception(context.getString(R.string.download_canceled))
inner class VerificationFailedException :
Exception(context.getString(R.string.verification_failed))
override suspend fun doWork(): Result {
super.doWork()
@@ -198,7 +206,10 @@ class DownloadWorker @AssistedInject constructor(
private suspend fun onSuccess(): Result {
return withContext(NonCancellable) {
return@withContext try {
appInstaller.getPreferredInstaller().install(download)
if (BuildConfig.FLAVOR == FLAVOUR_HUAWEI && download.requiresGMS && PackageUtil.hasMicroGCompanion(context))
appInstaller.getMicroGInstaller().install(download)
else
appInstaller.getPreferredInstaller().install(download)
Result.success()
} catch (exception: Exception) {
Log.e(TAG, "Failed to install ${download.packageName}", exception)
@@ -220,7 +231,7 @@ class DownloadWorker @AssistedInject constructor(
notifyStatus(DownloadStatus.CANCELLED)
}
else -> {
else -> {
notifyStatus(status = DownloadStatus.FAILED, exception = exception)
AuroraApp.events.send(
InstallerEvent.Failed(
@@ -410,7 +421,7 @@ class DownloadWorker @AssistedInject constructor(
downloadDao.updateProgress(download.packageName, 100, 0, 0)
}
else -> {}
else -> {}
}
val notification = NotificationUtil.getDownloadNotification(

View File

@@ -11,6 +11,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import com.aurora.Constants.FLAVOUR_HUAWEI
import com.aurora.Constants.PACKAGE_NAME_GMS
import com.aurora.Constants.PACKAGE_NAME_PLAY_STORE
import com.aurora.extensions.areNotificationsEnabled
@@ -82,7 +83,7 @@ class OnboardingViewModel @Inject constructor(
Log.i(TAG, "Finishing onboarding with defaults")
context.saveDefaultPreferences()
if (BuildConfig.FLAVOR == "huawei") {
if (BuildConfig.FLAVOR == FLAVOUR_HUAWEI) {
blacklistProvider.blacklist(PACKAGE_NAME_GMS)
blacklistProvider.blacklist(PACKAGE_NAME_PLAY_STORE)
}