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