Let SpaBridgeActivity support ActivityEmbedding

Move the multi pane shared logic into EmbeddedDeepLinkUtils.

Fix: 309075424
Test: manual - with SpaActivity
Test: unit tests
Test: m RunSettingsRoboTests ROBOTEST_FILTER=".*\.SettingsActivityTest"
Change-Id: I8c41c801b8a5009a3959c85b784ed9739d947a70
This commit is contained in:
Chaohui Wang
2023-11-03 17:48:35 +08:00
parent 005c47f19c
commit 0d338cd1df
12 changed files with 355 additions and 179 deletions

View File

@@ -16,18 +16,14 @@
package com.android.settings.spa
import android.app.ActivityManager
import android.content.Context
import android.content.Intent
import android.os.RemoteException
import android.os.UserHandle
import android.util.Log
import androidx.annotation.VisibleForTesting
import com.android.settings.spa.app.appinfo.AppInfoSettingsProvider
import com.android.settingslib.spa.framework.BrowseActivity
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.util.SESSION_BROWSE
import com.android.settingslib.spa.framework.util.SESSION_EXTERNAL
import com.android.settingslib.spa.framework.util.appendSpaParams
import com.google.android.setupcompat.util.WizardManagerHelper
@@ -44,7 +40,7 @@ class SpaActivity : BrowseActivity() {
@VisibleForTesting
fun Context.isSuwAndPageBlocked(name: String): Boolean =
if (name in SuwBlockedPages && !WizardManagerHelper.isDeviceProvisioned(this)) {
Log.w(TAG, "$name blocked before SUW completed.");
Log.w(TAG, "$name blocked before SUW completed.")
true
} else {
false
@@ -54,29 +50,8 @@ class SpaActivity : BrowseActivity() {
fun Context.startSpaActivity(destination: String) {
val intent = Intent(this, SpaActivity::class.java)
.appendSpaParams(destination = destination)
if (isLaunchedFromInternal()) {
intent.appendSpaParams(sessionName = SESSION_BROWSE)
} else {
intent.appendSpaParams(sessionName = SESSION_EXTERNAL)
}
.appendSpaParams(sessionName = SESSION_BROWSE)
startActivity(intent)
}
@JvmStatic
fun Context.startSpaActivityForApp(destinationPrefix: String, intent: Intent): Boolean {
val packageName = intent.data?.schemeSpecificPart ?: return false
startSpaActivity("$destinationPrefix/$packageName/${UserHandle.myUserId()}")
return true
}
fun Context.isLaunchedFromInternal(): Boolean {
var pkg: String? = null
try {
pkg = ActivityManager.getService().getLaunchedFromPackage(getActivityToken())
} catch (e: RemoteException) {
Log.v(TAG, "Could not talk to activity manager.", e)
}
return applicationContext.packageName == pkg
}
}
}

View File

@@ -17,9 +17,11 @@
package com.android.settings.spa
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import com.android.settings.spa.SpaActivity.Companion.startSpaActivityForApp
import android.os.UserHandle
import com.android.settings.spa.SpaBridgeActivity.Companion.getDestination
import com.android.settings.spa.SpaBridgeActivity.Companion.startSpaActivityFromBridge
/**
* Activity used as a bridge to [SpaActivity] with package scheme for application usage.
@@ -31,9 +33,18 @@ import com.android.settings.spa.SpaBridgeActivity.Companion.getDestination
class SpaAppBridgeActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
getDestination()?.let { destination ->
startSpaActivityForApp(destination, intent)
getDestination()?.let { destinationPrefix ->
getDestinationForApp(destinationPrefix, intent)?.let { destination ->
startSpaActivityFromBridge(destination)
}
}
finish()
}
companion object {
fun getDestinationForApp(destinationPrefix: String, intent: Intent): String? {
val packageName = intent.data?.schemeSpecificPart ?: return null
return "$destinationPrefix/$packageName/${UserHandle.myUserId()}"
}
}
}

View File

@@ -17,10 +17,15 @@
package com.android.settings.spa
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.content.pm.PackageManager.ComponentInfoFlags
import android.os.Bundle
import com.android.settings.spa.SpaActivity.Companion.startSpaActivity
import androidx.annotation.VisibleForTesting
import com.android.settings.activityembedding.ActivityEmbeddingUtils
import com.android.settings.activityembedding.EmbeddedDeepLinkUtils.tryStartMultiPaneDeepLink
import com.android.settingslib.spa.framework.util.SESSION_EXTERNAL
import com.android.settingslib.spa.framework.util.appendSpaParams
/**
* Activity used as a bridge to [SpaActivity].
@@ -33,17 +38,28 @@ class SpaBridgeActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
getDestination()?.let { destination ->
startSpaActivity(destination)
startSpaActivityFromBridge(destination)
}
finish()
}
companion object {
fun Activity.startSpaActivityFromBridge(destination: String) {
val intent = Intent(this, SpaActivity::class.java)
.appendSpaParams(destination = destination)
.appendSpaParams(sessionName = SESSION_EXTERNAL)
if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this) ||
!tryStartMultiPaneDeepLink(intent)) {
startActivity(intent)
}
}
fun Activity.getDestination(): String? =
packageManager.getActivityInfo(
componentName, ComponentInfoFlags.of(PackageManager.GET_META_DATA.toLong())
).metaData.getString(META_DATA_KEY_DESTINATION)
private const val META_DATA_KEY_DESTINATION = "com.android.settings.spa.DESTINATION"
@VisibleForTesting
const val META_DATA_KEY_DESTINATION = "com.android.settings.spa.DESTINATION"
}
}