/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settingslib.collapsingtoolbar; import android.app.ActionBar; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; 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.settingslib.utils.BuildCompatUtils; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.appbar.CollapsingToolbarLayout; import com.google.android.material.resources.TextAppearanceConfig; /** * A base Activity that has a collapsing toolbar layout is used for the activities intending to * enable the collapsing toolbar function. */ public class CollapsingToolbarBaseActivity extends FragmentActivity { private static final float TOOLBAR_LINE_SPACING_MULTIPLIER = 1.1f; @Nullable private CollapsingToolbarLayout mCollapsingToolbarLayout; @Nullable private AppBarLayout mAppBarLayout; private int mCustomizeLayoutResId = 0; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (mCustomizeLayoutResId > 0 && !BuildCompatUtils.isAtLeastS()) { super.setContentView(mCustomizeLayoutResId); return; } // Force loading font synchronously for collapsing toolbar layout TextAppearanceConfig.setShouldLoadFontSynchronously(true); super.setContentView(R.layout.collapsing_toolbar_base_layout); mCollapsingToolbarLayout = findViewById(R.id.collapsing_toolbar); mAppBarLayout = findViewById(R.id.app_bar); if (mCollapsingToolbarLayout != null) { mCollapsingToolbarLayout.setLineSpacingMultiplier(TOOLBAR_LINE_SPACING_MULTIPLIER); } disableCollapsingToolbarLayoutScrollingBehavior(); final Toolbar toolbar = findViewById(R.id.action_bar); setActionBar(toolbar); // Enable title and home button by default final ActionBar actionBar = getActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayShowTitleEnabled(true); } } @Override public void setContentView(int layoutResID) { final ViewGroup parent = findViewById(R.id.content_frame); if (parent != null) { parent.removeAllViews(); } LayoutInflater.from(this).inflate(layoutResID, parent); } @Override public void setContentView(View view) { final ViewGroup parent = findViewById(R.id.content_frame); if (parent != null) { parent.addView(view); } } @Override public void setContentView(View view, ViewGroup.LayoutParams params) { final ViewGroup parent = findViewById(R.id.content_frame); if (parent != null) { parent.addView(view, params); } } /** * This method allows an activity to replace the default layout with a customize layout. Notice * that it will no longer apply the features being provided by this class when this method * gets called. */ protected void setCustomizeContentView(int layoutResId) { mCustomizeLayoutResId = layoutResId; } @Override public void setTitle(CharSequence title) { if (mCollapsingToolbarLayout != null) { mCollapsingToolbarLayout.setTitle(title); } else { super.setTitle(title); } } @Override public void setTitle(int titleId) { if (mCollapsingToolbarLayout != null) { mCollapsingToolbarLayout.setTitle(getText(titleId)); } else { super.setTitle(titleId); } } @Override public boolean onNavigateUp() { if (!super.onNavigateUp()) { finishAfterTransition(); } return true; } /** * Returns an instance of collapsing toolbar. */ @Nullable public CollapsingToolbarLayout getCollapsingToolbarLayout() { return mCollapsingToolbarLayout; } /** * Return an instance of app bar. */ @Nullable public AppBarLayout getAppBarLayout() { return mAppBarLayout; } private void disableCollapsingToolbarLayoutScrollingBehavior() { 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) { return false; } }); params.setBehavior(behavior); } }