1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settingslib.collapsingtoolbar;
18 
19 import android.app.ActionBar;
20 import android.os.Bundle;
21 import android.view.LayoutInflater;
22 import android.view.View;
23 import android.view.ViewGroup;
24 import android.widget.Toolbar;
25 
26 import androidx.annotation.NonNull;
27 import androidx.annotation.Nullable;
28 import androidx.coordinatorlayout.widget.CoordinatorLayout;
29 import androidx.fragment.app.FragmentActivity;
30 
31 import com.android.settingslib.utils.BuildCompatUtils;
32 
33 import com.google.android.material.appbar.AppBarLayout;
34 import com.google.android.material.appbar.CollapsingToolbarLayout;
35 import com.google.android.material.resources.TextAppearanceConfig;
36 
37 /**
38  * A base Activity that has a collapsing toolbar layout is used for the activities intending to
39  * enable the collapsing toolbar function.
40  */
41 public class CollapsingToolbarBaseActivity extends FragmentActivity {
42 
43     private static final float TOOLBAR_LINE_SPACING_MULTIPLIER = 1.1f;
44 
45     @Nullable
46     private CollapsingToolbarLayout mCollapsingToolbarLayout;
47     @Nullable
48     private AppBarLayout mAppBarLayout;
49     private int mCustomizeLayoutResId = 0;
50 
51     @Override
onCreate(@ullable Bundle savedInstanceState)52     protected void onCreate(@Nullable Bundle savedInstanceState) {
53         super.onCreate(savedInstanceState);
54         if (mCustomizeLayoutResId > 0 && !BuildCompatUtils.isAtLeastS()) {
55             super.setContentView(mCustomizeLayoutResId);
56             return;
57         }
58         // Force loading font synchronously for collapsing toolbar layout
59         TextAppearanceConfig.setShouldLoadFontSynchronously(true);
60         super.setContentView(R.layout.collapsing_toolbar_base_layout);
61         mCollapsingToolbarLayout = findViewById(R.id.collapsing_toolbar);
62         mAppBarLayout = findViewById(R.id.app_bar);
63         if (mCollapsingToolbarLayout != null) {
64             mCollapsingToolbarLayout.setLineSpacingMultiplier(TOOLBAR_LINE_SPACING_MULTIPLIER);
65         }
66         disableCollapsingToolbarLayoutScrollingBehavior();
67 
68         final Toolbar toolbar = findViewById(R.id.action_bar);
69         setActionBar(toolbar);
70 
71         // Enable title and home button by default
72         final ActionBar actionBar = getActionBar();
73         if (actionBar != null) {
74             actionBar.setDisplayHomeAsUpEnabled(true);
75             actionBar.setHomeButtonEnabled(true);
76             actionBar.setDisplayShowTitleEnabled(true);
77         }
78     }
79 
80     @Override
setContentView(int layoutResID)81     public void setContentView(int layoutResID) {
82         final ViewGroup parent = findViewById(R.id.content_frame);
83         if (parent != null) {
84             parent.removeAllViews();
85         }
86         LayoutInflater.from(this).inflate(layoutResID, parent);
87     }
88 
89     @Override
setContentView(View view)90     public void setContentView(View view) {
91         final ViewGroup parent = findViewById(R.id.content_frame);
92         if (parent != null) {
93             parent.addView(view);
94         }
95     }
96 
97     @Override
setContentView(View view, ViewGroup.LayoutParams params)98     public void setContentView(View view, ViewGroup.LayoutParams params) {
99         final ViewGroup parent = findViewById(R.id.content_frame);
100         if (parent != null) {
101             parent.addView(view, params);
102         }
103     }
104 
105     /**
106      * This method allows an activity to replace the default layout with a customize layout. Notice
107      * that it will no longer apply the features being provided by this class when this method
108      * gets called.
109      */
setCustomizeContentView(int layoutResId)110     protected void setCustomizeContentView(int layoutResId) {
111         mCustomizeLayoutResId = layoutResId;
112     }
113 
114     @Override
setTitle(CharSequence title)115     public void setTitle(CharSequence title) {
116         if (mCollapsingToolbarLayout != null) {
117             mCollapsingToolbarLayout.setTitle(title);
118         } else {
119             super.setTitle(title);
120         }
121     }
122 
123     @Override
setTitle(int titleId)124     public void setTitle(int titleId) {
125         if (mCollapsingToolbarLayout != null) {
126             mCollapsingToolbarLayout.setTitle(getText(titleId));
127         } else {
128             super.setTitle(titleId);
129         }
130     }
131 
132     @Override
onNavigateUp()133     public boolean onNavigateUp() {
134         if (!super.onNavigateUp()) {
135             finishAfterTransition();
136         }
137         return true;
138     }
139 
140     /**
141      * Returns an instance of collapsing toolbar.
142      */
143     @Nullable
getCollapsingToolbarLayout()144     public CollapsingToolbarLayout getCollapsingToolbarLayout() {
145         return mCollapsingToolbarLayout;
146     }
147 
148     /**
149      * Return an instance of app bar.
150      */
151     @Nullable
getAppBarLayout()152     public AppBarLayout getAppBarLayout() {
153         return mAppBarLayout;
154     }
155 
disableCollapsingToolbarLayoutScrollingBehavior()156     private void disableCollapsingToolbarLayoutScrollingBehavior() {
157         if (mAppBarLayout == null) {
158             return;
159         }
160         final CoordinatorLayout.LayoutParams params =
161                 (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
162         final AppBarLayout.Behavior behavior = new AppBarLayout.Behavior();
163         behavior.setDragCallback(
164                 new AppBarLayout.Behavior.DragCallback() {
165                     @Override
166                     public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
167                         return false;
168                     }
169                 });
170         params.setBehavior(behavior);
171     }
172 }
173