Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12f9d7d8 authored by Edgar Wang's avatar Edgar Wang Committed by Android (Google) Code Review
Browse files

Merge "[Expressive design] Support floatingToolbar in SettingsActivity" into main

parents 87179c36 722506f8
Loading
Loading
Loading
Loading
+51 −37
Original line number Diff line number Diff line
@@ -15,16 +15,13 @@
 */
package com.android.settings.core;

import static android.text.Layout.HYPHENATION_FREQUENCY_NORMAL_FAST;

import android.annotation.LayoutRes;
import android.app.ActionBar;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.text.LineBreakConfig;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
@@ -36,13 +33,15 @@ import android.widget.Toolbar;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.fragment.app.FragmentActivity;

import com.android.settings.R;
import com.android.settings.SubSettings;
import com.android.settings.Utils;
import com.android.settings.core.CategoryMixin.CategoryHandler;
import com.android.settingslib.collapsingtoolbar.CollapsingToolbarDelegate;
import com.android.settingslib.collapsingtoolbar.FloatingToolbarHandler;
import com.android.settingslib.collapsingtoolbar.widget.ScrollableToolbarItemLayout;
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
import com.android.settingslib.transition.SettingsTransitionHelper.TransitionType;
import com.android.settingslib.widget.SettingsThemeHelper;
@@ -50,13 +49,17 @@ import com.android.window.flags.Flags;

import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.material.floatingtoolbar.FloatingToolbarLayout;
import com.google.android.material.resources.TextAppearanceConfig;
import com.google.android.setupcompat.util.WizardManagerHelper;
import com.google.android.setupdesign.transition.TransitionHelper;
import com.google.android.setupdesign.util.ThemeHelper;

import java.util.List;

/** Base activity for Settings pages */
public class SettingsBaseActivity extends FragmentActivity implements CategoryHandler {
public class SettingsBaseActivity extends FragmentActivity implements CategoryHandler,
        FloatingToolbarHandler {

    /**
     * What type of page transition should be apply.
@@ -66,7 +69,6 @@ public class SettingsBaseActivity extends FragmentActivity implements CategoryHa
    protected static final boolean DEBUG_TIMING = false;
    private static final String TAG = "SettingsBaseActivity";
    private static final int DEFAULT_REQUEST = -1;
    private static final float TOOLBAR_LINE_SPACING_MULTIPLIER = 1.1f;

    private static final int EXPRESSIVE_LAYOUT_ID =
            com.android.settingslib.collapsingtoolbar.R.layout.settingslib_expressive_collapsing_toolbar_base_layout;
@@ -79,6 +81,8 @@ public class SettingsBaseActivity extends FragmentActivity implements CategoryHa
    protected AppBarLayout mAppBarLayout;
    private Toolbar mToolbar;

    private CollapsingToolbarDelegate mToolbardelegate;

    @Override
    public CategoryMixin getCategoryMixin() {
        return mCategoryMixin;
@@ -127,17 +131,7 @@ public class SettingsBaseActivity extends FragmentActivity implements CategoryHa
            mCollapsingToolbarLayout =
                    findViewById(com.android.settingslib.collapsingtoolbar.R.id.collapsing_toolbar);
            mAppBarLayout = findViewById(R.id.app_bar);
            if (mCollapsingToolbarLayout != null) {
                mCollapsingToolbarLayout.setLineSpacingMultiplier(TOOLBAR_LINE_SPACING_MULTIPLIER);
                mCollapsingToolbarLayout.setHyphenationFrequency(HYPHENATION_FREQUENCY_NORMAL_FAST);
                mCollapsingToolbarLayout.setStaticLayoutBuilderConfigurer(builder ->
                        builder.setLineBreakConfig(
                                new LineBreakConfig.Builder()
                                        .setLineBreakWordStyle(
                                                LineBreakConfig.LINE_BREAK_WORD_STYLE_PHRASE)
                                        .build()));
            }
            autoSetCollapsingToolbarLayoutScrolling();
            getToolbarDelegate().initCollapsingToolbar(mCollapsingToolbarLayout, mAppBarLayout);
        } else {
            super.setContentView(R.layout.settings_base_layout);
        }
@@ -150,6 +144,10 @@ public class SettingsBaseActivity extends FragmentActivity implements CategoryHa
        }
        setActionBar(toolbar);

        FloatingToolbarLayout toolbarLayout = findViewById(
                com.android.settingslib.collapsingtoolbar.R.id.floating_toolbar);
        getToolbarDelegate().initFloatingToolbar(getApplicationContext(), toolbarLayout);

        if (DEBUG_TIMING) {
            Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) + " ms");
        }
@@ -276,25 +274,6 @@ public class SettingsBaseActivity extends FragmentActivity implements CategoryHa
        return false;
    }

    private void autoSetCollapsingToolbarLayoutScrolling() {
        if (mAppBarLayout == null) {
            return;
        }
        final CoordinatorLayout.LayoutParams params =
                (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
        final AppBarLayout.Behavior behavior = new AppBarLayout.Behavior();
        behavior.setDragCallback(
                new AppBarLayout.Behavior.DragCallback() {
                    @Override
                    public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
                        // Header can be scrolling while device in landscape mode.
                        return appBarLayout.getResources().getConfiguration().orientation
                                == Configuration.ORIENTATION_LANDSCAPE;
                    }
                });
        params.setBehavior(behavior);
    }

    private int getTransitionType(Intent intent) {
        if (intent == null) {
            return TransitionType.TRANSITION_NONE;
@@ -315,4 +294,39 @@ public class SettingsBaseActivity extends FragmentActivity implements CategoryHa
            actionBarContainer.setVisibility(View.GONE);
        }
    }

    @Override
    public void setFloatingToolbarVisibility(boolean visible) {
        getToolbarDelegate().setFloatingToolbarVisibility(visible);
    }

    @Override
    public void setToolbarItems(@NonNull List<ScrollableToolbarItemLayout.ToolbarItem> items) {
        getToolbarDelegate().setToolbarItems(items);
    }

    @Override
    public void setOnItemSelectedListener(
            @NonNull ScrollableToolbarItemLayout.OnItemSelectedListener listener) {
        getToolbarDelegate().setOnItemSelectedListener(listener);
    }

    private CollapsingToolbarDelegate getToolbarDelegate() {
        if (mToolbardelegate == null) {
            mToolbardelegate = new CollapsingToolbarDelegate(new EmptyDelegateCallback(), true);
        }
        return mToolbardelegate;
    }

    private class EmptyDelegateCallback implements CollapsingToolbarDelegate.HostCallback {
        @Nullable
        @Override
        public ActionBar setActionBar(Toolbar toolbar) {
            return null;
        }

        @Override
        public void setOuterTitle(CharSequence title) {
        }
    }
}