From 566266a3b6aca037171ff3d40ade47af7867e13c Mon Sep 17 00:00:00 2001 From: Karl Dimla Date: Thu, 27 Feb 2025 16:59:10 +0100 Subject: [PATCH] Add support for pir in DuckDuckGoApplication --- .../app/global/DuckDuckGoApplication.kt | 34 +++++++++++++------ .../app/global/MultiProcessApplication.kt | 20 +++++++---- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt b/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt index 5271a4a1584c..2061673901a8 100644 --- a/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt +++ b/app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt @@ -39,6 +39,7 @@ import kotlinx.coroutines.* import timber.log.Timber private const val VPN_PROCESS_NAME = "vpn" +private const val PIR_PROCESS_NAME = "pir" open class DuckDuckGoApplication : HasDaggerInjector, MultiProcessApplication() { @@ -110,6 +111,13 @@ open class DuckDuckGoApplication : HasDaggerInjector, MultiProcessApplication() } } } + + runInSecondaryProcessNamed(PIR_PROCESS_NAME) { + configureLogging() + Timber.d("Init for secondary process $shortProcessName with pid=${android.os.Process.myPid()}") + configureStrictMode() + configureDependencyInjection() + } } private fun setupActivityLifecycleCallbacks() { @@ -171,12 +179,15 @@ open class DuckDuckGoApplication : HasDaggerInjector, MultiProcessApplication() mode: Int, ): File { val dir = super.getDir(name, mode) - runInSecondaryProcessNamed(VPN_PROCESS_NAME) { + if (!isMainProcess) { if (name == "webview") { - return File("${dir.absolutePath}/vpn").apply { - Timber.d(":vpn process getDir = $absolutePath") - if (!exists()) { - mkdirs() + val processName = shortProcessName + if (processName != "UNKNOWN") { + return File("${dir.absolutePath}/$processName").apply { + Timber.d(":$processName process getDir = $absolutePath") + if (!exists()) { + mkdirs() + } } } } @@ -186,11 +197,14 @@ open class DuckDuckGoApplication : HasDaggerInjector, MultiProcessApplication() override fun getCacheDir(): File { val dir = super.getCacheDir() - runInSecondaryProcessNamed(VPN_PROCESS_NAME) { - return File("${dir.absolutePath}/vpn").apply { - Timber.d(":vpn process getCacheDir = $absolutePath") - if (!exists()) { - mkdirs() + if (!isMainProcess) { + val processName = shortProcessName + if (processName != "UNKNOWN") { + return File("${dir.absolutePath}/$processName").apply { + Timber.d(":$processName process getCacheDir = $absolutePath") + if (!exists()) { + mkdirs() + } } } } diff --git a/app/src/main/java/com/duckduckgo/app/global/MultiProcessApplication.kt b/app/src/main/java/com/duckduckgo/app/global/MultiProcessApplication.kt index ea930da6caf9..8faabbedb134 100644 --- a/app/src/main/java/com/duckduckgo/app/global/MultiProcessApplication.kt +++ b/app/src/main/java/com/duckduckgo/app/global/MultiProcessApplication.kt @@ -23,9 +23,7 @@ import android.os.Build import android.os.Process abstract class MultiProcessApplication : Application() { - private val shortProcessName: String by lazy { - currentProcessName?.substringAfter(delimiter = packageName, missingDelimiterValue = "UNKNOWN") ?: "UNKNOWN" - } + private val shortProcessNameCached: String by lazy { shortProcessName } private val isMainProcessCached: Boolean by lazy { isMainProcess } final override fun onCreate() { @@ -33,7 +31,7 @@ abstract class MultiProcessApplication : Application() { if (isMainProcessCached) { onMainProcessCreate() } else { - onSecondaryProcessCreate(shortProcessName) + onSecondaryProcessCreate(shortProcessNameCached) } } @@ -42,17 +40,27 @@ abstract class MultiProcessApplication : Application() { open fun onSecondaryProcessCreate(shortProcessName: String) {} } +inline val Application.shortProcessName: String + get() = currentProcessName?.substringAfter(delimiter = "$packageName:", missingDelimiterValue = "UNKNOWN") ?: "UNKNOWN" + inline val Application.isMainProcess: Boolean get() = packageName == currentProcessName -inline fun Context.runInSecondaryProcessNamed(name: String, block: () -> Unit) { +inline fun Context.runInSecondaryProcessNamed( + name: String, + block: () -> Unit, +) { if (currentProcessName == "$packageName:$name") { block() } } val Context.currentProcessName: String? - get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { Application.getProcessName() } else { processNameFromSystemService() } + get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + Application.getProcessName() + } else { + processNameFromSystemService() + } private fun Context.processNameFromSystemService(): String { val am = this.getSystemService(Application.ACTIVITY_SERVICE) as ActivityManager?