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