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

Commit 11b17a7e authored by Raff Tsai's avatar Raff Tsai
Browse files

Save BottomSheet state when screen rotate

- Save BottomSheet state in onSaveInstanceState
- When Settings starts from saved state, we don't need to
  add fragment. Because FragmentManager already contains
  fragment instance.
- Fix status bar color

Change-Id: Ic8779b8253040554409e735bd57bd9001c1d56fd
Fixes: 112428378
Test: make RunSettingsRoboTests
parent 237f80b0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -171,6 +171,7 @@
        <item name="colorPrimaryDark">@*android:color/primary_dark_device_default_settings_light</item>
        <item name="colorAccent">@*android:color/accent_device_default_light</item>
        <item name="preferenceTheme">@style/PreferenceTheme</item>
        <item name="android:windowLightStatusBar">true</item>
    </style>

    <!--TODO(b/111875856) This theme will be useless, when we add real activity/fragment to handle the full screen for WifiDialog -->
+4 −1
Original line number Diff line number Diff line
@@ -40,10 +40,13 @@ public class SettingsHomepageActivity extends SettingsBaseActivity {
            settings.setAction("android.settings.SETTINGS");
            startActivity(settings);
            finish();
            return;
        }
        setContentView(R.layout.settings_homepage);
        if (savedInstanceState == null) {
            switchToFragment(this, R.id.main_content, HomepageFragment.class.getName());
        }
    }

    public static boolean isDynamicHomepageEnabled(Context context) {
        return FeatureFlagUtils.isEnabled(context, FeatureFlags.DYNAMIC_HOMEPAGE);
+45 −25
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.settings.homepage;


import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
@@ -37,17 +36,20 @@ import com.android.settings.dashboard.DashboardSummary;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.SearchFeatureProvider;

import com.google.android.material.bottomappbar.BottomAppBar;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

public class HomepageFragment extends InstrumentedFragment {

    private static final String TAG = "HomepageFragment";
    private static final String SAVE_BOTTOMBAR_STATE = "bottombar_state";
    private static final String SAVE_BOTTOM_FRAGMENT_LOADED = "bottom_fragment_loaded";

    private FloatingActionButton mSearchButton;
    private BottomSheetBehavior mBottomSheetBehavior;
    private boolean mBottomFragmentLoaded = false;
    private View mBottomBar;
    private View mSearchBar;
    private boolean mBottomFragmentLoaded;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -61,6 +63,22 @@ public class HomepageFragment extends InstrumentedFragment {
        super.onActivityCreated(savedInstanceState);
        setupBottomBar();
        setupSearchBar();
        if (savedInstanceState != null) {
            final int bottombarState = savedInstanceState.getInt(SAVE_BOTTOMBAR_STATE);
            mBottomFragmentLoaded = savedInstanceState.getBoolean(SAVE_BOTTOM_FRAGMENT_LOADED);
            mBottomSheetBehavior.setState(bottombarState);
            setBarState(bottombarState);
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        if (mBottomSheetBehavior != null) {
            outState.putInt(SAVE_BOTTOMBAR_STATE, mBottomSheetBehavior.getState());
            outState.putBoolean(SAVE_BOTTOM_FRAGMENT_LOADED, mBottomFragmentLoaded);
        }
    }

    @Override
@@ -70,8 +88,8 @@ public class HomepageFragment extends InstrumentedFragment {

    private void setupBottomBar() {
        final Activity activity = getActivity();
        mSearchButton = activity.findViewById(R.id.search_fab);

        mSearchButton = activity.findViewById(R.id.search_fab);
        mSearchButton.setOnClickListener(v -> {
            final Intent intent = SearchFeatureProvider.SEARCH_UI_INTENT;
            intent.setPackage(FeatureFactory.getFactory(activity)
@@ -79,18 +97,16 @@ public class HomepageFragment extends InstrumentedFragment {
            startActivityForResult(intent, 0 /* requestCode */);
        });
        mBottomSheetBehavior = BottomSheetBehavior.from(activity.findViewById(R.id.bottom_sheet));
        final BottomAppBar bottomBar = activity.findViewById(R.id.bar);
        bottomBar.setOnClickListener(v -> {
        mSearchBar = activity.findViewById(R.id.search_bar_container);
        mBottomBar = activity.findViewById(R.id.bar);
        mBottomBar.setOnClickListener(v -> {
            mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
        });

        final int screenWidthpx = getResources().getDisplayMetrics().widthPixels;
        final View searchbar = activity.findViewById(R.id.search_bar_container);
        final View bottombar = activity.findViewById(R.id.bar);
        final Toolbar searchActionBar = activity.findViewById(R.id.search_action_bar);
        searchActionBar.setNavigationIcon(R.drawable.ic_search_floating_24dp);


        mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
@@ -100,31 +116,35 @@ public class HomepageFragment extends InstrumentedFragment {
                            R.id.bottom_sheet_fragment, DashboardSummary.class.getName());
                    mBottomFragmentLoaded = true;
                }
                if (newState == BottomSheetBehavior.STATE_EXPANDED) {
                    bottombar.setVisibility(View.INVISIBLE);
                    searchbar.setVisibility(View.VISIBLE);
                    mSearchButton.setVisibility(View.GONE);
                } else if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
                    bottombar.setVisibility(View.VISIBLE);
                    searchbar.setVisibility(View.INVISIBLE);
                    mSearchButton.setVisibility(View.VISIBLE);
                } else if (newState == BottomSheetBehavior.STATE_SETTLING) {
                    bottombar.setVisibility(View.VISIBLE);
                    searchbar.setVisibility(View.VISIBLE);
                    mSearchButton.setVisibility(View.VISIBLE);
                }
                setBarState(newState);
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                bottombar.setAlpha(1 - slideOffset);
                mBottomBar.setAlpha(1 - slideOffset);
                mSearchButton.setAlpha(1 - slideOffset);
                searchbar.setAlpha(slideOffset);
                searchbar.setPadding((int) (screenWidthpx * (1 - slideOffset)), 0, 0, 0);
                mSearchBar.setAlpha(slideOffset);
                mSearchBar.setPadding((int) (screenWidthpx * (1 - slideOffset)), 0, 0, 0);
            }
        });
    }

    private void setBarState(int bottomSheetState) {
        if (bottomSheetState == BottomSheetBehavior.STATE_EXPANDED) {
            mBottomBar.setVisibility(View.INVISIBLE);
            mSearchBar.setVisibility(View.VISIBLE);
            mSearchButton.setVisibility(View.GONE);
        } else if (bottomSheetState == BottomSheetBehavior.STATE_COLLAPSED) {
            mBottomBar.setVisibility(View.VISIBLE);
            mSearchBar.setVisibility(View.INVISIBLE);
            mSearchButton.setVisibility(View.VISIBLE);
        } else if (bottomSheetState == BottomSheetBehavior.STATE_SETTLING) {
            mBottomBar.setVisibility(View.VISIBLE);
            mSearchBar.setVisibility(View.VISIBLE);
            mSearchButton.setVisibility(View.VISIBLE);
        }
    }

    //TODO(110767984), copied from settingsActivity. We have to merge them
    private void setupSearchBar() {
        final Activity activity = getActivity();