2 panes deep link for large screen devices
This change supports deep link to Settings app internal pages
and external pages outside Settings app.
Apps need android.permission.ALLOW_TWO_PANES_DEEP_LINK_IN_SETTINGS
to send the intent of Settings#ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK.
Settings app will startActivity for the intent from
Settings#EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI.
Bug: 197048599
Test: build pass
Change-Id: Idaf4a8be4603c1308f16fb4e378266c1e52acb40
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index f3cdd6c..178892e 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -58,6 +58,8 @@
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.gateway.SettingsGateway;
import com.android.settings.dashboard.DashboardFeatureProvider;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
+import com.android.settings.homepage.SettingsHomepageActivity;
import com.android.settings.homepage.TopLevelSettings;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wfd.WifiDisplaySettings;
@@ -240,7 +242,22 @@
// Should happen before any call to getIntent()
getMetaData();
+ // If it's a deep link intent, start the Activity from SettingsHomepageActivity for 2-pane.
final Intent intent = getIntent();
+ final boolean isFromSettingsHomepage = intent.getBooleanExtra(
+ SettingsHomepageActivity.EXTRA_IS_FROM_SETTINGS_HOMEPAGE, /* defaultValue */ false);
+ if (ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this) && !isFromSettingsHomepage
+ && isOnlyOneActivityInActivityStack()) {
+ final Intent trampolineIntent =
+ new Intent(android.provider.Settings.ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK);
+ trampolineIntent.putExtra(
+ android.provider.Settings.EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI,
+ intent.toUri(Intent.URI_INTENT_SCHEME));
+ startActivity(trampolineIntent);
+ finish();
+ return;
+ }
+
if (intent.hasExtra(EXTRA_UI_OPTIONS)) {
getWindow().setUiOptions(intent.getIntExtra(EXTRA_UI_OPTIONS, 0));
}
@@ -347,6 +364,12 @@
}
}
+ private boolean isOnlyOneActivityInActivityStack() {
+ final ActivityManager activityManager = getSystemService(ActivityManager.class);
+ List<ActivityManager.RunningTaskInfo> taskList = activityManager.getRunningTasks(2);
+ return taskList.get(0).numActivities == 1;
+ }
+
/** Returns the initial fragment name that the activity will launch. */
@VisibleForTesting
public String getInitialFragmentName(Intent intent) {