169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown/*
269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * Copyright (C) 2013 The Android Open Source Project
369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown *
469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * you may not use this file except in compliance with the License.
669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * You may obtain a copy of the License at
769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown *
869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown *
1069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * Unless required by applicable law or agreed to in writing, software
1169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * See the License for the specific language governing permissions and
1469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * limitations under the License.
1569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown */
1669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
1769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brownpackage com.android.media.remotedisplay.test;
1869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
1969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brownimport com.android.media.remotedisplay.RemoteDisplay;
2069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brownimport com.android.media.remotedisplay.RemoteDisplayProvider;
2169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
2269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brownimport android.app.Service;
2369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brownimport android.content.Intent;
2469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brownimport android.os.Handler;
2569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brownimport android.os.IBinder;
2669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brownimport android.util.Log;
2769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
2869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown/**
2969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown * Remote display provider implementation that publishes working routes.
3069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown */
3169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brownpublic class RemoteDisplayProviderService extends Service {
3269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown    private static final String TAG = "RemoteDisplayProviderTest";
3369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
3469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown    private Provider mProvider;
3569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
3669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown    @Override
3769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown    public IBinder onBind(Intent intent) {
3869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        if (intent.getAction().equals(RemoteDisplayProvider.SERVICE_INTERFACE)) {
3969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            if (mProvider == null) {
4069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                mProvider = new Provider();
4169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                return mProvider.getBinder();
4269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            }
4369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        }
4469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        return null;
4569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown    }
4669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
4769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown    final class Provider extends RemoteDisplayProvider {
4869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        private RemoteDisplay mTestDisplay1; // variable volume
4969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        private RemoteDisplay mTestDisplay2; // fixed volume
5069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        private RemoteDisplay mTestDisplay3; // not available
5169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        private RemoteDisplay mTestDisplay4; // in use
5269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        private RemoteDisplay mTestDisplay5; // available but ignores request to connect
5369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        private RemoteDisplay mTestDisplay6; // available but never finishes connecting
5469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        private RemoteDisplay mTestDisplay7; // blinks in and out of existence
5539ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown        private RemoteDisplay mTestDisplay8; // available but connecting attempt flakes out
5639ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown        private RemoteDisplay mTestDisplay9; // available but connection flakes out
5739ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown        private RemoteDisplay mTestDisplay10; // available and reconnects periodically
5869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
5969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        private final Handler mHandler;
6069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        private boolean mBlinking;
6169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
6269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        public Provider() {
6369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            super(RemoteDisplayProviderService.this);
6469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            mHandler = new Handler(getMainLooper());
6569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        }
6669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
6769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        @Override
6869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        public void onDiscoveryModeChanged(int mode) {
6969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            Log.d(TAG, "onDiscoveryModeChanged: mode=" + mode);
7069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
7169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            if (mode != DISCOVERY_MODE_NONE) {
7269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                // When discovery begins, go find all of the routes.
7369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                if (mTestDisplay1 == null) {
7469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay1 = new RemoteDisplay("testDisplay1",
7569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                            "Test Display 1 (variable)");
7669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay1.setDescription("Variable volume");
7769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay1.setStatus(RemoteDisplay.STATUS_AVAILABLE);
7869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay1.setVolume(10);
7969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay1.setVolumeHandling(RemoteDisplay.PLAYBACK_VOLUME_VARIABLE);
8069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay1.setVolumeMax(15);
8169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    addDisplay(mTestDisplay1);
8269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                }
8369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                if (mTestDisplay2 == null) {
8469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay2 = new RemoteDisplay("testDisplay2",
8569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                            "Test Display 2 (fixed)");
8669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay2.setDescription("Fixed volume");
8769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay2.setStatus(RemoteDisplay.STATUS_AVAILABLE);
8869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    addDisplay(mTestDisplay2);
8969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                }
9069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                if (mTestDisplay3 == null) {
9169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay3 = new RemoteDisplay("testDisplay3",
9269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                            "Test Display 3 (unavailable)");
9369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay3.setDescription("Always unavailable");
9469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay3.setStatus(RemoteDisplay.STATUS_NOT_AVAILABLE);
9569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    addDisplay(mTestDisplay3);
9669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                }
9769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                if (mTestDisplay4 == null) {
9869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay4 = new RemoteDisplay("testDisplay4",
9969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                            "Test Display 4 (in-use)");
10069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay4.setDescription("Always in-use");
10169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay4.setStatus(RemoteDisplay.STATUS_IN_USE);
10269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    addDisplay(mTestDisplay4);
10369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                }
10469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                if (mTestDisplay5 == null) {
10569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay5 = new RemoteDisplay("testDisplay5",
10669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                            "Test Display 5 (connect ignored)");
10769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay5.setDescription("Ignores connect");
10869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay5.setStatus(RemoteDisplay.STATUS_AVAILABLE);
10969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    addDisplay(mTestDisplay5);
11069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                }
11169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                if (mTestDisplay6 == null) {
11269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay6 = new RemoteDisplay("testDisplay6",
11369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                            "Test Display 6 (connect hangs)");
11469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay6.setDescription("Never finishes connecting");
11569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay6.setStatus(RemoteDisplay.STATUS_AVAILABLE);
11669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    addDisplay(mTestDisplay6);
11769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                }
11839ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                if (mTestDisplay8 == null) {
11939ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    mTestDisplay8 = new RemoteDisplay("testDisplay8",
12039ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            "Test Display 8 (flaky when connecting)");
12139ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    mTestDisplay8.setDescription("Aborts spontaneously while connecting");
12239ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    mTestDisplay8.setStatus(RemoteDisplay.STATUS_AVAILABLE);
12339ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    addDisplay(mTestDisplay8);
12439ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                }
12539ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                if (mTestDisplay9 == null) {
12639ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    mTestDisplay9 = new RemoteDisplay("testDisplay9",
12739ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            "Test Display 9 (flaky when connected)");
12839ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    mTestDisplay9.setDescription("Aborts spontaneously while connected");
12939ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    mTestDisplay9.setStatus(RemoteDisplay.STATUS_AVAILABLE);
13039ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    addDisplay(mTestDisplay9);
13139ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                }
13239ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                if (mTestDisplay10 == null) {
13339ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    mTestDisplay10 = new RemoteDisplay("testDisplay10",
13439ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            "Test Display 10 (reconnects periodically)");
13539ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    mTestDisplay10.setDescription("Reconnects spontaneously");
13639ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    mTestDisplay10.setStatus(RemoteDisplay.STATUS_AVAILABLE);
13739ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    addDisplay(mTestDisplay10);
13839ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                }
13969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            } else {
14069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                // When discovery ends, go hide some of the routes we can't actually use.
14169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                // This isn't something a normal route provider would do though.
14269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                // The routes will usually stay published.
14369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                if (mTestDisplay3 != null) {
14469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    removeDisplay(mTestDisplay3);
14569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay3 = null;
14669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                }
14769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                if (mTestDisplay4 != null) {
14869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    removeDisplay(mTestDisplay4);
14969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay4 = null;
15069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                }
15169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            }
15269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
15369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            // When active discovery is on, pretend there's a route that we can't quite
15469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            // reach that blinks in and out of existence.
15569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            if (mode == DISCOVERY_MODE_ACTIVE) {
15669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                if (!mBlinking) {
15769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mBlinking = true;
15869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mHandler.post(mBlink);
15969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                }
16069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            } else {
16169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                mBlinking = false;
16269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            }
16369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        }
16469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
16569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        @Override
16669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        public void onConnect(final RemoteDisplay display) {
16769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            Log.d(TAG, "onConnect: display.getId()=" + display.getId());
16869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
16969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            if (display == mTestDisplay1 || display == mTestDisplay2) {
17069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                display.setStatus(RemoteDisplay.STATUS_CONNECTING);
17139ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                updateDisplay(display);
17269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                mHandler.postDelayed(new Runnable() {
17369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    @Override
17469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    public void run() {
17569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                        if ((display == mTestDisplay1 || display == mTestDisplay2)
17669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                                && display.getStatus() == RemoteDisplay.STATUS_CONNECTING) {
17769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                            display.setStatus(RemoteDisplay.STATUS_CONNECTED);
17869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                            updateDisplay(display);
17969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                        }
18069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    }
18169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                }, 2000);
18239ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown            } else if (display == mTestDisplay6 || display == mTestDisplay7) {
18369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                // never finishes connecting
18469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                display.setStatus(RemoteDisplay.STATUS_CONNECTING);
18569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                updateDisplay(display);
18639ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown            } else if (display == mTestDisplay8) {
18739ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                // flakes out while connecting
18839ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                display.setStatus(RemoteDisplay.STATUS_CONNECTING);
18939ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                updateDisplay(display);
19039ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                mHandler.postDelayed(new Runnable() {
19139ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    @Override
19239ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    public void run() {
19339ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                        if ((display == mTestDisplay8)
19439ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                                && display.getStatus() == RemoteDisplay.STATUS_CONNECTING) {
19539ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            display.setStatus(RemoteDisplay.STATUS_AVAILABLE);
19639ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            updateDisplay(display);
19739ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                        }
19839ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    }
19939ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                }, 2000);
20039ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown            } else if (display == mTestDisplay9) {
20139ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                // flakes out when connected
20239ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                display.setStatus(RemoteDisplay.STATUS_CONNECTING);
20339ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                updateDisplay(display);
20439ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                mHandler.postDelayed(new Runnable() {
20539ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    @Override
20639ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    public void run() {
20739ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                        if ((display == mTestDisplay9)
20839ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                                && display.getStatus() == RemoteDisplay.STATUS_CONNECTING) {
20939ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            display.setStatus(RemoteDisplay.STATUS_CONNECTED);
21039ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            updateDisplay(display);
21139ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                        }
21239ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    }
21339ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                }, 2000);
21439ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                mHandler.postDelayed(new Runnable() {
21539ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    @Override
21639ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    public void run() {
21739ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                        if ((display == mTestDisplay9)
21839ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                                && display.getStatus() == RemoteDisplay.STATUS_CONNECTED) {
21939ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            display.setStatus(RemoteDisplay.STATUS_AVAILABLE);
22039ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            updateDisplay(display);
22139ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                        }
22239ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    }
22339ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                }, 5000);
22439ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown            } else if (display == mTestDisplay10) {
22539ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                display.setStatus(RemoteDisplay.STATUS_CONNECTING);
22639ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                updateDisplay(display);
22739ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                mHandler.postDelayed(new Runnable() {
22839ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    @Override
22939ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    public void run() {
23039ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                        if (display == mTestDisplay10) {
23139ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            if (display.getStatus() == RemoteDisplay.STATUS_CONNECTING) {
23239ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                                display.setStatus(RemoteDisplay.STATUS_CONNECTED);
23339ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                                updateDisplay(display);
23439ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                                mHandler.postDelayed(this, 7000);
23539ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            } else if (display.getStatus() == RemoteDisplay.STATUS_CONNECTED) {
23639ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                                display.setStatus(RemoteDisplay.STATUS_CONNECTING);
23739ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                                updateDisplay(display);
23839ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                                mHandler.postDelayed(this, 2000);
23939ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                            }
24039ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                        }
24139ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    }
24239ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                }, 2000);
24369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            }
24469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        }
24569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
24669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        @Override
24769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        public void onDisconnect(RemoteDisplay display) {
24869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            Log.d(TAG, "onDisconnect: display.getId()=" + display.getId());
24969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
25069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            if (display == mTestDisplay1 || display == mTestDisplay2
25139ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    || display == mTestDisplay6 || display == mTestDisplay8
25239ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown                    || display == mTestDisplay9 || display == mTestDisplay10) {
25369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                display.setStatus(RemoteDisplay.STATUS_AVAILABLE);
25469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                updateDisplay(display);
25569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            }
25669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        }
25769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
25869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        @Override
25969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        public void onSetVolume(RemoteDisplay display, int volume) {
26069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            Log.d(TAG, "onSetVolume: display.getId()=" + display.getId()
26169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    + ", volume=" + volume);
26269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
26369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            if (display == mTestDisplay1) {
26469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                display.setVolume(Math.max(0, Math.min(display.getVolumeMax(), volume)));
26569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                updateDisplay(display);
26669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            }
26769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        }
26869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
26969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        @Override
27069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        public void onAdjustVolume(RemoteDisplay display, int delta) {
27169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            Log.d(TAG, "onAdjustVolume: display.getId()=" + display.getId()
27269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    + ", delta=" + delta);
27369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
27469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            if (display == mTestDisplay1) {
27569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                display.setVolume(Math.max(0, Math.min(display.getVolumeMax(),
27669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                        display .getVolume() + delta)));
27769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                updateDisplay(display);
27869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            }
27969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        }
28069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
28169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        @Override
28269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        public void addDisplay(RemoteDisplay display) {
28369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            Log.d(TAG, "addDisplay: display=" + display);
28469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            super.addDisplay(display);
28569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        }
28669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
28769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        @Override
28869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        public void removeDisplay(RemoteDisplay display) {
28969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            Log.d(TAG, "removeDisplay: display=" + display);
29069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            super.removeDisplay(display);
29169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        }
29269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
29369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        @Override
29469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        public void updateDisplay(RemoteDisplay display) {
29569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            Log.d(TAG, "updateDisplay: display=" + display);
29669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            super.updateDisplay(display);
29769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        }
29869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown
29969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        private final Runnable mBlink = new Runnable() {
30069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            @Override
30169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            public void run() {
30269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                if (mTestDisplay7 == null) {
30369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    if (mBlinking) {
30469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                        mTestDisplay7 = new RemoteDisplay("testDisplay7",
30569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                                "Test Display 7 (blinky)");
30669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                        mTestDisplay7.setDescription("Comes and goes but can't connect");
30769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                        mTestDisplay7.setStatus(RemoteDisplay.STATUS_AVAILABLE);
30869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                        addDisplay(mTestDisplay7);
30969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                        mHandler.postDelayed(this, 7000);
31069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    }
31169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                } else {
31269b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    removeDisplay(mTestDisplay7);
31369b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    mTestDisplay7 = null;
31469b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    if (mBlinking) {
31569b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                        mHandler.postDelayed(this, 4000);
31669b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                    }
31769b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown                }
31869b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown            }
31969b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown        };
32069b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown    }
32169b07161bebdb2c726e3a826c2268866f1a94517Jeff Brown}
322