1 /*
2 Copyright 2016 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 package com.example.android.wearable.wear.weardrawers;
17 
18 import android.app.Fragment;
19 import android.app.FragmentManager;
20 import android.content.Context;
21 import android.graphics.drawable.Drawable;
22 import android.os.Bundle;
23 import android.support.wearable.activity.WearableActivity;
24 import android.support.wearable.view.drawer.WearableActionDrawer;
25 import android.support.wearable.view.drawer.WearableDrawerLayout;
26 import android.support.wearable.view.drawer.WearableNavigationDrawer;
27 import android.util.Log;
28 import android.view.Gravity;
29 import android.view.LayoutInflater;
30 import android.view.MenuItem;
31 import android.view.View;
32 import android.view.ViewGroup;
33 import android.view.ViewTreeObserver;
34 import android.widget.ImageView;
35 import android.widget.Toast;
36 
37 import java.util.ArrayList;
38 
39 /**
40  * Demonstrates use of Navigation and Action Drawers on Android Wear.
41  */
42 public class MainActivity extends WearableActivity implements
43         WearableActionDrawer.OnMenuItemClickListener {
44 
45     private static final String TAG = "MainActivity";
46 
47     private WearableDrawerLayout mWearableDrawerLayout;
48     private WearableNavigationDrawer mWearableNavigationDrawer;
49     private WearableActionDrawer mWearableActionDrawer;
50 
51     private ArrayList<Planet> mSolarSystem;
52     private int mSelectedPlanet;
53 
54     private PlanetFragment mPlanetFragment;
55 
56     @Override
onCreate(Bundle savedInstanceState)57     protected void onCreate(Bundle savedInstanceState) {
58         super.onCreate(savedInstanceState);
59         Log.d(TAG, "onCreate()");
60 
61         setContentView(R.layout.activity_main);
62         setAmbientEnabled();
63 
64         mSolarSystem = initializeSolarSystem();
65         mSelectedPlanet = 0;
66 
67         // Initialize content to first planet.
68         mPlanetFragment = new PlanetFragment();
69         Bundle args = new Bundle();
70 
71         int imageId = getResources().getIdentifier(mSolarSystem.get(mSelectedPlanet).getImage(),
72                 "drawable", getPackageName());
73 
74 
75         args.putInt(PlanetFragment.ARG_PLANET_IMAGE_ID, imageId);
76         mPlanetFragment.setArguments(args);
77         FragmentManager fragmentManager = getFragmentManager();
78         fragmentManager.beginTransaction().replace(R.id.content_frame, mPlanetFragment).commit();
79 
80         // Main Wearable Drawer Layout that wraps all content
81         mWearableDrawerLayout = (WearableDrawerLayout) findViewById(R.id.drawer_layout);
82 
83         // Top Navigation Drawer
84         mWearableNavigationDrawer =
85                 (WearableNavigationDrawer) findViewById(R.id.top_navigation_drawer);
86         mWearableNavigationDrawer.setAdapter(new NavigationAdapter(this));
87 
88         // Bottom Action Drawer
89         mWearableActionDrawer =
90                 (WearableActionDrawer) findViewById(R.id.bottom_action_drawer);
91 
92         mWearableActionDrawer.setOnMenuItemClickListener(this);
93 
94         // Temporarily peeks the navigation and action drawers to ensure the user is aware of them.
95         ViewTreeObserver observer = mWearableDrawerLayout.getViewTreeObserver();
96         observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
97             @Override
98             public void onGlobalLayout() {
99                 mWearableDrawerLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
100                 mWearableDrawerLayout.peekDrawer(Gravity.TOP);
101                 mWearableDrawerLayout.peekDrawer(Gravity.BOTTOM);
102             }
103         });
104 
105         /* Action Drawer Tip: If you only have a single action for your Action Drawer, you can use a
106          * (custom) View to peek on top of the content by calling
107          * mWearableActionDrawer.setPeekContent(View). Make sure you set a click listener to handle
108          * a user clicking on your View.
109          */
110     }
111 
initializeSolarSystem()112     private ArrayList<Planet> initializeSolarSystem() {
113         ArrayList<Planet> solarSystem = new ArrayList<Planet>();
114         String[] planetArrayNames = getResources().getStringArray(R.array.planets_array_names);
115 
116         for (int i = 0; i < planetArrayNames.length; i++) {
117             String planet = planetArrayNames[i];
118             int planetResourceId =
119                     getResources().getIdentifier(planet, "array", getPackageName());
120             String[] planetInformation = getResources().getStringArray(planetResourceId);
121 
122             solarSystem.add(new Planet(
123                     planetInformation[0],   // Name
124                     planetInformation[1],   // Navigation icon
125                     planetInformation[2],   // Image icon
126                     planetInformation[3],   // Moons
127                     planetInformation[4],   // Volume
128                     planetInformation[5])); // Surface area
129         }
130 
131         return solarSystem;
132     }
133 
134     @Override
onMenuItemClick(MenuItem menuItem)135     public boolean onMenuItemClick(MenuItem menuItem) {
136         Log.d(TAG, "onMenuItemClick(): " + menuItem);
137 
138         final int itemId = menuItem.getItemId();
139 
140         String toastMessage = "";
141 
142         switch (itemId) {
143             case R.id.menu_planet_name:
144                 toastMessage = mSolarSystem.get(mSelectedPlanet).getName();
145                 break;
146             case R.id.menu_number_of_moons:
147                 toastMessage = mSolarSystem.get(mSelectedPlanet).getMoons();
148                 break;
149             case R.id.menu_volume:
150                 toastMessage = mSolarSystem.get(mSelectedPlanet).getVolume();
151                 break;
152             case R.id.menu_surface_area:
153                 toastMessage = mSolarSystem.get(mSelectedPlanet).getSurfaceArea();
154                 break;
155         }
156 
157         mWearableDrawerLayout.closeDrawer(mWearableActionDrawer);
158 
159         if (toastMessage.length() > 0) {
160             Toast toast = Toast.makeText(
161                     getApplicationContext(),
162                     toastMessage,
163                     Toast.LENGTH_SHORT);
164             toast.show();
165             return true;
166         } else {
167             return false;
168         }
169     }
170 
171     private final class NavigationAdapter
172             extends WearableNavigationDrawer.WearableNavigationDrawerAdapter {
173 
174         private final Context mContext;
175 
NavigationAdapter(Context context)176         public NavigationAdapter(Context context) {
177             mContext = context;
178         }
179 
180         @Override
getCount()181         public int getCount() {
182             return mSolarSystem.size();
183         }
184 
185         @Override
onItemSelected(int position)186         public void onItemSelected(int position) {
187             Log.d(TAG, "WearableNavigationDrawerAdapter.onItemSelected(): " + position);
188             mSelectedPlanet = position;
189 
190             String selectedPlanetImage = mSolarSystem.get(mSelectedPlanet).getImage();
191             int drawableId =
192                     getResources().getIdentifier(selectedPlanetImage, "drawable", getPackageName());
193             mPlanetFragment.updatePlanet(drawableId);
194         }
195 
196         @Override
getItemText(int pos)197         public String getItemText(int pos) {
198             return mSolarSystem.get(pos).getName();
199         }
200 
201         @Override
getItemDrawable(int pos)202         public Drawable getItemDrawable(int pos) {
203             String navigationIcon = mSolarSystem.get(pos).getNavigationIcon();
204 
205             int drawableNavigationIconId =
206                     getResources().getIdentifier(navigationIcon, "drawable", getPackageName());
207 
208             return mContext.getDrawable(drawableNavigationIconId);
209         }
210     }
211 
212     /**
213      * Fragment that appears in the "content_frame", just shows the currently selected planet.
214      */
215     public static class PlanetFragment extends Fragment {
216         public static final String ARG_PLANET_IMAGE_ID = "planet_image_id";
217 
218         private ImageView mImageView;
219 
PlanetFragment()220         public PlanetFragment() {
221             // Empty constructor required for fragment subclasses
222         }
223 
224         @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)225         public View onCreateView(LayoutInflater inflater, ViewGroup container,
226                                  Bundle savedInstanceState) {
227             View rootView = inflater.inflate(R.layout.fragment_planet, container, false);
228 
229             mImageView = ((ImageView) rootView.findViewById(R.id.image));
230 
231             int imageIdToLoad = getArguments().getInt(ARG_PLANET_IMAGE_ID);
232             mImageView.setImageResource(imageIdToLoad);
233 
234             return rootView;
235         }
236 
updatePlanet(int imageId)237         public void updatePlanet(int imageId) {
238             mImageView.setImageResource(imageId);
239         }
240     }
241 }