diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e4e8831f4..f8d09bd91 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -496,6 +496,13 @@ + + + + + () + .setExpedited(RUN_AS_NON_EXPEDITED_WORK_REQUEST) + .setInputData(data) + .build() + WorkManager.getInstance(context) + .enqueue(request) + } + } + + override suspend fun doWork(): Result { + val packageName = inputData.getString(EXTRA_UNARCHIVE_PACKAGE_NAME) + ?: error("No packageName") + val unarchiveId = inputData.getInt(EXTRA_UNARCHIVE_ID, -1) + val allUsers = inputData.getBoolean(EXTRA_UNARCHIVE_ALL_USERS, false) + + Log.i(TAG, "$packageName $unarchiveId $allUsers") + + // get archived PackageInfo + val pm = applicationContext.packageManager + + @SuppressLint("WrongConstant") // not sure why MATCH_ARCHIVED_PACKAGES is considered wrong + val packageInfo = + pm.getPackageInfo(packageName, PackageInfoFlags.of(MATCH_ARCHIVED_PACKAGES)) + + // find suggested version for that app + val db = DBHelper.getDb(applicationContext) + val updateChecker = DbUpdateChecker(db, pm) + val appPrefs = db.getAppPrefsDao().getAppPrefs(packageName).asFlow().first() + val version = updateChecker.getSuggestedVersion( + packageName = packageName, + // TODO we could try to get the old signer (if still available) and search for the same + preferredSigner = null, + releaseChannels = appPrefs.releaseChannels, + onlyFromPreferredRepo = true, + ) + // install version, if available + return if (version == null) { + Log.e(TAG, "Could not find a version to unarchive for $packageName") + Result.failure() + } else { + // get all the objects our InstallManagerService requires + val repoManager = FDroidApp.getRepoManager(applicationContext) + // repos may not have loaded yet, so we use the flow and wait for repos to be ready + val repo = repoManager.repositoriesState.first().find { it.repoId == version.repoId } + val dbApp = db.getAppDao().getApp(version.repoId, packageName) + val app = App(dbApp, packageInfo) + val apk = Apk(version, repo) + // fire off installation, should happen automatically from here on + InstallManagerService.queue(applicationContext, app, apk) + Result.success() + } + } + +} diff --git a/gradle.properties b/gradle.properties index f38266a3c..a063a8cf3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -org.gradle.jvmargs=-Xms1g -Xmx2g +org.gradle.jvmargs=-Xms2g -Xmx4g android.enableJetifier=false android.useAndroidX=true