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
This commit is contained in:
Arc Wang
2021-08-31 18:11:57 +08:00
parent ebdc0e26f6
commit 22ce392b91
4 changed files with 142 additions and 24 deletions

View File

@@ -58,6 +58,8 @@ import com.android.settings.core.SettingsBaseActivity;
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 @@ public class SettingsActivity extends SettingsBaseActivity
// 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 @@ public class SettingsActivity extends SettingsBaseActivity
}
}
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) {