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

Commit e0bf8cb0 authored by Mill Chen's avatar Mill Chen
Browse files

Collapse toolbar when hosting multiple fragments

Registers a FragmentLifecycleCallbacks to collapse the toolbar when an
activity is hosting multiple fragments, as indicated by a non-empty back
stack in the FragmentManager. This behavior is applied only when using
the expressive theme.

Bug: 438375587
Test: manual test
Flag: EXEMPT bugfix to specific case
Change-Id: I4b9c494872e1634b516fd99672cba4d742d40d2a
parent 09c4bd85
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -76,6 +76,9 @@ public class CollapsingToolbarAppCompatActivity extends AppCompatActivity implem
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        EdgeToEdgeUtils.enable(this);
        super.onCreate(savedInstanceState);

        getToolbarDelegate().registerToolbarCollapseBehavior(this);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            DynamicColors.applyToActivityIfAvailable(this);
        }
+2 −0
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ public class CollapsingToolbarBaseActivity extends FragmentActivity implements
        EdgeToEdgeUtils.enable(this);
        super.onCreate(savedInstanceState);

        getToolbarDelegate().registerToolbarCollapseBehavior(this);

        if (SettingsThemeHelper.isExpressiveTheme(this)) {
            setTheme(com.android.settingslib.widget.theme.R.style.Theme_SubSettingsBase_Expressive);
        }
+35 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.graphics.text.LineBreakConfig;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -38,6 +39,9 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;

import com.android.settingslib.collapsingtoolbar.widget.ScrollableToolbarItemLayout;
import com.android.settingslib.widget.SettingsThemeHelper;
@@ -513,6 +517,37 @@ public class CollapsingToolbarDelegate {
        mActionButton.setContentDescription(contentDescription);
    }

    /**
     * Set the state of CollapsingToolbar to collapsed when multiple fragments share a single
     * FragmentManager within an activity.
     */
    public void registerToolbarCollapseBehavior(@NonNull Activity activity) {
        if (!(activity instanceof FragmentActivity)) {
            return;
        }
        FragmentManager fragmentManager = ((FragmentActivity) activity).getSupportFragmentManager();
        fragmentManager.registerFragmentLifecycleCallbacks(
            new FragmentManager.FragmentLifecycleCallbacks() {
                @Override
                public void onFragmentViewCreated(@NonNull FragmentManager fm, @NonNull Fragment f,
                        @NonNull View v, @Nullable Bundle savedInstanceState) {
                    super.onFragmentViewCreated(fm, f, v, savedInstanceState);
                    if (!SettingsThemeHelper.isExpressiveTheme(activity)) {
                        return;
                    }
                    // Check if multiple fragments use the same activity
                    if (fm.getBackStackEntryCount() > 0) {
                        AppBarLayout appBarLayout = getAppBarLayout();
                        if (appBarLayout != null) {
                            appBarLayout.post(() -> appBarLayout.setExpanded(false, true));
                        } else {
                            Log.e(TAG, "AppBarLayout is null, can't collapse toolbar.");
                        }
                    }
                }
            }, false);
    }

    private void autoSetCollapsingToolbarLayoutScrolling(AppBarLayout appBarLayout) {
        if (appBarLayout == null) {
            return;