From 434d285732099f009362b97e33447e70ade76f92 Mon Sep 17 00:00:00 2001 From: Rahul Patel Date: Wed, 24 Dec 2025 15:09:23 +0530 Subject: [PATCH] use microGInstaller if available & minor ui state fix --- .../5.json | 27 +++++++++---------- app/src/main/java/com/aurora/Constants.kt | 5 ++++ .../compose/ui/details/AppDetailsScreen.kt | 2 +- .../store/compose/ui/details/MicroGScreen.kt | 21 ++++++++++----- .../store/data/installer/AppInstaller.kt | 4 +++ .../aurora/store/data/room/MigrationHelper.kt | 21 +++++++++++++++ .../com/aurora/store/data/room/RoomModule.kt | 3 ++- .../store/data/room/download/Download.kt | 7 +++-- .../aurora/store/data/work/DownloadWorker.kt | 21 +++++++++++---- .../onboarding/OnboardingViewModel.kt | 3 ++- 10 files changed, 83 insertions(+), 31 deletions(-) diff --git a/app/schemas/com.aurora.store.data.room.AuroraDatabase/5.json b/app/schemas/com.aurora.store.data.room.AuroraDatabase/5.json index 9dcbe5a0f..cee2b2277 100644 --- a/app/schemas/com.aurora.store.data.room.AuroraDatabase/5.json +++ b/app/schemas/com.aurora.store.data.room.AuroraDatabase/5.json @@ -2,11 +2,11 @@ "formatVersion": 1, "database": { "version": 5, - "identityHash": "d5da6e54113409ba811bafebc85632e6", + "identityHash": "82935f33f6fe476bd752dd3643095d69", "entities": [ { "tableName": "download", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`packageName` TEXT NOT NULL, `versionCode` INTEGER NOT NULL, `offerType` INTEGER NOT NULL, `isInstalled` INTEGER NOT NULL, `displayName` TEXT NOT NULL, `iconURL` TEXT NOT NULL, `size` INTEGER NOT NULL, `id` INTEGER NOT NULL, `downloadStatus` TEXT NOT NULL, `progress` INTEGER NOT NULL, `speed` INTEGER NOT NULL, `timeRemaining` INTEGER NOT NULL, `totalFiles` INTEGER NOT NULL, `downloadedFiles` INTEGER NOT NULL, `fileList` TEXT NOT NULL, `sharedLibs` TEXT NOT NULL, `targetSdk` INTEGER NOT NULL, `downloadedAt` INTEGER NOT NULL, PRIMARY KEY(`packageName`))", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`packageName` TEXT NOT NULL, `versionCode` INTEGER NOT NULL, `offerType` INTEGER NOT NULL, `isInstalled` INTEGER NOT NULL, `displayName` TEXT NOT NULL, `iconURL` TEXT NOT NULL, `size` INTEGER NOT NULL, `id` INTEGER NOT NULL, `downloadStatus` TEXT NOT NULL, `progress` INTEGER NOT NULL, `speed` INTEGER NOT NULL, `timeRemaining` INTEGER NOT NULL, `totalFiles` INTEGER NOT NULL, `downloadedFiles` INTEGER NOT NULL, `fileList` TEXT NOT NULL, `sharedLibs` TEXT NOT NULL, `targetSdk` INTEGER NOT NULL, `downloadedAt` INTEGER NOT NULL, `requiresGMS` INTEGER NOT NULL, PRIMARY KEY(`packageName`))", "fields": [ { "fieldPath": "packageName", @@ -57,7 +57,7 @@ "notNull": true }, { - "fieldPath": "downloadStatus", + "fieldPath": "status", "columnName": "downloadStatus", "affinity": "TEXT", "notNull": true @@ -115,6 +115,12 @@ "columnName": "downloadedAt", "affinity": "INTEGER", "notNull": true + }, + { + "fieldPath": "requiresGMS", + "columnName": "requiresGMS", + "affinity": "INTEGER", + "notNull": true } ], "primaryKey": { @@ -122,9 +128,7 @@ "columnNames": [ "packageName" ] - }, - "indices": [], - "foreignKeys": [] + } }, { "tableName": "favourite", @@ -166,9 +170,7 @@ "columnNames": [ "packageName" ] - }, - "indices": [], - "foreignKeys": [] + } }, { "tableName": "update", @@ -270,15 +272,12 @@ "columnNames": [ "packageName" ] - }, - "indices": [], - "foreignKeys": [] + } } ], - "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd5da6e54113409ba811bafebc85632e6')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '82935f33f6fe476bd752dd3643095d69')" ] } } \ No newline at end of file diff --git a/app/src/main/java/com/aurora/Constants.kt b/app/src/main/java/com/aurora/Constants.kt index 7945f2034..cd9270005 100644 --- a/app/src/main/java/com/aurora/Constants.kt +++ b/app/src/main/java/com/aurora/Constants.kt @@ -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" } diff --git a/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt index a7195a194..683337284 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/details/AppDetailsScreen.kt @@ -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( diff --git a/app/src/main/java/com/aurora/store/compose/ui/details/MicroGScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/details/MicroGScreen.kt index fd1057fdc..5228f2582 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/details/MicroGScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/details/MicroGScreen.kt @@ -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) } diff --git a/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt index 91105ec67..72b54cda1 100644 --- a/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt @@ -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 diff --git a/app/src/main/java/com/aurora/store/data/room/MigrationHelper.kt b/app/src/main/java/com/aurora/store/data/room/MigrationHelper.kt index a5dffd411..57725012e 100644 --- a/app/src/main/java/com/aurora/store/data/room/MigrationHelper.kt +++ b/app/src/main/java/com/aurora/store/data/room/MigrationHelper.kt @@ -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() + } + } } diff --git a/app/src/main/java/com/aurora/store/data/room/RoomModule.kt b/app/src/main/java/com/aurora/store/data/room/RoomModule.kt index 00cffc0bd..652cdddd0 100644 --- a/app/src/main/java/com/aurora/store/data/room/RoomModule.kt +++ b/app/src/main/java/com/aurora/store/data/room/RoomModule.kt @@ -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() } diff --git a/app/src/main/java/com/aurora/store/data/room/download/Download.kt b/app/src/main/java/com/aurora/store/data/room/download/Download.kt index 62fbed92d..7f40ade9d 100644 --- a/app/src/main/java/com/aurora/store/data/room/download/Download.kt +++ b/app/src/main/java/com/aurora/store/data/room/download/Download.kt @@ -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, val sharedLibs: List, 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() ) } diff --git a/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt b/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt index 4f2ee4092..c7edcb139 100644 --- a/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt +++ b/app/src/main/java/com/aurora/store/data/work/DownloadWorker.kt @@ -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( diff --git a/app/src/main/java/com/aurora/store/viewmodel/onboarding/OnboardingViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/onboarding/OnboardingViewModel.kt index 3eabfa2a4..0753102dc 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/onboarding/OnboardingViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/onboarding/OnboardingViewModel.kt @@ -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) }