1 /*
2  * Copyright (C) 2017 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 androidx.wear.widget.drawer;
18 
19 import android.app.Activity;
20 import android.content.Intent;
21 import android.graphics.drawable.Drawable;
22 import android.os.Bundle;
23 import android.os.Handler;
24 import android.os.Looper;
25 import android.util.ArrayMap;
26 import android.view.Gravity;
27 
28 import androidx.annotation.IntDef;
29 import androidx.wear.test.R;
30 import androidx.wear.widget.drawer.WearableDrawerLayout.DrawerStateCallback;
31 import androidx.wear.widget.drawer.WearableNavigationDrawerView.WearableNavigationDrawerAdapter;
32 
33 import java.lang.annotation.Retention;
34 import java.lang.annotation.RetentionPolicy;
35 import java.util.Map;
36 
37 /**
38  * Test {@link Activity} for {@link WearableDrawerLayout} and implementations of {@link
39  * androidx.wear.widget.drawer.WearableDrawerView}.
40  */
41 public class DrawerTestActivity extends Activity {
42 
43     private static final int DRAWER_SIZE = 5;
44     private static final String STYLE_EXTRA = "style";
45     private static final String OPEN_TOP_IN_ONCREATE_EXTRA = "openTopInOnCreate";
46     private static final String OPEN_BOTTOM_IN_ONCREATE_EXTRA = "openBottomInOnCreate";
47     private static final String CLOSE_FIRST_DRAWER_OPENED = "closeFirstDrawerOpened";
48     private static final Map<Integer, Integer> STYLE_TO_RES_ID = new ArrayMap<>();
49 
50     static {
STYLE_TO_RES_ID.put( DrawerStyle.BOTH_DRAWER_NAV_MULTI_PAGE, R.layout.test_multi_page_nav_drawer_layout)51         STYLE_TO_RES_ID.put(
52                 DrawerStyle.BOTH_DRAWER_NAV_MULTI_PAGE,
53                 R.layout.test_multi_page_nav_drawer_layout);
STYLE_TO_RES_ID.put( DrawerStyle.BOTH_DRAWER_NAV_SINGLE_PAGE, R.layout.test_single_page_nav_drawer_layout)54         STYLE_TO_RES_ID.put(
55                 DrawerStyle.BOTH_DRAWER_NAV_SINGLE_PAGE,
56                 R.layout.test_single_page_nav_drawer_layout);
STYLE_TO_RES_ID.put( DrawerStyle.ONLY_ACTION_DRAWER_WITH_TITLE, R.layout.test_only_action_drawer_with_title_layout)57         STYLE_TO_RES_ID.put(
58                 DrawerStyle.ONLY_ACTION_DRAWER_WITH_TITLE,
59                 R.layout.test_only_action_drawer_with_title_layout);
60 
61     }
62 
63     private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
64     private final WearableNavigationDrawerAdapter mDrawerAdapter =
65             new WearableNavigationDrawerAdapter() {
66                 @Override
67                 public String getItemText(int pos) {
68                     return Integer.toString(pos);
69                 }
70 
71                 @Override
72                 public Drawable getItemDrawable(int pos) {
73                     return getDrawable(android.R.drawable.star_on);
74                 }
75 
76                 @Override
77                 public int getCount() {
78                     return DRAWER_SIZE;
79                 }
80             };
81     private WearableActionDrawerView mActionDrawer;
82     private WearableDrawerLayout mDrawerLayout;
83     private WearableNavigationDrawerView mNavigationDrawer;
84     private final Runnable mCloseTopDrawerRunnable =
85             new Runnable() {
86                 @Override
87                 public void run() {
88                     mNavigationDrawer.getController().closeDrawer();
89                 }
90             };
91     private final DrawerStateCallback mCloseFirstDrawerOpenedCallback =
92             new DrawerStateCallback() {
93                 @Override
94                 public void onDrawerOpened(WearableDrawerLayout layout,
95                         WearableDrawerView drawerView) {
96                     mMainThreadHandler.postDelayed(mCloseTopDrawerRunnable, 1000);
97                 }
98             };
99     @DrawerStyle private int mNavigationStyle;
100     private boolean mOpenTopDrawerInOnCreate;
101     private boolean mOpenBottomDrawerInOnCreate;
102     private boolean mCloseFirstDrawerOpened;
103 
104     @Override
onCreate(Bundle savedInstanceState)105     protected void onCreate(Bundle savedInstanceState) {
106         super.onCreate(savedInstanceState);
107 
108         parseIntent(getIntent());
109 
110         setContentView(STYLE_TO_RES_ID.get(mNavigationStyle));
111 
112         mDrawerLayout = (WearableDrawerLayout) findViewById(R.id.drawer_layout);
113         mNavigationDrawer = (WearableNavigationDrawerView) findViewById(R.id.navigation_drawer);
114         mActionDrawer = (WearableActionDrawerView) findViewById(R.id.action_drawer);
115 
116         if (mCloseFirstDrawerOpened) {
117             mDrawerLayout.setDrawerStateCallback(mCloseFirstDrawerOpenedCallback);
118         }
119 
120         if (mNavigationDrawer != null) {
121             mNavigationDrawer.setAdapter(mDrawerAdapter);
122             if (mOpenTopDrawerInOnCreate) {
123                 mDrawerLayout.openDrawer(Gravity.TOP);
124             } else {
125                 mDrawerLayout.peekDrawer(Gravity.TOP);
126             }
127         }
128 
129         if (mActionDrawer != null) {
130             if (mOpenBottomDrawerInOnCreate) {
131                 mDrawerLayout.openDrawer(Gravity.BOTTOM);
132             } else {
133                 mDrawerLayout.peekDrawer(Gravity.BOTTOM);
134             }
135         }
136     }
137 
parseIntent(Intent intent)138     private void parseIntent(Intent intent) {
139         //noinspection WrongConstant - Linter doesn't know intent contains a NavigationStyle
140         mNavigationStyle = intent.getIntExtra(STYLE_EXTRA, DrawerStyle.BOTH_DRAWER_NAV_SINGLE_PAGE);
141         mOpenTopDrawerInOnCreate = intent.getBooleanExtra(OPEN_TOP_IN_ONCREATE_EXTRA, false);
142         mOpenBottomDrawerInOnCreate = intent.getBooleanExtra(OPEN_BOTTOM_IN_ONCREATE_EXTRA, false);
143         mCloseFirstDrawerOpened = intent.getBooleanExtra(CLOSE_FIRST_DRAWER_OPENED, false);
144     }
145 
146     /**
147      * Which configuration of drawers should be used.
148      */
149     @Retention(RetentionPolicy.SOURCE)
150     @IntDef({
151             DrawerStyle.BOTH_DRAWER_NAV_SINGLE_PAGE,
152             DrawerStyle.BOTH_DRAWER_NAV_MULTI_PAGE,
153             DrawerStyle.ONLY_ACTION_DRAWER_WITH_TITLE
154     })
155     public @interface DrawerStyle {
156         int BOTH_DRAWER_NAV_SINGLE_PAGE = 0;
157         int BOTH_DRAWER_NAV_MULTI_PAGE = 1;
158         int ONLY_ACTION_DRAWER_WITH_TITLE = 2;
159     }
160 
161     /**
162      * Builds an {@link Intent} to start this {@link Activity} with the appropriate extras.
163      */
164     public static class Builder {
165 
166         @DrawerStyle private int mStyle = DrawerStyle.BOTH_DRAWER_NAV_SINGLE_PAGE;
167         private boolean mOpenTopDrawerInOnCreate = false;
168         private boolean mOpenBottomDrawerInOnCreate = false;
169         private boolean mCloseFirstDrawerOpened = false;
170 
setStyle(@rawerStyle int style)171         public Builder setStyle(@DrawerStyle int style) {
172             mStyle = style;
173             return this;
174         }
175 
openTopDrawerInOnCreate()176         public Builder openTopDrawerInOnCreate() {
177             mOpenTopDrawerInOnCreate = true;
178             return this;
179         }
180 
openBottomDrawerInOnCreate()181         public Builder openBottomDrawerInOnCreate() {
182             mOpenBottomDrawerInOnCreate = true;
183             return this;
184         }
185 
closeFirstDrawerOpened()186         public Builder closeFirstDrawerOpened() {
187             mCloseFirstDrawerOpened = true;
188             return this;
189         }
190 
build()191         public Intent build() {
192             return new Intent()
193                     .putExtra(STYLE_EXTRA, mStyle)
194                     .putExtra(OPEN_TOP_IN_ONCREATE_EXTRA, mOpenTopDrawerInOnCreate)
195                     .putExtra(OPEN_BOTTOM_IN_ONCREATE_EXTRA, mOpenBottomDrawerInOnCreate)
196                     .putExtra(CLOSE_FIRST_DRAWER_OPENED, mCloseFirstDrawerOpened);
197         }
198     }
199 }
200