Show/hide back button for 2nd page

By design, we want to show/hide back button for 2nd
layer page when it's in two pane mode.

Test: Manual test
Bug: 219000314
Change-Id: I14d8d7ee08280d5ce80c0b59e1e91d077f0b6d09
This commit is contained in:
Tsung-Mao Fang
2022-01-21 18:14:53 +08:00
parent b254c62506
commit 2df79641cb
6 changed files with 79 additions and 42 deletions

View File

@@ -75,6 +75,7 @@ android_library {
"lottie", "lottie",
"WifiTrackerLib", "WifiTrackerLib",
"windowExtLib", "windowExtLib",
"SettingsLibActivityEmbedding",
], ],
libs: [ libs: [

View File

@@ -143,6 +143,8 @@ public class SettingsActivity extends SettingsBaseActivity
public static final String EXTRA_SHOW_FRAGMENT_AS_SUBSETTING = public static final String EXTRA_SHOW_FRAGMENT_AS_SUBSETTING =
":settings: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. * Additional extra of Settings#ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK.
@@ -301,12 +303,12 @@ public class SettingsActivity extends SettingsBaseActivity
launchSettingFragment(initialFragmentName, intent); launchSettingFragment(initialFragmentName, intent);
} }
final boolean isInSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent()); final boolean isActionBarButtonEnabled = isActionBarButtonEnabled(intent);
final ActionBar actionBar = getActionBar(); final ActionBar actionBar = getActionBar();
if (actionBar != null) { if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(!isInSetupWizard); actionBar.setDisplayHomeAsUpEnabled(isActionBarButtonEnabled);
actionBar.setHomeButtonEnabled(!isInSetupWizard); actionBar.setHomeButtonEnabled(isActionBarButtonEnabled);
actionBar.setDisplayShowTitleEnabled(true); actionBar.setDisplayShowTitleEnabled(true);
} }
mMainSwitch = findViewById(R.id.switch_bar); 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) { private boolean isSubSettings(Intent intent) {
return this instanceof SubSettings || return this instanceof SubSettings ||
intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false); intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false);

View File

@@ -34,6 +34,7 @@ import androidx.window.embedding.SplitPlaceholderRule;
import androidx.window.embedding.SplitRule; import androidx.window.embedding.SplitRule;
import com.android.settings.Settings; import com.android.settings.Settings;
import com.android.settings.SettingsActivity;
import com.android.settings.SubSettings; import com.android.settings.SubSettings;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling; import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction; import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
@@ -196,6 +197,7 @@ public class ActivityEmbeddingRulesController {
addActivityFilter(activityFilters, Settings.class); addActivityFilter(activityFilters, Settings.class);
final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class); final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class);
intent.putExtra(SettingsActivity.EXTRA_IS_SECONDARY_LAYER_PAGE, true);
final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule( final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule(
activityFilters, activityFilters,
intent, intent,

View File

@@ -43,11 +43,11 @@ public class SubSettingLauncher {
} }
mContext = context; mContext = context;
mLaunchRequest = new LaunchRequest(); mLaunchRequest = new LaunchRequest();
mLaunchRequest.transitionType = TransitionType.TRANSITION_SHARED_AXIS; mLaunchRequest.mTransitionType = TransitionType.TRANSITION_SHARED_AXIS;
} }
public SubSettingLauncher setDestination(String fragmentName) { public SubSettingLauncher setDestination(String fragmentName) {
mLaunchRequest.destinationName = fragmentName; mLaunchRequest.mDestinationName = fragmentName;
return this; return this;
} }
@@ -67,9 +67,9 @@ public class SubSettingLauncher {
* @param titleResId res id of string, will use package name to resolve * @param titleResId res id of string, will use package name to resolve
*/ */
public SubSettingLauncher setTitleRes(String titlePackageName, @StringRes int titleResId) { public SubSettingLauncher setTitleRes(String titlePackageName, @StringRes int titleResId) {
mLaunchRequest.titleResPackageName = titlePackageName; mLaunchRequest.mTitleResPackageName = titlePackageName;
mLaunchRequest.titleResId = titleResId; mLaunchRequest.mTitleResId = titleResId;
mLaunchRequest.title = null; mLaunchRequest.mTitle = null;
return this; return this;
} }
@@ -82,22 +82,22 @@ public class SubSettingLauncher {
* @param title text title * @param title text title
*/ */
public SubSettingLauncher setTitleText(CharSequence title) { public SubSettingLauncher setTitleText(CharSequence title) {
mLaunchRequest.title = title; mLaunchRequest.mTitle = title;
return this; return this;
} }
public SubSettingLauncher setArguments(Bundle arguments) { public SubSettingLauncher setArguments(Bundle arguments) {
mLaunchRequest.arguments = arguments; mLaunchRequest.mArguments = arguments;
return this; return this;
} }
public SubSettingLauncher setExtras(Bundle extras) { public SubSettingLauncher setExtras(Bundle extras) {
mLaunchRequest.extras = extras; mLaunchRequest.mExtras = extras;
return this; return this;
} }
public SubSettingLauncher setSourceMetricsCategory(int sourceMetricsCategory) { public SubSettingLauncher setSourceMetricsCategory(int sourceMetricsCategory) {
mLaunchRequest.sourceMetricsCategory = sourceMetricsCategory; mLaunchRequest.mSourceMetricsCategory = sourceMetricsCategory;
return this; return this;
} }
@@ -108,17 +108,23 @@ public class SubSettingLauncher {
} }
public SubSettingLauncher addFlags(int flags) { public SubSettingLauncher addFlags(int flags) {
mLaunchRequest.flags |= flags; mLaunchRequest.mFlags |= flags;
return this; return this;
} }
public SubSettingLauncher setUserHandle(UserHandle userHandle) { public SubSettingLauncher setUserHandle(UserHandle userHandle) {
mLaunchRequest.userHandle = userHandle; mLaunchRequest.mUserHandle = userHandle;
return this; return this;
} }
public SubSettingLauncher setTransitionType(int transitionType) { 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; return this;
} }
@@ -131,14 +137,14 @@ public class SubSettingLauncher {
final Intent intent = toIntent(); final Intent intent = toIntent();
boolean launchAsUser = mLaunchRequest.userHandle != null boolean launchAsUser = mLaunchRequest.mUserHandle != null
&& mLaunchRequest.userHandle.getIdentifier() != UserHandle.myUserId(); && mLaunchRequest.mUserHandle.getIdentifier() != UserHandle.myUserId();
boolean launchForResult = mLaunchRequest.mResultListener != null; boolean launchForResult = mLaunchRequest.mResultListener != null;
if (launchAsUser && launchForResult) { if (launchAsUser && launchForResult) {
launchForResultAsUser(intent, mLaunchRequest.userHandle, mLaunchRequest.mResultListener, launchForResultAsUser(intent, mLaunchRequest.mUserHandle,
mLaunchRequest.mRequestCode); mLaunchRequest.mResultListener, mLaunchRequest.mRequestCode);
} else if (launchAsUser && !launchForResult) { } else if (launchAsUser && !launchForResult) {
launchAsUser(intent, mLaunchRequest.userHandle); launchAsUser(intent, mLaunchRequest.mUserHandle);
} else if (!launchAsUser && launchForResult) { } else if (!launchAsUser && launchForResult) {
launchForResult(mLaunchRequest.mResultListener, intent, mLaunchRequest.mRequestCode); launchForResult(mLaunchRequest.mResultListener, intent, mLaunchRequest.mRequestCode);
} else { } else {
@@ -150,26 +156,28 @@ public class SubSettingLauncher {
final Intent intent = new Intent(Intent.ACTION_MAIN); final Intent intent = new Intent(Intent.ACTION_MAIN);
copyExtras(intent); copyExtras(intent);
intent.setClass(mContext, SubSettings.class); intent.setClass(mContext, SubSettings.class);
if (TextUtils.isEmpty(mLaunchRequest.destinationName)) { if (TextUtils.isEmpty(mLaunchRequest.mDestinationName)) {
throw new IllegalArgumentException("Destination fragment must be set"); 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"); throw new IllegalArgumentException("Source metrics category must be set");
} }
intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, 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, intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RES_PACKAGE_NAME,
mLaunchRequest.titleResPackageName); mLaunchRequest.mTitleResPackageName);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID,
mLaunchRequest.titleResId); mLaunchRequest.mTitleResId);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, mLaunchRequest.title); intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, mLaunchRequest.mTitle);
intent.addFlags(mLaunchRequest.flags); intent.addFlags(mLaunchRequest.mFlags);
intent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE, intent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE,
mLaunchRequest.transitionType); mLaunchRequest.mTransitionType);
intent.putExtra(SettingsActivity.EXTRA_IS_SECONDARY_LAYER_PAGE,
mLaunchRequest.mIsSecondaryLayerPage);
return intent; return intent;
} }
@@ -196,8 +204,8 @@ public class SubSettingLauncher {
} }
private void copyExtras(Intent intent) { private void copyExtras(Intent intent) {
if (mLaunchRequest.extras != null) { if (mLaunchRequest.mExtras != null) {
intent.replaceExtras(mLaunchRequest.extras); intent.replaceExtras(mLaunchRequest.mExtras);
} }
} }
@@ -205,17 +213,18 @@ public class SubSettingLauncher {
* Simple container that has information about how to launch a subsetting. * Simple container that has information about how to launch a subsetting.
*/ */
static class LaunchRequest { static class LaunchRequest {
String destinationName; String mDestinationName;
int titleResId; int mTitleResId;
String titleResPackageName; String mTitleResPackageName;
CharSequence title; CharSequence mTitle;
int sourceMetricsCategory = -100; int mSourceMetricsCategory = -100;
int flags; int mFlags;
Fragment mResultListener; Fragment mResultListener;
int mRequestCode; int mRequestCode;
UserHandle userHandle; UserHandle mUserHandle;
int transitionType; int mTransitionType;
Bundle arguments; Bundle mArguments;
Bundle extras; Bundle mExtras;
boolean mIsSecondaryLayerPage;
} }
} }

View File

@@ -17,6 +17,8 @@
package com.android.settings.development.featureflags; package com.android.settings.development.featureflags;
import android.content.Context; import android.content.Context;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.FeatureFlagUtils; import android.util.FeatureFlagUtils;
import androidx.preference.SwitchPreference; import androidx.preference.SwitchPreference;
@@ -49,5 +51,13 @@ public class FeatureFlagPreference extends SwitchPreference {
} else { } else {
FeatureFlagUtils.setEnabled(getContext(), mKey, isChecked); 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));
}
} }
} }

View File

@@ -119,6 +119,7 @@ public class TopLevelSettings extends DashboardFragment implements
? ((Instrumentable) caller).getMetricsCategory() ? ((Instrumentable) caller).getMetricsCategory()
: Instrumentable.METRICS_CATEGORY_UNKNOWN) : Instrumentable.METRICS_CATEGORY_UNKNOWN)
.setTitleRes(-1) .setTitleRes(-1)
.setIsSecondaryLayerPage(true)
.launch(); .launch();
return true; return true;
} }