diff --git a/Android.bp b/Android.bp index fd669741a3e..0940b0b7f5c 100644 --- a/Android.bp +++ b/Android.bp @@ -75,6 +75,7 @@ android_library { "lottie", "WifiTrackerLib", "windowExtLib", + "SettingsLibActivityEmbedding", ], libs: [ diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index d3d3604a2cc..d9dc590c708 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -143,6 +143,8 @@ public class SettingsActivity extends SettingsBaseActivity public static final String EXTRA_SHOW_FRAGMENT_AS_SUBSETTING = ":settings:show_fragment_as_subsetting"; + public static final String EXTRA_IS_SECONDARY_LAYER_PAGE = + ":settings:is_secondary_layer_page"; /** * Additional extra of Settings#ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK. @@ -301,12 +303,12 @@ public class SettingsActivity extends SettingsBaseActivity launchSettingFragment(initialFragmentName, intent); } - final boolean isInSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent()); + final boolean isActionBarButtonEnabled = isActionBarButtonEnabled(intent); final ActionBar actionBar = getActionBar(); if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(!isInSetupWizard); - actionBar.setHomeButtonEnabled(!isInSetupWizard); + actionBar.setDisplayHomeAsUpEnabled(isActionBarButtonEnabled); + actionBar.setHomeButtonEnabled(isActionBarButtonEnabled); actionBar.setDisplayShowTitleEnabled(true); } mMainSwitch = findViewById(R.id.switch_bar); @@ -366,6 +368,18 @@ public class SettingsActivity extends SettingsBaseActivity } } + private boolean isActionBarButtonEnabled(Intent intent) { + if (WizardManagerHelper.isAnySetupWizard(intent)) { + return false; + } + final boolean isSecondaryLayerPage = + intent.getBooleanExtra(EXTRA_IS_SECONDARY_LAYER_PAGE, false); + + // TODO: move Settings's ActivityEmbeddingUtils to SettingsLib. + return !com.android.settingslib.activityembedding.ActivityEmbeddingUtils + .shouldHideBackButton(this, isSecondaryLayerPage); + } + private boolean isSubSettings(Intent intent) { return this instanceof SubSettings || intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false); diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java index a2dd4bf15c8..dee24dfefb4 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java @@ -34,6 +34,7 @@ import androidx.window.embedding.SplitPlaceholderRule; import androidx.window.embedding.SplitRule; import com.android.settings.Settings; +import com.android.settings.SettingsActivity; import com.android.settings.SubSettings; import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling; import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction; @@ -196,6 +197,7 @@ public class ActivityEmbeddingRulesController { addActivityFilter(activityFilters, Settings.class); final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class); + intent.putExtra(SettingsActivity.EXTRA_IS_SECONDARY_LAYER_PAGE, true); final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule( activityFilters, intent, diff --git a/src/com/android/settings/core/SubSettingLauncher.java b/src/com/android/settings/core/SubSettingLauncher.java index 616d72f3c27..93a939febf1 100644 --- a/src/com/android/settings/core/SubSettingLauncher.java +++ b/src/com/android/settings/core/SubSettingLauncher.java @@ -43,11 +43,11 @@ public class SubSettingLauncher { } mContext = context; mLaunchRequest = new LaunchRequest(); - mLaunchRequest.transitionType = TransitionType.TRANSITION_SHARED_AXIS; + mLaunchRequest.mTransitionType = TransitionType.TRANSITION_SHARED_AXIS; } public SubSettingLauncher setDestination(String fragmentName) { - mLaunchRequest.destinationName = fragmentName; + mLaunchRequest.mDestinationName = fragmentName; return this; } @@ -67,9 +67,9 @@ public class SubSettingLauncher { * @param titleResId res id of string, will use package name to resolve */ public SubSettingLauncher setTitleRes(String titlePackageName, @StringRes int titleResId) { - mLaunchRequest.titleResPackageName = titlePackageName; - mLaunchRequest.titleResId = titleResId; - mLaunchRequest.title = null; + mLaunchRequest.mTitleResPackageName = titlePackageName; + mLaunchRequest.mTitleResId = titleResId; + mLaunchRequest.mTitle = null; return this; } @@ -82,22 +82,22 @@ public class SubSettingLauncher { * @param title text title */ public SubSettingLauncher setTitleText(CharSequence title) { - mLaunchRequest.title = title; + mLaunchRequest.mTitle = title; return this; } public SubSettingLauncher setArguments(Bundle arguments) { - mLaunchRequest.arguments = arguments; + mLaunchRequest.mArguments = arguments; return this; } public SubSettingLauncher setExtras(Bundle extras) { - mLaunchRequest.extras = extras; + mLaunchRequest.mExtras = extras; return this; } public SubSettingLauncher setSourceMetricsCategory(int sourceMetricsCategory) { - mLaunchRequest.sourceMetricsCategory = sourceMetricsCategory; + mLaunchRequest.mSourceMetricsCategory = sourceMetricsCategory; return this; } @@ -108,17 +108,23 @@ public class SubSettingLauncher { } public SubSettingLauncher addFlags(int flags) { - mLaunchRequest.flags |= flags; + mLaunchRequest.mFlags |= flags; return this; } public SubSettingLauncher setUserHandle(UserHandle userHandle) { - mLaunchRequest.userHandle = userHandle; + mLaunchRequest.mUserHandle = userHandle; return this; } public SubSettingLauncher setTransitionType(int transitionType) { - mLaunchRequest.transitionType = transitionType; + mLaunchRequest.mTransitionType = transitionType; + return this; + } + + /** Decide whether the next page is secondary layer page or not. */ + public SubSettingLauncher setIsSecondaryLayerPage(boolean isSecondaryLayerPage) { + mLaunchRequest.mIsSecondaryLayerPage = isSecondaryLayerPage; return this; } @@ -131,14 +137,14 @@ public class SubSettingLauncher { final Intent intent = toIntent(); - boolean launchAsUser = mLaunchRequest.userHandle != null - && mLaunchRequest.userHandle.getIdentifier() != UserHandle.myUserId(); + boolean launchAsUser = mLaunchRequest.mUserHandle != null + && mLaunchRequest.mUserHandle.getIdentifier() != UserHandle.myUserId(); boolean launchForResult = mLaunchRequest.mResultListener != null; if (launchAsUser && launchForResult) { - launchForResultAsUser(intent, mLaunchRequest.userHandle, mLaunchRequest.mResultListener, - mLaunchRequest.mRequestCode); + launchForResultAsUser(intent, mLaunchRequest.mUserHandle, + mLaunchRequest.mResultListener, mLaunchRequest.mRequestCode); } else if (launchAsUser && !launchForResult) { - launchAsUser(intent, mLaunchRequest.userHandle); + launchAsUser(intent, mLaunchRequest.mUserHandle); } else if (!launchAsUser && launchForResult) { launchForResult(mLaunchRequest.mResultListener, intent, mLaunchRequest.mRequestCode); } else { @@ -150,26 +156,28 @@ public class SubSettingLauncher { final Intent intent = new Intent(Intent.ACTION_MAIN); copyExtras(intent); intent.setClass(mContext, SubSettings.class); - if (TextUtils.isEmpty(mLaunchRequest.destinationName)) { + if (TextUtils.isEmpty(mLaunchRequest.mDestinationName)) { throw new IllegalArgumentException("Destination fragment must be set"); } - intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, mLaunchRequest.destinationName); + intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, mLaunchRequest.mDestinationName); - if (mLaunchRequest.sourceMetricsCategory < 0) { + if (mLaunchRequest.mSourceMetricsCategory < 0) { throw new IllegalArgumentException("Source metrics category must be set"); } intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, - mLaunchRequest.sourceMetricsCategory); + mLaunchRequest.mSourceMetricsCategory); - intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, mLaunchRequest.arguments); + intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, mLaunchRequest.mArguments); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RES_PACKAGE_NAME, - mLaunchRequest.titleResPackageName); + mLaunchRequest.mTitleResPackageName); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, - mLaunchRequest.titleResId); - intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, mLaunchRequest.title); - intent.addFlags(mLaunchRequest.flags); + mLaunchRequest.mTitleResId); + intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, mLaunchRequest.mTitle); + intent.addFlags(mLaunchRequest.mFlags); intent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE, - mLaunchRequest.transitionType); + mLaunchRequest.mTransitionType); + intent.putExtra(SettingsActivity.EXTRA_IS_SECONDARY_LAYER_PAGE, + mLaunchRequest.mIsSecondaryLayerPage); return intent; } @@ -196,8 +204,8 @@ public class SubSettingLauncher { } private void copyExtras(Intent intent) { - if (mLaunchRequest.extras != null) { - intent.replaceExtras(mLaunchRequest.extras); + if (mLaunchRequest.mExtras != null) { + intent.replaceExtras(mLaunchRequest.mExtras); } } @@ -205,17 +213,18 @@ public class SubSettingLauncher { * Simple container that has information about how to launch a subsetting. */ static class LaunchRequest { - String destinationName; - int titleResId; - String titleResPackageName; - CharSequence title; - int sourceMetricsCategory = -100; - int flags; + String mDestinationName; + int mTitleResId; + String mTitleResPackageName; + CharSequence mTitle; + int mSourceMetricsCategory = -100; + int mFlags; Fragment mResultListener; int mRequestCode; - UserHandle userHandle; - int transitionType; - Bundle arguments; - Bundle extras; + UserHandle mUserHandle; + int mTransitionType; + Bundle mArguments; + Bundle mExtras; + boolean mIsSecondaryLayerPage; } } diff --git a/src/com/android/settings/development/featureflags/FeatureFlagPreference.java b/src/com/android/settings/development/featureflags/FeatureFlagPreference.java index d6bdb77d04b..992aa0f6726 100644 --- a/src/com/android/settings/development/featureflags/FeatureFlagPreference.java +++ b/src/com/android/settings/development/featureflags/FeatureFlagPreference.java @@ -17,6 +17,8 @@ package com.android.settings.development.featureflags; import android.content.Context; +import android.provider.Settings; +import android.text.TextUtils; import android.util.FeatureFlagUtils; import androidx.preference.SwitchPreference; @@ -49,5 +51,13 @@ public class FeatureFlagPreference extends SwitchPreference { } else { FeatureFlagUtils.setEnabled(getContext(), mKey, isChecked); } + + // A temporary logic for settings_hide_secondary_page_back_button_in_two_pane + // Remove it before Android T release. + if (TextUtils.equals(mKey, + FeatureFlagUtils.SETTINGS_HIDE_SECONDARY_PAGE_BACK_BUTTON_IN_TWO_PANE)) { + Settings.Global.putString(getContext().getContentResolver(), + mKey, String.valueOf(isChecked)); + } } } diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java index 7ce673074ee..734e079537d 100644 --- a/src/com/android/settings/homepage/TopLevelSettings.java +++ b/src/com/android/settings/homepage/TopLevelSettings.java @@ -119,6 +119,7 @@ public class TopLevelSettings extends DashboardFragment implements ? ((Instrumentable) caller).getMetricsCategory() : Instrumentable.METRICS_CATEGORY_UNKNOWN) .setTitleRes(-1) + .setIsSecondaryLayerPage(true) .launch(); return true; }