blob: 613ac3a8ac83245205a1a1bdba68ede79dcbe2a7 [file] [log] [blame]
Steve McKay6bbed4d2015-08-17 13:18:05 -07001/*
2 * Copyright (C) 2015 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
17package com.android.documentsui;
18
Felipe Leme9de58072018-01-19 16:40:04 -080019import static com.android.documentsui.base.SharedMinimal.DEBUG;
Aga Wronskac32a2992016-03-08 11:20:39 -080020
Jeff Sharkeya4ff00f2018-07-09 14:57:51 -060021import androidx.annotation.IntDef;
Steve McKay6bbed4d2015-08-17 13:18:05 -070022import android.app.Activity;
KOUSHIK PANUGANTI6ca7acc2018-04-17 16:00:10 -070023import androidx.annotation.ColorRes;
Tony Huang8d8d92f2018-09-13 14:41:16 +080024import androidx.appcompat.widget.Toolbar;
KOUSHIK PANUGANTI6ca7acc2018-04-17 16:00:10 -070025import androidx.legacy.app.ActionBarDrawerToggle;
26import androidx.drawerlayout.widget.DrawerLayout;
27import androidx.drawerlayout.widget.DrawerLayout.DrawerListener;
Aga Wronskac32a2992016-03-08 11:20:39 -080028import android.util.Log;
Steve McKay6bbed4d2015-08-17 13:18:05 -070029import android.view.View;
30
Steve McKayd9caa6a2016-09-15 16:36:45 -070031import com.android.documentsui.base.Display;
32
Aga Wronska441b9be2016-03-29 16:57:10 -070033import java.lang.annotation.Retention;
34import java.lang.annotation.RetentionPolicy;
35
Steve McKay6bbed4d2015-08-17 13:18:05 -070036/**
37 * A facade over the various pieces comprising "roots fragment in a Drawer".
38 *
39 * @see DrawerController#create(DrawerLayout)
40 */
Steve McKay16e0c1f2016-09-15 12:41:13 -070041public abstract class DrawerController implements DrawerListener {
Aga Wronskac32a2992016-03-08 11:20:39 -080042 public static final String TAG = "DrawerController";
43
Steve McKay16e0c1f2016-09-15 12:41:13 -070044 public abstract void update();
Steve McKay16e0c1f2016-09-15 12:41:13 -070045 public abstract void setOpen(boolean open);
Steve McKay16e0c1f2016-09-15 12:41:13 -070046 public abstract boolean isPresent();
47 public abstract boolean isOpen();
Steve McKay18d01e82016-02-03 11:15:57 -080048 abstract void setTitle(String title);
Steve McKay6bbed4d2015-08-17 13:18:05 -070049
50 /**
51 * Returns a controller suitable for {@code Layout}.
52 */
Garfield Tan208945c2016-10-04 14:36:38 -070053 public static DrawerController create(Activity activity, ActivityConfig activityConfig) {
Steve McKay6bbed4d2015-08-17 13:18:05 -070054
55 DrawerLayout layout = (DrawerLayout) activity.findViewById(R.id.drawer_layout);
56
57 if (layout == null) {
58 return new DummyDrawerController();
59 }
60
61 View drawer = activity.findViewById(R.id.drawer_roots);
Steve McKay18d01e82016-02-03 11:15:57 -080062 Toolbar toolbar = (Toolbar) activity.findViewById(R.id.roots_toolbar);
Ivan Chiangb7543de2018-10-23 14:20:22 +080063 toolbar.setTitleTextColor(activity.getResources().getColor(R.color.drawer_title_color));
Aga Wronskae20925f2016-04-06 13:57:28 -070064
Aga Wronskac32a2992016-03-08 11:20:39 -080065 drawer.getLayoutParams().width = calculateDrawerWidth(activity);
66
Steve McKay6bbed4d2015-08-17 13:18:05 -070067 ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
68 activity,
69 layout,
70 R.drawable.ic_hamburger,
71 R.string.drawer_open,
72 R.string.drawer_close);
73
Garfield Tan208945c2016-10-04 14:36:38 -070074 return new RuntimeDrawerController(layout, drawer, toggle, toolbar, activityConfig);
Steve McKay6bbed4d2015-08-17 13:18:05 -070075 }
76
77 /**
78 * Returns a controller suitable for {@code Layout}.
79 */
80 static DrawerController createDummy() {
81 return new DummyDrawerController();
82 }
83
Aga Wronskac32a2992016-03-08 11:20:39 -080084 private static int calculateDrawerWidth(Activity activity) {
85 // Material design specification for navigation drawer:
86 // https://www.google.com/design/spec/patterns/navigation-drawer.html
87 float width = Display.screenWidth(activity) - Display.actionBarHeight(activity);
88 float maxWidth = activity.getResources().getDimension(R.dimen.max_drawer_width);
89 int finalWidth = (int) ((width > maxWidth ? maxWidth : width));
90
91 if (DEBUG)
92 Log.d(TAG, "Calculated drawer width:" + (finalWidth / Display.density(activity)));
93
94 return finalWidth;
95 }
96
Steve McKay6bbed4d2015-08-17 13:18:05 -070097 /**
98 * Runtime controller that manages a real drawer.
99 */
Garfield, Tan7d66a862016-05-11 10:28:41 -0700100 private static final class RuntimeDrawerController extends DrawerController
101 implements ItemDragListener.DragHost {
Ben Linb1ab6962017-03-14 10:48:57 -0700102 private static final int SPRING_TIMEOUT = 750;
Steve McKay6bbed4d2015-08-17 13:18:05 -0700103 private final ActionBarDrawerToggle mToggle;
104 private DrawerLayout mLayout;
105 private View mDrawer;
Steve McKay18d01e82016-02-03 11:15:57 -0800106 private Toolbar mToolbar;
Steve McKay6bbed4d2015-08-17 13:18:05 -0700107
108 public RuntimeDrawerController(
Garfield Tan208945c2016-10-04 14:36:38 -0700109 DrawerLayout layout,
110 View drawer,
111 ActionBarDrawerToggle toggle,
112 Toolbar drawerToolbar,
113 ActivityConfig activityConfig) {
Steve McKay18d01e82016-02-03 11:15:57 -0800114 mToolbar = drawerToolbar;
Steve McKay0af8afd2016-02-25 13:34:03 -0800115 assert(layout != null);
Steve McKay6bbed4d2015-08-17 13:18:05 -0700116
117 mLayout = layout;
118 mDrawer = drawer;
119 mToggle = toggle;
120
121 mLayout.setDrawerListener(this);
Garfield, Tan7d66a862016-05-11 10:28:41 -0700122
Garfield Tan208945c2016-10-04 14:36:38 -0700123 if (activityConfig.dragAndDropEnabled()) {
124 View edge = layout.findViewById(R.id.drawer_edge);
Ben Linb1ab6962017-03-14 10:48:57 -0700125 edge.setOnDragListener(new ItemDragListener<>(this, SPRING_TIMEOUT));
Garfield Tan208945c2016-10-04 14:36:38 -0700126 }
Garfield, Tan7d66a862016-05-11 10:28:41 -0700127 }
128
129 @Override
130 public void runOnUiThread(Runnable runnable) {
131 mDrawer.post(runnable);
132 }
133
134 @Override
Garfield Tanda2c0f02017-04-11 13:47:58 -0700135 public void setDropTargetHighlight(View v, boolean highlight) {
Ben Lin693a3522017-03-07 16:00:29 -0800136 assert (v.getId() == R.id.drawer_edge);
137
138 @ColorRes int id = highlight ? R.color.item_doc_background_selected :
139 android.R.color.transparent;
140 v.setBackgroundColor(id);
Ben Lin7f72a3c2016-09-27 16:37:28 -0700141 }
142
143 @Override
Garfield Tanda2c0f02017-04-11 13:47:58 -0700144 public void onDragEntered(View v) {
Ben Lin693a3522017-03-07 16:00:29 -0800145 // do nothing; let drawer only open for onViewHovered
Garfield, Tan7d66a862016-05-11 10:28:41 -0700146 }
147
148 @Override
Garfield Tanda2c0f02017-04-11 13:47:58 -0700149 public void onDragExited(View v) {
Ben Lind0202122016-11-10 18:00:12 -0800150 // do nothing
151 }
152
153 @Override
Garfield, Tan7d66a862016-05-11 10:28:41 -0700154 public void onViewHovered(View v) {
Ben Lin693a3522017-03-07 16:00:29 -0800155 assert (v.getId() == R.id.drawer_edge);
156
157 setOpen(true);
Steve McKay6bbed4d2015-08-17 13:18:05 -0700158 }
159
160 @Override
Garfield Tanda2c0f02017-04-11 13:47:58 -0700161 public void onDragEnded() {
162 // do nothing
163 }
164
165 @Override
Steve McKay16e0c1f2016-09-15 12:41:13 -0700166 public void setOpen(boolean open) {
Steve McKay6bbed4d2015-08-17 13:18:05 -0700167 if (open) {
168 mLayout.openDrawer(mDrawer);
169 } else {
170 mLayout.closeDrawer(mDrawer);
171 }
172 }
173
174 @Override
Steve McKay16e0c1f2016-09-15 12:41:13 -0700175 public boolean isOpen() {
Steve McKay6bbed4d2015-08-17 13:18:05 -0700176 return mLayout.isDrawerOpen(mDrawer);
177 }
178
179 @Override
Steve McKay16e0c1f2016-09-15 12:41:13 -0700180 public boolean isPresent() {
Steve McKay0fbfc652015-08-20 16:48:49 -0700181 return true;
182 }
183
184 @Override
Steve McKay18d01e82016-02-03 11:15:57 -0800185 void setTitle(String title) {
186 mToolbar.setTitle(title);
187 }
188
189 @Override
Steve McKay16e0c1f2016-09-15 12:41:13 -0700190 public void update() {
Steve McKay6bbed4d2015-08-17 13:18:05 -0700191 mToggle.syncState();
192 }
193
194 @Override
Steve McKay6bbed4d2015-08-17 13:18:05 -0700195 public void onDrawerSlide(View drawerView, float slideOffset) {
196 mToggle.onDrawerSlide(drawerView, slideOffset);
197 }
198
199 @Override
200 public void onDrawerOpened(View drawerView) {
201 mToggle.onDrawerOpened(drawerView);
202 }
203
204 @Override
205 public void onDrawerClosed(View drawerView) {
206 mToggle.onDrawerClosed(drawerView);
207 }
208
209 @Override
210 public void onDrawerStateChanged(int newState) {
211 mToggle.onDrawerStateChanged(newState);
212 }
213 }
214
215 /*
216 * Dummy controller useful with clients that don't host a real drawer.
217 */
218 private static final class DummyDrawerController extends DrawerController {
219
220 @Override
Steve McKay16e0c1f2016-09-15 12:41:13 -0700221 public void setOpen(boolean open) {}
Steve McKay6bbed4d2015-08-17 13:18:05 -0700222
Aga Wronska441b9be2016-03-29 16:57:10 -0700223 @Override
Steve McKay16e0c1f2016-09-15 12:41:13 -0700224 public boolean isOpen() {
Steve McKay0fbfc652015-08-20 16:48:49 -0700225 return false;
226 }
227
228 @Override
Steve McKay16e0c1f2016-09-15 12:41:13 -0700229 public boolean isPresent() {
Steve McKay0fbfc652015-08-20 16:48:49 -0700230 return false;
231 }
232
233 @Override
Steve McKay18d01e82016-02-03 11:15:57 -0800234 void setTitle(String title) {}
235
236 @Override
Steve McKay16e0c1f2016-09-15 12:41:13 -0700237 public void update() {}
Steve McKay6bbed4d2015-08-17 13:18:05 -0700238
239 @Override
240 public void onDrawerSlide(View drawerView, float slideOffset) {}
241
242 @Override
243 public void onDrawerOpened(View drawerView) {}
244
245 @Override
246 public void onDrawerClosed(View drawerView) {}
247
248 @Override
249 public void onDrawerStateChanged(int newState) {}
Steve McKay6bbed4d2015-08-17 13:18:05 -0700250 }
251}