blob: bcf69c44070a859baa103f4769b945c660c24a27 [file] [log] [blame]
Steve McKay4f160402015-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
19import static com.android.internal.util.Preconditions.checkArgument;
20
21import android.app.Activity;
22import android.support.v4.app.ActionBarDrawerToggle;
23import android.support.v4.widget.DrawerLayout;
24import android.support.v4.widget.DrawerLayout.DrawerListener;
Steve McKay4f160402015-08-17 13:18:05 -070025import android.view.View;
Steve McKay1f264a82016-02-03 11:15:57 -080026import android.widget.Toolbar;
Steve McKay4f160402015-08-17 13:18:05 -070027
28/**
29 * A facade over the various pieces comprising "roots fragment in a Drawer".
30 *
31 * @see DrawerController#create(DrawerLayout)
32 */
33abstract class DrawerController implements DrawerListener {
34
35 abstract void setOpen(boolean open);
Steve McKay12055472015-08-20 16:48:49 -070036 abstract boolean isPresent();
Steve McKay4f160402015-08-17 13:18:05 -070037 abstract boolean isOpen();
Steve McKay1f264a82016-02-03 11:15:57 -080038 abstract void setTitle(String title);
39 abstract void update();
Steve McKay4f160402015-08-17 13:18:05 -070040
41 /**
42 * Returns a controller suitable for {@code Layout}.
43 */
44 static DrawerController create(Activity activity) {
45
46 DrawerLayout layout = (DrawerLayout) activity.findViewById(R.id.drawer_layout);
47
48 if (layout == null) {
49 return new DummyDrawerController();
50 }
51
52 View drawer = activity.findViewById(R.id.drawer_roots);
Steve McKay1f264a82016-02-03 11:15:57 -080053 Toolbar toolbar = (Toolbar) activity.findViewById(R.id.roots_toolbar);
54
Steve McKay4f160402015-08-17 13:18:05 -070055 ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
56 activity,
57 layout,
58 R.drawable.ic_hamburger,
59 R.string.drawer_open,
60 R.string.drawer_close);
61
Steve McKay1f264a82016-02-03 11:15:57 -080062 return new RuntimeDrawerController(layout, drawer, toggle, toolbar);
Steve McKay4f160402015-08-17 13:18:05 -070063 }
64
65 /**
66 * Returns a controller suitable for {@code Layout}.
67 */
68 static DrawerController createDummy() {
69 return new DummyDrawerController();
70 }
71
72 /**
73 * Runtime controller that manages a real drawer.
74 */
75 private static final class RuntimeDrawerController extends DrawerController {
76
77 private final ActionBarDrawerToggle mToggle;
78 private DrawerLayout mLayout;
79 private View mDrawer;
Steve McKay1f264a82016-02-03 11:15:57 -080080 private Toolbar mToolbar;
Steve McKay4f160402015-08-17 13:18:05 -070081
82 public RuntimeDrawerController(
Steve McKay1f264a82016-02-03 11:15:57 -080083 DrawerLayout layout, View drawer, ActionBarDrawerToggle toggle,
84 Toolbar drawerToolbar) {
85 mToolbar = drawerToolbar;
Steve McKay4f160402015-08-17 13:18:05 -070086 checkArgument(layout != null);
87
88 mLayout = layout;
89 mDrawer = drawer;
90 mToggle = toggle;
91
92 mLayout.setDrawerListener(this);
93 }
94
95 @Override
96 void setOpen(boolean open) {
97 if (open) {
98 mLayout.openDrawer(mDrawer);
99 } else {
100 mLayout.closeDrawer(mDrawer);
101 }
102 }
103
104 @Override
105 boolean isOpen() {
106 return mLayout.isDrawerOpen(mDrawer);
107 }
108
109 @Override
Steve McKay12055472015-08-20 16:48:49 -0700110 boolean isPresent() {
111 return true;
112 }
113
114 @Override
Steve McKay1f264a82016-02-03 11:15:57 -0800115 void setTitle(String title) {
116 mToolbar.setTitle(title);
117 }
118
119 @Override
120 void update() {
Steve McKay4f160402015-08-17 13:18:05 -0700121 mToggle.syncState();
122 }
123
124 @Override
Steve McKay4f160402015-08-17 13:18:05 -0700125 public void onDrawerSlide(View drawerView, float slideOffset) {
126 mToggle.onDrawerSlide(drawerView, slideOffset);
127 }
128
129 @Override
130 public void onDrawerOpened(View drawerView) {
131 mToggle.onDrawerOpened(drawerView);
132 }
133
134 @Override
135 public void onDrawerClosed(View drawerView) {
136 mToggle.onDrawerClosed(drawerView);
137 }
138
139 @Override
140 public void onDrawerStateChanged(int newState) {
141 mToggle.onDrawerStateChanged(newState);
142 }
143 }
144
145 /*
146 * Dummy controller useful with clients that don't host a real drawer.
147 */
148 private static final class DummyDrawerController extends DrawerController {
149
150 @Override
Steve McKay12055472015-08-20 16:48:49 -0700151 void setOpen(boolean open) {}
Steve McKay4f160402015-08-17 13:18:05 -0700152
Steve McKay4f160402015-08-17 13:18:05 -0700153
154 @Override
Steve McKay12055472015-08-20 16:48:49 -0700155 boolean isOpen() {
156 return false;
157 }
158
159 @Override
Steve McKay12055472015-08-20 16:48:49 -0700160 boolean isPresent() {
161 return false;
162 }
163
164 @Override
Steve McKay1f264a82016-02-03 11:15:57 -0800165 void setTitle(String title) {}
166
167 @Override
168 void update() {}
Steve McKay4f160402015-08-17 13:18:05 -0700169
170 @Override
171 public void onDrawerSlide(View drawerView, float slideOffset) {}
172
173 @Override
174 public void onDrawerOpened(View drawerView) {}
175
176 @Override
177 public void onDrawerClosed(View drawerView) {}
178
179 @Override
180 public void onDrawerStateChanged(int newState) {}
Steve McKay4f160402015-08-17 13:18:05 -0700181 }
182}