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