From 14cfd2f2ca2049b8bdb9d0016986112958b93ab2 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Wed, 6 Jan 2021 07:46:46 +0800 Subject: [PATCH 1/2] Add CollapsingToolbarLayout for sub settings Settings app is planning to make toolbar collapsible for next Android release. This CL is to add a new layout for CollapsingToolbarLayout in the Settings app and to update the theme correspondly. This feature will be controlled by feature flag, which makes Settings app compacitible with the existing layout. Bug: 174451673 Test: manul test and visual verification 1) Enable the feature and open Settings app 2) Navigate to each sub page and check if toolbar is collapsible Change-Id: Ibef524bbaa7ae3f0a43db7e40e599f42e009437f --- AndroidManifest.xml | 3 +- .../settings_collapsing_base_layout.xml | 64 +++++++++++++ res/values-night/themes.xml | 6 ++ res/values/styles.xml | 13 +++ res/values/themes.xml | 8 +- .../android/settings/SettingsActivity.java | 4 +- .../settings/SettingsPreferenceFragment.java | 9 +- .../settings/core/SettingsBaseActivity.java | 90 +++++++++++++++++-- 8 files changed, 187 insertions(+), 10 deletions(-) create mode 100644 res/layout/settings_collapsing_base_layout.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c946122efc4..2eaebb1173a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -174,7 +174,8 @@ - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values-night/themes.xml b/res/values-night/themes.xml index c5f67febfa9..a4f495a6507 100644 --- a/res/values-night/themes.xml +++ b/res/values-night/themes.xml @@ -44,4 +44,10 @@ + + diff --git a/res/values/styles.xml b/res/values/styles.xml index ce6b09551a6..4ab1e6c90ec 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -874,4 +874,17 @@ 16sp ?android:attr/textColorSecondary + + + + + + diff --git a/res/values/themes.xml b/res/values/themes.xml index 01ea10302bf..fc692463dfa 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -72,7 +72,7 @@ true - + + diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 1c2952a3b46..7f214f67e23 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -288,7 +288,9 @@ public class SettingsActivity extends SettingsBaseActivity if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(!isInSetupWizard); actionBar.setHomeButtonEnabled(!isInSetupWizard); - actionBar.setDisplayShowTitleEnabled(true); + // TODO(b/176882938): Enable title after material component updated + // If CollapsingToolbarLayout is applied, the old action bar won't show title. + actionBar.setDisplayShowTitleEnabled(mCollapsingToolbarLayout == null); } mSwitchBar = findViewById(R.id.switch_bar); if (mSwitchBar != null) { diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 659ada4bd40..2c628f6f375 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -26,6 +26,7 @@ import android.content.pm.PackageManager; import android.os.Bundle; import android.text.TextUtils; import android.util.ArrayMap; +import android.util.FeatureFlagUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -42,6 +43,7 @@ import androidx.preference.PreferenceScreen; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.android.settings.core.FeatureFlags; import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.search.actionbar.SearchMenuController; @@ -126,8 +128,11 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); - SearchMenuController.init(this /* host */); - HelpMenuController.init(this /* host */); + // TODO(b/176883483): Remove both search and help menu if this feature rolled out + if (!FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) { + SearchMenuController.init(this /* host */); + HelpMenuController.init(this /* host */); + } if (icicle != null) { mPreferenceHighlighted = icicle.getBoolean(SAVE_HIGHLIGHTED_KEY); diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java index d160dc5e9d5..470470290d0 100644 --- a/src/com/android/settings/core/SettingsBaseActivity.java +++ b/src/com/android/settings/core/SettingsBaseActivity.java @@ -29,6 +29,7 @@ import android.os.AsyncTask; import android.os.Bundle; import android.text.TextUtils; import android.util.ArraySet; +import android.util.FeatureFlagUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -43,8 +44,11 @@ import com.android.settings.SubSettings; import com.android.settings.dashboard.CategoryManager; import com.android.settingslib.drawer.Tile; +import com.google.android.material.appbar.CollapsingToolbarLayout; import com.google.android.setupcompat.util.WizardManagerHelper; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -55,6 +59,7 @@ public class SettingsBaseActivity extends FragmentActivity { protected static final boolean DEBUG_TIMING = false; private static final String TAG = "SettingsBaseActivity"; private static final String DATA_SCHEME_PKG = "package"; + private static final int TOOLBAR_MAX_LINE_NUMBER = 2; // Serves as a temporary list of tiles to ignore until we heard back from the PM that they // are disabled. @@ -62,6 +67,8 @@ public class SettingsBaseActivity extends FragmentActivity { private final PackageReceiver mPackageReceiver = new PackageReceiver(); private final List mCategoryListeners = new ArrayList<>(); + + protected CollapsingToolbarLayout mCollapsingToolbarLayout; private int mCategoriesUpdateTaskCount; @Override @@ -79,21 +86,30 @@ public class SettingsBaseActivity extends FragmentActivity { requestWindowFeature(Window.FEATURE_NO_TITLE); } // Apply SetupWizard light theme during setup flow. This is for SubSettings pages. - if (WizardManagerHelper.isAnySetupWizard(getIntent()) && this instanceof SubSettings) { + final boolean isAnySetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent()); + if (isAnySetupWizard && this instanceof SubSettings) { setTheme(R.style.LightTheme_SubSettings_SetupWizard); } - super.setContentView(R.layout.settings_base_layout); + if (FeatureFlagUtils.isEnabled(this, FeatureFlags.SILKY_HOME) + && isToolbarEnabled() && !isAnySetupWizard) { + super.setContentView(R.layout.settings_collapsing_base_layout); + mCollapsingToolbarLayout = findViewById(R.id.collapsing_toolbar); + } else { + super.setContentView(R.layout.settings_base_layout); + } + + // This is to hide the toolbar from those pages which don't need a toolbar originally. final Toolbar toolbar = findViewById(R.id.action_bar); - if (theme.getBoolean(android.R.styleable.Theme_windowNoTitle, false)) { + if (!isToolbarEnabled() || isAnySetupWizard) { toolbar.setVisibility(View.GONE); return; } setActionBar(toolbar); + initCollapsingToolbar(); if (DEBUG_TIMING) { - Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) - + " ms"); + Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) + " ms"); } } @@ -151,6 +167,70 @@ public class SettingsBaseActivity extends FragmentActivity { ((ViewGroup) findViewById(R.id.content_frame)).addView(view, params); } + @Override + public void setTitle(CharSequence title) { + if (mCollapsingToolbarLayout != null) { + mCollapsingToolbarLayout.setTitle(title); + } + super.setTitle(title); + } + + @Override + public void setTitle(int titleId) { + if (mCollapsingToolbarLayout != null) { + mCollapsingToolbarLayout.setTitle(getText(titleId)); + } + super.setTitle(titleId); + } + + /** + * SubSetting page should show a toolbar by default. If the page wouldn't show a toolbar, + * override this method and return false value. + * @return ture by default + */ + protected boolean isToolbarEnabled() { + return true; + } + + private void initCollapsingToolbar() { + if (mCollapsingToolbarLayout == null) { + return; + } + mCollapsingToolbarLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + v.removeOnLayoutChangeListener(this); + final int count = getLineCount(); + if (count > TOOLBAR_MAX_LINE_NUMBER) { + mCollapsingToolbarLayout + .setExpandedTitleTextAppearance(R.style.ToolbarText_MoreThanTwoLines); + } else { + mCollapsingToolbarLayout.setExpandedTitleTextAppearance(R.style.ToolbarText); + } + } + }); + } + + private int getLineCount() { + try { + final Class toolbarClazz = mCollapsingToolbarLayout.getClass(); + final Field textHelperField = toolbarClazz.getDeclaredField("collapsingTextHelper"); + textHelperField.setAccessible(true); + final Object textHelperObj = textHelperField.get(mCollapsingToolbarLayout); + + final Field layoutField = textHelperObj.getClass().getDeclaredField("textLayout"); + layoutField.setAccessible(true); + final Object layoutObj = layoutField.get(textHelperObj); + + final Method method = layoutObj.getClass().getDeclaredMethod("getLineCount"); + return (int) method.invoke(layoutObj); + } catch (Exception e) { + return 0; + } + } + + private void onCategoriesChanged(Set categories) { final int N = mCategoryListeners.size(); for (int i = 0; i < N; i++) { From 82df7e60a1fe82f6f9c8c8e38a36fac86ce1c3a7 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Thu, 7 Jan 2021 00:49:14 +0800 Subject: [PATCH 2/2] Disable the title of mobile network After the collapsing toolbar layout is applied to subsetting pages, the mobile network page has two title shown currently. One is the activity title while the other is the collapsing toolbar title To make sure there will be only one title shown on this page, the activity title will be removed and we will keep the collapsing toolbar title. Bug: 176899590 Test: manual test and visual verified 1) Navigate to Settings -> Network & internet -> Mobile network 2) Check if there's only one title in this page Change-Id: I50e57468c640f1d176fd99dcaafc06ed3fc601dc --- .../settings/network/telephony/MobileNetworkActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java index b179770d485..92f0054d2e7 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java +++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java @@ -115,6 +115,9 @@ public class MobileNetworkActivity extends SettingsBaseActivity final ActionBar actionBar = getActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); + // TODO(b/176882938): Enable title after material component updated + // If CollapsingToolbarLayout is applied, the old action bar won't show title. + actionBar.setDisplayShowTitleEnabled(mCollapsingToolbarLayout == null); } getProxySubscriptionManager().setLifecycle(getLifecycle());