From 177573c892192c3294f7c8fcc36407b3752cb688 Mon Sep 17 00:00:00 2001 From: Jason Chiu Date: Thu, 2 Dec 2021 14:26:24 +0800 Subject: [PATCH] Enhance Settings deep link transition Since the deep link mechanism uses a trampoline activity to redirect the target activity, and the targeting activity is launched in a separate task, there will be two transitions played, where one is the splash screen with the trampoline acitvity and another one is the task transition. This makes the UX weird. To avoid this, this CL tries to make the targeting activity launch in the same task as the trampoline acitivity by removing the taskAffinity, so there won't be a task transition. Fix: 215275940 Test: Create a settings shortcut on the home screen and launch it. Change-Id: I7621ab9f1132acbf619495801a3b985c5c3b1b5d --- AndroidManifest.xml | 7 +++---- res/values/themes.xml | 2 +- src/com/android/settings/SettingsActivity.java | 13 ++++++++----- .../ActivityEmbeddingRulesController.java | 10 +++------- .../settings/homepage/DeepLinkHomepageActivity.java | 2 +- ...y.java => DeepLinkHomepageActivityInternal.java} | 7 +++++-- .../settings/homepage/SettingsHomepageActivity.java | 2 +- .../settings/search/SearchResultTrampoline.java | 2 ++ 8 files changed, 24 insertions(+), 21 deletions(-) rename src/com/android/settings/homepage/{SliceDeepLinkHomepageActivity.java => DeepLinkHomepageActivityInternal.java} (76%) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 164d42e5ffb..7768406f6e8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -154,8 +154,7 @@ - ?attr/colorPrimaryDark - diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index d258cc2fcc3..4e2088ed8fe 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -65,8 +65,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.homepage.DeepLinkHomepageActivityInternal; import com.android.settings.homepage.SettingsHomepageActivity; -import com.android.settings.homepage.SliceDeepLinkHomepageActivity; import com.android.settings.homepage.TopLevelSettings; import com.android.settings.overlay.FeatureFactory; import com.android.settings.wfd.WifiDisplaySettings; @@ -254,7 +254,7 @@ public class SettingsActivity extends SettingsBaseActivity final Intent intent = getIntent(); if (shouldShowTwoPaneDeepLink(intent) && tryStartTwoPaneDeepLink(intent)) { - finishAndRemoveTask(); + finish(); super.onCreate(savedState); return; } @@ -421,7 +421,7 @@ public class SettingsActivity extends SettingsBaseActivity mHighlightMenuKey = highlightMenuKey; } trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey); - trampolineIntent.setClass(this, SliceDeepLinkHomepageActivity.class); + trampolineIntent.setClass(this, DeepLinkHomepageActivityInternal.class); } else { trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey); } @@ -440,8 +440,11 @@ public class SettingsActivity extends SettingsBaseActivity return false; } - // If the activity is not the task root, it should not start trampoline for deep links. - if (!isTaskRoot()) { + // If the activity is task root, starting trampoline is needed in order to show two-pane UI. + // If FLAG_ACTIVITY_NEW_TASK is set, the activity will become the start of a new task on + // this history stack, so starting trampoline is needed in order to notify the homepage that + // the highlight key is changed. + if (!isTaskRoot() && (intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { return false; } diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java index 3ca81685d14..ad0d4eab03f 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java @@ -41,8 +41,8 @@ import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal; import com.android.settings.core.FeatureFlags; import com.android.settings.homepage.DeepLinkHomepageActivity; +import com.android.settings.homepage.DeepLinkHomepageActivityInternal; import com.android.settings.homepage.SettingsHomepageActivity; -import com.android.settings.homepage.SliceDeepLinkHomepageActivity; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.users.AvatarPickerActivity; @@ -106,9 +106,7 @@ public class ActivityEmbeddingRulesController { } /** - * Register a new SplitPairRule for Settings home. Because homepage is able to be opened by - * {@link Settings} or {@link SettingsHomepageActivity} or - * {@link SliceDeepLinkHomepageActivity}, we register split rule for above cases. + * Registers a {@link SplitPairRule} for all classes that Settings homepage can be invoked from. */ public static void registerTwoPanePairRuleForSettingsHome(Context context, ComponentName secondaryComponent, @@ -151,7 +149,7 @@ public class ActivityEmbeddingRulesController { registerTwoPanePairRule( context, - new ComponentName(context, SliceDeepLinkHomepageActivity.class), + new ComponentName(context, DeepLinkHomepageActivityInternal.class), secondaryComponent, secondaryIntentAction, finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, @@ -202,8 +200,6 @@ public class ActivityEmbeddingRulesController { private void registerHomepagePlaceholderRule() { final Set activityFilters = new HashSet<>(); addActivityFilter(activityFilters, SettingsHomepageActivity.class); - addActivityFilter(activityFilters, DeepLinkHomepageActivity.class); - addActivityFilter(activityFilters, SliceDeepLinkHomepageActivity.class); addActivityFilter(activityFilters, Settings.class); final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class); diff --git a/src/com/android/settings/homepage/DeepLinkHomepageActivity.java b/src/com/android/settings/homepage/DeepLinkHomepageActivity.java index 59cfc3c8d35..fce7b66e597 100644 --- a/src/com/android/settings/homepage/DeepLinkHomepageActivity.java +++ b/src/com/android/settings/homepage/DeepLinkHomepageActivity.java @@ -16,6 +16,6 @@ package com.android.settings.homepage; -/** Activity for other apps to launch Settings deep link page */ +/** Activity for other apps to launch a Settings deep link page */ public class DeepLinkHomepageActivity extends SettingsHomepageActivity { } diff --git a/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java b/src/com/android/settings/homepage/DeepLinkHomepageActivityInternal.java similarity index 76% rename from src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java rename to src/com/android/settings/homepage/DeepLinkHomepageActivityInternal.java index 2ea8a83219e..7a206a14c6f 100644 --- a/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java +++ b/src/com/android/settings/homepage/DeepLinkHomepageActivityInternal.java @@ -16,6 +16,9 @@ package com.android.settings.homepage; -/** Activity for Slices to launch Settings deep link page */ -public class SliceDeepLinkHomepageActivity extends SettingsHomepageActivity { +/** + * Activity used for search results and slices to launch a deep link page without the cross-app + * transition animation + */ +public class DeepLinkHomepageActivityInternal extends SettingsHomepageActivity { } diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 3ed305eff23..7aeea114c39 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -344,7 +344,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements } if (!(this instanceof DeepLinkHomepageActivity - || this instanceof SliceDeepLinkHomepageActivity)) { + || this instanceof DeepLinkHomepageActivityInternal)) { Log.e(TAG, "Not a deep link component"); finish(); return; diff --git a/src/com/android/settings/search/SearchResultTrampoline.java b/src/com/android/settings/search/SearchResultTrampoline.java index ab2d27c4c2c..5e710293c2c 100644 --- a/src/com/android/settings/search/SearchResultTrampoline.java +++ b/src/com/android/settings/search/SearchResultTrampoline.java @@ -34,6 +34,7 @@ import com.android.settings.SubSettings; import com.android.settings.activityembedding.ActivityEmbeddingRulesController; import com.android.settings.activityembedding.ActivityEmbeddingUtils; import com.android.settings.core.FeatureFlags; +import com.android.settings.homepage.DeepLinkHomepageActivityInternal; import com.android.settings.homepage.SettingsHomepageActivity; import com.android.settings.overlay.FeatureFactory; @@ -101,6 +102,7 @@ public class SearchResultTrampoline extends Activity { } else if (isSettingsIntelligence(callingActivity)) { if (FeatureFlagUtils.isEnabled(this, FeatureFlags.SETTINGS_SEARCH_ALWAYS_EXPAND)) { startActivity(SettingsActivity.getTrampolineIntent(intent, highlightMenuKey) + .setClass(this, DeepLinkHomepageActivityInternal.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)); } else {