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