1*90c8c64dSAndroid Build Coastguard Worker /* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright 2013 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 17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.basicmediarouter; 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Worker import android.app.Activity; 20*90c8c64dSAndroid Build Coastguard Worker import android.app.MediaRouteActionProvider; 21*90c8c64dSAndroid Build Coastguard Worker import android.content.Context; 22*90c8c64dSAndroid Build Coastguard Worker import android.content.DialogInterface; 23*90c8c64dSAndroid Build Coastguard Worker import android.media.MediaRouter; 24*90c8c64dSAndroid Build Coastguard Worker import android.media.MediaRouter.RouteInfo; 25*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle; 26*90c8c64dSAndroid Build Coastguard Worker import android.view.Display; 27*90c8c64dSAndroid Build Coastguard Worker import android.view.Menu; 28*90c8c64dSAndroid Build Coastguard Worker import android.view.MenuItem; 29*90c8c64dSAndroid Build Coastguard Worker import android.view.View; 30*90c8c64dSAndroid Build Coastguard Worker import android.view.WindowManager; 31*90c8c64dSAndroid Build Coastguard Worker import android.widget.Button; 32*90c8c64dSAndroid Build Coastguard Worker import android.widget.TextView; 33*90c8c64dSAndroid Build Coastguard Worker 34*90c8c64dSAndroid Build Coastguard Worker /** 35*90c8c64dSAndroid Build Coastguard Worker * <p> 36*90c8c64dSAndroid Build Coastguard Worker * This sample demonstrates the use of the MediaRouter API to show content on a 37*90c8c64dSAndroid Build Coastguard Worker * secondary display using a {@link android.app.Presentation}. 38*90c8c64dSAndroid Build Coastguard Worker * </p> 39*90c8c64dSAndroid Build Coastguard Worker * <p> 40*90c8c64dSAndroid Build Coastguard Worker * The activity uses the {@link android.media.MediaRouter} API to automatically detect when a 41*90c8c64dSAndroid Build Coastguard Worker * presentation display is available and to allow the user to control the media 42*90c8c64dSAndroid Build Coastguard Worker * routes using a menu item provided by the {@link android.app.MediaRouteActionProvider}. 43*90c8c64dSAndroid Build Coastguard Worker * When a presentation display is available a {@link android.app.Presentation} (implemented 44*90c8c64dSAndroid Build Coastguard Worker * as a {@link SamplePresentation}) is shown on the preferred display. A button 45*90c8c64dSAndroid Build Coastguard Worker * toggles the background color of the secondary screen to show the interaction 46*90c8c64dSAndroid Build Coastguard Worker * between the primary and secondary screens. 47*90c8c64dSAndroid Build Coastguard Worker * </p> 48*90c8c64dSAndroid Build Coastguard Worker * <p> 49*90c8c64dSAndroid Build Coastguard Worker * This sample requires an HDMI or Wifi display. Alternatively, the 50*90c8c64dSAndroid Build Coastguard Worker * "Simulate secondary displays" feature in Development Settings can be enabled 51*90c8c64dSAndroid Build Coastguard Worker * to simulate secondary displays. 52*90c8c64dSAndroid Build Coastguard Worker * </p> 53*90c8c64dSAndroid Build Coastguard Worker * 54*90c8c64dSAndroid Build Coastguard Worker * @see android.app.Presentation 55*90c8c64dSAndroid Build Coastguard Worker * @see android.media.MediaRouter 56*90c8c64dSAndroid Build Coastguard Worker */ 57*90c8c64dSAndroid Build Coastguard Worker public class MainActivity extends Activity { 58*90c8c64dSAndroid Build Coastguard Worker 59*90c8c64dSAndroid Build Coastguard Worker private MediaRouter mMediaRouter; 60*90c8c64dSAndroid Build Coastguard Worker 61*90c8c64dSAndroid Build Coastguard Worker // Active Presentation, set to null if no secondary screen is enabled 62*90c8c64dSAndroid Build Coastguard Worker private SamplePresentation mPresentation; 63*90c8c64dSAndroid Build Coastguard Worker 64*90c8c64dSAndroid Build Coastguard Worker @Override onCreate(Bundle savedInstanceState)65*90c8c64dSAndroid Build Coastguard Worker protected void onCreate(Bundle savedInstanceState) { 66*90c8c64dSAndroid Build Coastguard Worker super.onCreate(savedInstanceState); 67*90c8c64dSAndroid Build Coastguard Worker 68*90c8c64dSAndroid Build Coastguard Worker setContentView(R.layout.sample_main); 69*90c8c64dSAndroid Build Coastguard Worker mTextStatus = (TextView) findViewById(R.id.textStatus); 70*90c8c64dSAndroid Build Coastguard Worker 71*90c8c64dSAndroid Build Coastguard Worker // get the list of background colors 72*90c8c64dSAndroid Build Coastguard Worker mColors = getResources().getIntArray(R.array.androidcolors); 73*90c8c64dSAndroid Build Coastguard Worker 74*90c8c64dSAndroid Build Coastguard Worker // Enable clicks on the 'change color' button 75*90c8c64dSAndroid Build Coastguard Worker mButton = (Button) findViewById(R.id.button1); 76*90c8c64dSAndroid Build Coastguard Worker mButton.setOnClickListener(new View.OnClickListener() { 77*90c8c64dSAndroid Build Coastguard Worker 78*90c8c64dSAndroid Build Coastguard Worker @Override 79*90c8c64dSAndroid Build Coastguard Worker public void onClick(View v) { 80*90c8c64dSAndroid Build Coastguard Worker showNextColor(); 81*90c8c64dSAndroid Build Coastguard Worker } 82*90c8c64dSAndroid Build Coastguard Worker }); 83*90c8c64dSAndroid Build Coastguard Worker 84*90c8c64dSAndroid Build Coastguard Worker // BEGIN_INCLUDE(getMediaRouter) 85*90c8c64dSAndroid Build Coastguard Worker // Get the MediaRouter service 86*90c8c64dSAndroid Build Coastguard Worker mMediaRouter = (MediaRouter) getSystemService(Context.MEDIA_ROUTER_SERVICE); 87*90c8c64dSAndroid Build Coastguard Worker // END_INCLUDE(getMediaRouter) 88*90c8c64dSAndroid Build Coastguard Worker } 89*90c8c64dSAndroid Build Coastguard Worker 90*90c8c64dSAndroid Build Coastguard Worker /** 91*90c8c64dSAndroid Build Coastguard Worker * Implementing a {@link android.media.MediaRouter.Callback} to update the displayed 92*90c8c64dSAndroid Build Coastguard Worker * {@link android.app.Presentation} when a route is selected, unselected or the 93*90c8c64dSAndroid Build Coastguard Worker * presentation display has changed. The provided stub implementation 94*90c8c64dSAndroid Build Coastguard Worker * {@link android.media.MediaRouter.SimpleCallback} is extended and only 95*90c8c64dSAndroid Build Coastguard Worker * {@link android.media.MediaRouter.SimpleCallback#onRouteSelected(android.media.MediaRouter, int, android.media.MediaRouter.RouteInfo)} 96*90c8c64dSAndroid Build Coastguard Worker * , 97*90c8c64dSAndroid Build Coastguard Worker * {@link android.media.MediaRouter.SimpleCallback#onRouteUnselected(android.media.MediaRouter, int, android.media.MediaRouter.RouteInfo)} 98*90c8c64dSAndroid Build Coastguard Worker * and 99*90c8c64dSAndroid Build Coastguard Worker * {@link android.media.MediaRouter.SimpleCallback#onRoutePresentationDisplayChanged(android.media.MediaRouter, android.media.MediaRouter.RouteInfo)} 100*90c8c64dSAndroid Build Coastguard Worker * are overridden to update the displayed {@link android.app.Presentation} in 101*90c8c64dSAndroid Build Coastguard Worker * {@link #updatePresentation()}. These callbacks enable or disable the 102*90c8c64dSAndroid Build Coastguard Worker * second screen presentation based on the routing provided by the 103*90c8c64dSAndroid Build Coastguard Worker * {@link android.media.MediaRouter} for {@link android.media.MediaRouter#ROUTE_TYPE_LIVE_VIDEO} 104*90c8c64dSAndroid Build Coastguard Worker * streams. @ 105*90c8c64dSAndroid Build Coastguard Worker */ 106*90c8c64dSAndroid Build Coastguard Worker private final MediaRouter.SimpleCallback mMediaRouterCallback = 107*90c8c64dSAndroid Build Coastguard Worker new MediaRouter.SimpleCallback() { 108*90c8c64dSAndroid Build Coastguard Worker 109*90c8c64dSAndroid Build Coastguard Worker // BEGIN_INCLUDE(SimpleCallback) 110*90c8c64dSAndroid Build Coastguard Worker /** 111*90c8c64dSAndroid Build Coastguard Worker * A new route has been selected as active. Disable the current 112*90c8c64dSAndroid Build Coastguard Worker * route and enable the new one. 113*90c8c64dSAndroid Build Coastguard Worker */ 114*90c8c64dSAndroid Build Coastguard Worker @Override 115*90c8c64dSAndroid Build Coastguard Worker public void onRouteSelected(MediaRouter router, int type, RouteInfo info) { 116*90c8c64dSAndroid Build Coastguard Worker updatePresentation(); 117*90c8c64dSAndroid Build Coastguard Worker } 118*90c8c64dSAndroid Build Coastguard Worker 119*90c8c64dSAndroid Build Coastguard Worker /** 120*90c8c64dSAndroid Build Coastguard Worker * The route has been unselected. 121*90c8c64dSAndroid Build Coastguard Worker */ 122*90c8c64dSAndroid Build Coastguard Worker @Override 123*90c8c64dSAndroid Build Coastguard Worker public void onRouteUnselected(MediaRouter router, int type, RouteInfo info) { 124*90c8c64dSAndroid Build Coastguard Worker updatePresentation(); 125*90c8c64dSAndroid Build Coastguard Worker 126*90c8c64dSAndroid Build Coastguard Worker } 127*90c8c64dSAndroid Build Coastguard Worker 128*90c8c64dSAndroid Build Coastguard Worker /** 129*90c8c64dSAndroid Build Coastguard Worker * The route's presentation display has changed. This callback 130*90c8c64dSAndroid Build Coastguard Worker * is called when the presentation has been activated, removed 131*90c8c64dSAndroid Build Coastguard Worker * or its properties have changed. 132*90c8c64dSAndroid Build Coastguard Worker */ 133*90c8c64dSAndroid Build Coastguard Worker @Override 134*90c8c64dSAndroid Build Coastguard Worker public void onRoutePresentationDisplayChanged(MediaRouter router, RouteInfo info) { 135*90c8c64dSAndroid Build Coastguard Worker updatePresentation(); 136*90c8c64dSAndroid Build Coastguard Worker } 137*90c8c64dSAndroid Build Coastguard Worker // END_INCLUDE(SimpleCallback) 138*90c8c64dSAndroid Build Coastguard Worker }; 139*90c8c64dSAndroid Build Coastguard Worker 140*90c8c64dSAndroid Build Coastguard Worker /** 141*90c8c64dSAndroid Build Coastguard Worker * Updates the displayed presentation to enable a secondary screen if it has 142*90c8c64dSAndroid Build Coastguard Worker * been selected in the {@link android.media.MediaRouter} for the 143*90c8c64dSAndroid Build Coastguard Worker * {@link android.media.MediaRouter#ROUTE_TYPE_LIVE_VIDEO} type. If no screen has been 144*90c8c64dSAndroid Build Coastguard Worker * selected by the {@link android.media.MediaRouter}, the current screen is disabled. 145*90c8c64dSAndroid Build Coastguard Worker * Otherwise a new {@link SamplePresentation} is initialized and shown on 146*90c8c64dSAndroid Build Coastguard Worker * the secondary screen. 147*90c8c64dSAndroid Build Coastguard Worker */ updatePresentation()148*90c8c64dSAndroid Build Coastguard Worker private void updatePresentation() { 149*90c8c64dSAndroid Build Coastguard Worker 150*90c8c64dSAndroid Build Coastguard Worker // BEGIN_INCLUDE(updatePresentationInit) 151*90c8c64dSAndroid Build Coastguard Worker // Get the selected route for live video 152*90c8c64dSAndroid Build Coastguard Worker RouteInfo selectedRoute = mMediaRouter.getSelectedRoute( 153*90c8c64dSAndroid Build Coastguard Worker MediaRouter.ROUTE_TYPE_LIVE_VIDEO); 154*90c8c64dSAndroid Build Coastguard Worker 155*90c8c64dSAndroid Build Coastguard Worker // Get its Display if a valid route has been selected 156*90c8c64dSAndroid Build Coastguard Worker Display selectedDisplay = null; 157*90c8c64dSAndroid Build Coastguard Worker if (selectedRoute != null) { 158*90c8c64dSAndroid Build Coastguard Worker selectedDisplay = selectedRoute.getPresentationDisplay(); 159*90c8c64dSAndroid Build Coastguard Worker } 160*90c8c64dSAndroid Build Coastguard Worker // END_INCLUDE(updatePresentationInit) 161*90c8c64dSAndroid Build Coastguard Worker 162*90c8c64dSAndroid Build Coastguard Worker // BEGIN_INCLUDE(updatePresentationDismiss) 163*90c8c64dSAndroid Build Coastguard Worker /* 164*90c8c64dSAndroid Build Coastguard Worker * Dismiss the current presentation if the display has changed or no new 165*90c8c64dSAndroid Build Coastguard Worker * route has been selected 166*90c8c64dSAndroid Build Coastguard Worker */ 167*90c8c64dSAndroid Build Coastguard Worker if (mPresentation != null && mPresentation.getDisplay() != selectedDisplay) { 168*90c8c64dSAndroid Build Coastguard Worker mPresentation.dismiss(); 169*90c8c64dSAndroid Build Coastguard Worker mPresentation = null; 170*90c8c64dSAndroid Build Coastguard Worker mButton.setEnabled(false); 171*90c8c64dSAndroid Build Coastguard Worker mTextStatus.setText(R.string.secondary_notconnected); 172*90c8c64dSAndroid Build Coastguard Worker } 173*90c8c64dSAndroid Build Coastguard Worker // END_INCLUDE(updatePresentationDismiss) 174*90c8c64dSAndroid Build Coastguard Worker 175*90c8c64dSAndroid Build Coastguard Worker // BEGIN_INCLUDE(updatePresentationNew) 176*90c8c64dSAndroid Build Coastguard Worker /* 177*90c8c64dSAndroid Build Coastguard Worker * Show a new presentation if the previous one has been dismissed and a 178*90c8c64dSAndroid Build Coastguard Worker * route has been selected. 179*90c8c64dSAndroid Build Coastguard Worker */ 180*90c8c64dSAndroid Build Coastguard Worker if (mPresentation == null && selectedDisplay != null) { 181*90c8c64dSAndroid Build Coastguard Worker 182*90c8c64dSAndroid Build Coastguard Worker // Initialise a new Presentation for the Display 183*90c8c64dSAndroid Build Coastguard Worker mPresentation = new SamplePresentation(this, selectedDisplay); 184*90c8c64dSAndroid Build Coastguard Worker mPresentation.setOnDismissListener(mOnDismissListener); 185*90c8c64dSAndroid Build Coastguard Worker 186*90c8c64dSAndroid Build Coastguard Worker // Try to show the presentation, this might fail if the display has 187*90c8c64dSAndroid Build Coastguard Worker // gone away in the mean time 188*90c8c64dSAndroid Build Coastguard Worker try { 189*90c8c64dSAndroid Build Coastguard Worker mPresentation.show(); 190*90c8c64dSAndroid Build Coastguard Worker mTextStatus.setText(getResources().getString(R.string.secondary_connected, 191*90c8c64dSAndroid Build Coastguard Worker selectedRoute.getName(MainActivity.this))); 192*90c8c64dSAndroid Build Coastguard Worker mButton.setEnabled(true); 193*90c8c64dSAndroid Build Coastguard Worker showNextColor(); 194*90c8c64dSAndroid Build Coastguard Worker } catch (WindowManager.InvalidDisplayException ex) { 195*90c8c64dSAndroid Build Coastguard Worker // Couldn't show presentation - display was already removed 196*90c8c64dSAndroid Build Coastguard Worker mPresentation = null; 197*90c8c64dSAndroid Build Coastguard Worker } 198*90c8c64dSAndroid Build Coastguard Worker } 199*90c8c64dSAndroid Build Coastguard Worker // END_INCLUDE(updatePresentationNew) 200*90c8c64dSAndroid Build Coastguard Worker 201*90c8c64dSAndroid Build Coastguard Worker } 202*90c8c64dSAndroid Build Coastguard Worker 203*90c8c64dSAndroid Build Coastguard Worker @Override onResume()204*90c8c64dSAndroid Build Coastguard Worker protected void onResume() { 205*90c8c64dSAndroid Build Coastguard Worker super.onResume(); 206*90c8c64dSAndroid Build Coastguard Worker 207*90c8c64dSAndroid Build Coastguard Worker // BEGIN_INCLUDE(addCallback) 208*90c8c64dSAndroid Build Coastguard Worker // Register a callback for all events related to live video devices 209*90c8c64dSAndroid Build Coastguard Worker mMediaRouter.addCallback(MediaRouter.ROUTE_TYPE_LIVE_VIDEO, mMediaRouterCallback); 210*90c8c64dSAndroid Build Coastguard Worker // END_INCLUDE(addCallback) 211*90c8c64dSAndroid Build Coastguard Worker 212*90c8c64dSAndroid Build Coastguard Worker // Show the 'Not connected' status message 213*90c8c64dSAndroid Build Coastguard Worker mButton.setEnabled(false); 214*90c8c64dSAndroid Build Coastguard Worker mTextStatus.setText(R.string.secondary_notconnected); 215*90c8c64dSAndroid Build Coastguard Worker 216*90c8c64dSAndroid Build Coastguard Worker // Update the displays based on the currently active routes 217*90c8c64dSAndroid Build Coastguard Worker updatePresentation(); 218*90c8c64dSAndroid Build Coastguard Worker } 219*90c8c64dSAndroid Build Coastguard Worker 220*90c8c64dSAndroid Build Coastguard Worker @Override onPause()221*90c8c64dSAndroid Build Coastguard Worker protected void onPause() { 222*90c8c64dSAndroid Build Coastguard Worker super.onPause(); 223*90c8c64dSAndroid Build Coastguard Worker 224*90c8c64dSAndroid Build Coastguard Worker // BEGIN_INCLUDE(onPause) 225*90c8c64dSAndroid Build Coastguard Worker // Stop listening for changes to media routes. 226*90c8c64dSAndroid Build Coastguard Worker mMediaRouter.removeCallback(mMediaRouterCallback); 227*90c8c64dSAndroid Build Coastguard Worker // END_INCLUDE(onPause) 228*90c8c64dSAndroid Build Coastguard Worker } 229*90c8c64dSAndroid Build Coastguard Worker 230*90c8c64dSAndroid Build Coastguard Worker @Override onStop()231*90c8c64dSAndroid Build Coastguard Worker protected void onStop() { 232*90c8c64dSAndroid Build Coastguard Worker super.onStop(); 233*90c8c64dSAndroid Build Coastguard Worker 234*90c8c64dSAndroid Build Coastguard Worker // BEGIN_INCLUDE(onStop) 235*90c8c64dSAndroid Build Coastguard Worker // Dismiss the presentation when the activity is not visible. 236*90c8c64dSAndroid Build Coastguard Worker if (mPresentation != null) { 237*90c8c64dSAndroid Build Coastguard Worker mPresentation.dismiss(); 238*90c8c64dSAndroid Build Coastguard Worker mPresentation = null; 239*90c8c64dSAndroid Build Coastguard Worker } 240*90c8c64dSAndroid Build Coastguard Worker // BEGIN_INCLUDE(onStop) 241*90c8c64dSAndroid Build Coastguard Worker } 242*90c8c64dSAndroid Build Coastguard Worker 243*90c8c64dSAndroid Build Coastguard Worker /** 244*90c8c64dSAndroid Build Coastguard Worker * Inflates the ActionBar or options menu. The menu file defines an item for 245*90c8c64dSAndroid Build Coastguard Worker * the {@link android.app.MediaRouteActionProvider}, which is registered here for all 246*90c8c64dSAndroid Build Coastguard Worker * live video devices using {@link android.media.MediaRouter#ROUTE_TYPE_LIVE_VIDEO}. 247*90c8c64dSAndroid Build Coastguard Worker */ 248*90c8c64dSAndroid Build Coastguard Worker @Override onCreateOptionsMenu(Menu menu)249*90c8c64dSAndroid Build Coastguard Worker public boolean onCreateOptionsMenu(Menu menu) { 250*90c8c64dSAndroid Build Coastguard Worker super.onCreateOptionsMenu(menu); 251*90c8c64dSAndroid Build Coastguard Worker 252*90c8c64dSAndroid Build Coastguard Worker getMenuInflater().inflate(R.menu.main, menu); 253*90c8c64dSAndroid Build Coastguard Worker 254*90c8c64dSAndroid Build Coastguard Worker // BEGIN_INCLUDE(MediaRouteActionProvider) 255*90c8c64dSAndroid Build Coastguard Worker // Configure the media router action provider 256*90c8c64dSAndroid Build Coastguard Worker MenuItem mediaRouteMenuItem = menu.findItem(R.id.menu_media_route); 257*90c8c64dSAndroid Build Coastguard Worker MediaRouteActionProvider mediaRouteActionProvider = 258*90c8c64dSAndroid Build Coastguard Worker (MediaRouteActionProvider) mediaRouteMenuItem.getActionProvider(); 259*90c8c64dSAndroid Build Coastguard Worker mediaRouteActionProvider.setRouteTypes(MediaRouter.ROUTE_TYPE_LIVE_VIDEO); 260*90c8c64dSAndroid Build Coastguard Worker // BEGIN_INCLUDE(MediaRouteActionProvider) 261*90c8c64dSAndroid Build Coastguard Worker 262*90c8c64dSAndroid Build Coastguard Worker return true; 263*90c8c64dSAndroid Build Coastguard Worker } 264*90c8c64dSAndroid Build Coastguard Worker 265*90c8c64dSAndroid Build Coastguard Worker /** 266*90c8c64dSAndroid Build Coastguard Worker * Listens for dismissal of the {@link SamplePresentation} and removes its 267*90c8c64dSAndroid Build Coastguard Worker * reference. 268*90c8c64dSAndroid Build Coastguard Worker */ 269*90c8c64dSAndroid Build Coastguard Worker private final DialogInterface.OnDismissListener mOnDismissListener = 270*90c8c64dSAndroid Build Coastguard Worker new DialogInterface.OnDismissListener() { 271*90c8c64dSAndroid Build Coastguard Worker @Override 272*90c8c64dSAndroid Build Coastguard Worker public void onDismiss(DialogInterface dialog) { 273*90c8c64dSAndroid Build Coastguard Worker if (dialog == mPresentation) { 274*90c8c64dSAndroid Build Coastguard Worker mPresentation = null; 275*90c8c64dSAndroid Build Coastguard Worker } 276*90c8c64dSAndroid Build Coastguard Worker } 277*90c8c64dSAndroid Build Coastguard Worker }; 278*90c8c64dSAndroid Build Coastguard Worker 279*90c8c64dSAndroid Build Coastguard Worker // Views used to display status information on the primary screen 280*90c8c64dSAndroid Build Coastguard Worker private TextView mTextStatus; 281*90c8c64dSAndroid Build Coastguard Worker private Button mButton; 282*90c8c64dSAndroid Build Coastguard Worker 283*90c8c64dSAndroid Build Coastguard Worker // selected color index 284*90c8c64dSAndroid Build Coastguard Worker private int mColor = 0; 285*90c8c64dSAndroid Build Coastguard Worker 286*90c8c64dSAndroid Build Coastguard Worker // background colors 287*90c8c64dSAndroid Build Coastguard Worker public int[] mColors; 288*90c8c64dSAndroid Build Coastguard Worker 289*90c8c64dSAndroid Build Coastguard Worker /** 290*90c8c64dSAndroid Build Coastguard Worker * Displays the next color on the secondary screen if it is activate. 291*90c8c64dSAndroid Build Coastguard Worker */ showNextColor()292*90c8c64dSAndroid Build Coastguard Worker private void showNextColor() { 293*90c8c64dSAndroid Build Coastguard Worker if (mPresentation != null) { 294*90c8c64dSAndroid Build Coastguard Worker // a second screen is active and initialized, show the next color 295*90c8c64dSAndroid Build Coastguard Worker mPresentation.setColor(mColors[mColor]); 296*90c8c64dSAndroid Build Coastguard Worker mColor = (mColor + 1) % mColors.length; 297*90c8c64dSAndroid Build Coastguard Worker } 298*90c8c64dSAndroid Build Coastguard Worker } 299*90c8c64dSAndroid Build Coastguard Worker 300*90c8c64dSAndroid Build Coastguard Worker } 301