AdapterViewFlipper.java revision a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5
13db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen/*
23db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * Copyright (C) 2010 The Android Open Source Project
33db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen *
43db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * Licensed under the Apache License, Version 2.0 (the "License");
53db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * you may not use this file except in compliance with the License.
63db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * You may obtain a copy of the License at
73db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen *
83db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen *      http://www.apache.org/licenses/LICENSE-2.0
93db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen *
103db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * Unless required by applicable law or agreed to in writing, software
113db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * distributed under the License is distributed on an "AS IS" BASIS,
123db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * See the License for the specific language governing permissions and
143db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * limitations under the License.
153db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen */
163db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
173db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenpackage android.widget;
183db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
19ef52176f1244a5bb98d82a0c8c7f4351edec17a1Adam Cohenimport android.animation.ObjectAnimator;
203db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenimport android.content.BroadcastReceiver;
213db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenimport android.content.Context;
223db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenimport android.content.Intent;
233db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenimport android.content.IntentFilter;
243db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenimport android.content.res.TypedArray;
253db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenimport android.os.Handler;
263db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenimport android.os.Message;
273db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenimport android.util.AttributeSet;
283db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenimport android.util.Log;
292dd2197805edb4d9547b143deef2226413218f4cAdam Cohenimport android.view.RemotableViewMethod;
303db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenimport android.view.animation.AlphaAnimation;
313db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenimport android.widget.RemoteViews.RemoteView;
323db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
333db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen/**
343db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * Simple {@link ViewAnimator} that will animate between two or more views
353db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * that have been added to it.  Only one child is shown at a time.  If
363db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * requested, can automatically flip between each child at a regular interval.
373db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen *
383db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * @attr ref android.R.styleable#AdapterViewFlipper_flipInterval
393db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen * @attr ref android.R.styleable#AdapterViewFlipper_autoStart
403db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen */
413db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen@RemoteView
423db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohenpublic class AdapterViewFlipper extends AdapterViewAnimator {
433db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private static final String TAG = "ViewFlipper";
443db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private static final boolean LOGD = false;
453db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
463db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private static final int DEFAULT_INTERVAL = 10000;
473db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
483db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private int mFlipInterval = DEFAULT_INTERVAL;
493db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private boolean mAutoStart = false;
503db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
513db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private boolean mRunning = false;
523db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private boolean mStarted = false;
533db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private boolean mVisible = false;
543db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private boolean mUserPresent = true;
55a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen    private boolean mAdvancedByHost = false;
563db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
573db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public AdapterViewFlipper(Context context) {
583db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        super(context);
593db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
603db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
613db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public AdapterViewFlipper(Context context, AttributeSet attrs) {
623db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        super(context, attrs);
633db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
643db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        TypedArray a = context.obtainStyledAttributes(attrs,
653db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                com.android.internal.R.styleable.ViewFlipper);
663db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mFlipInterval = a.getInt(
673db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                com.android.internal.R.styleable.ViewFlipper_flipInterval, DEFAULT_INTERVAL);
683db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mAutoStart = a.getBoolean(
693db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                com.android.internal.R.styleable.ViewFlipper_autoStart, false);
701b065cd1401253f999caa5d0ac12909407cef00eAdam Cohen
711b065cd1401253f999caa5d0ac12909407cef00eAdam Cohen        // By default we want the flipper to loop
721b065cd1401253f999caa5d0ac12909407cef00eAdam Cohen        mLoopViews = a.getBoolean(
731b065cd1401253f999caa5d0ac12909407cef00eAdam Cohen                com.android.internal.R.styleable.AdapterViewAnimator_loopViews, true);
741b065cd1401253f999caa5d0ac12909407cef00eAdam Cohen
753db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        a.recycle();
763db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
773db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
783db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
793db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        @Override
803db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        public void onReceive(Context context, Intent intent) {
813db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            final String action = intent.getAction();
823db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            if (Intent.ACTION_SCREEN_OFF.equals(action)) {
833db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                mUserPresent = false;
843db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                updateRunning();
853db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            } else if (Intent.ACTION_USER_PRESENT.equals(action)) {
863db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                mUserPresent = true;
873db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                updateRunning(false);
883db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            }
893db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        }
903db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    };
913db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
923db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    @Override
933db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    protected void onAttachedToWindow() {
943db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        super.onAttachedToWindow();
953db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
963db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        // Listen for broadcasts related to user-presence
973db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        final IntentFilter filter = new IntentFilter();
983db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        filter.addAction(Intent.ACTION_SCREEN_OFF);
993db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        filter.addAction(Intent.ACTION_USER_PRESENT);
1003db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        getContext().registerReceiver(mReceiver, filter);
1013db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1023db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        if (mAutoStart) {
1033db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            // Automatically start when requested
1043db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            startFlipping();
1053db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        }
1063db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1073db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1083db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    @Override
1093db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    protected void onDetachedFromWindow() {
1103db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        super.onDetachedFromWindow();
1113db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mVisible = false;
1123db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1133db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        getContext().unregisterReceiver(mReceiver);
1143db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning();
1153db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1163db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1173db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    @Override
1183db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    protected void onWindowVisibilityChanged(int visibility) {
1193db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        super.onWindowVisibilityChanged(visibility);
1203db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mVisible = (visibility == VISIBLE);
1213db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning(false);
1223db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1233db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1243db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    @Override
1253db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public void setAdapter(Adapter adapter) {
1263db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        super.setAdapter(adapter);
1273db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning();
1283db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1293db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1303db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
1313db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * How long to wait before flipping to the next view
1323db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     *
1333db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * @param milliseconds
1343db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     *            time in milliseconds
1353db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
1363db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public void setFlipInterval(int milliseconds) {
1373db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mFlipInterval = milliseconds;
1383db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1393db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1403db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
1413db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Start a timer to cycle through child views
1423db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
1433db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public void startFlipping() {
1443db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mStarted = true;
1453db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning();
1463db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1473db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1483db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
1493db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * No more flips
1503db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
1513db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public void stopFlipping() {
1523db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mStarted = false;
1533db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning();
1543db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1553db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1563db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
157b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen    * {@inheritDoc}
158b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen    */
159b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   @Override
160b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   @RemotableViewMethod
161b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   public void showNext() {
162b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       // if the flipper is currently flipping automatically, and showNext() is called
163b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       // we should we should make sure to reset the timer
164b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       if (mRunning) {
165b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           mHandler.removeMessages(FLIP_MSG);
166b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           Message msg = mHandler.obtainMessage(FLIP_MSG);
167b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           mHandler.sendMessageDelayed(msg, mFlipInterval);
168b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       }
169b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       super.showNext();
170b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   }
171b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen
172b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   /**
173b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen    * {@inheritDoc}
174b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen    */
175b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   @Override
176b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   @RemotableViewMethod
177b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   public void showPrevious() {
178b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       // if the flipper is currently flipping automatically, and showPrevious() is called
179b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       // we should we should make sure to reset the timer
180b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       if (mRunning) {
181b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           mHandler.removeMessages(FLIP_MSG);
182b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           Message msg = mHandler.obtainMessage(FLIP_MSG);
183b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           mHandler.sendMessageDelayed(msg, mFlipInterval);
184b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       }
185b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       super.showPrevious();
186b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   }
187b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen
188b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen    /**
1893db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Internal method to start or stop dispatching flip {@link Message} based
1903db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * on {@link #mRunning} and {@link #mVisible} state.
1913db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
1923db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private void updateRunning() {
1933db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        // by default when we update running, we want the
1943db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        // current view to animate in
1953db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning(true);
1963db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1973db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1983db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
1993db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Internal method to start or stop dispatching flip {@link Message} based
2003db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * on {@link #mRunning} and {@link #mVisible} state.
2013db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     *
2023db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * @param flipNow Determines whether or not to execute the animation now, in
2033db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     *            addition to queuing future flips. If omitted, defaults to
2043db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     *            true.
2053db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
2063db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private void updateRunning(boolean flipNow) {
207a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen        boolean running = !mAdvancedByHost && mVisible && mStarted && mUserPresent
208a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen                && mAdapter != null;
2093db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        if (running != mRunning) {
2103db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            if (running) {
2113db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                showOnly(mWhichChild, flipNow);
2123db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                Message msg = mHandler.obtainMessage(FLIP_MSG);
2133db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                mHandler.sendMessageDelayed(msg, mFlipInterval);
2143db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            } else {
2153db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                mHandler.removeMessages(FLIP_MSG);
2163db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            }
2173db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            mRunning = running;
2183db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        }
2193db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        if (LOGD) {
2203db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            Log.d(TAG, "updateRunning() mVisible=" + mVisible + ", mStarted=" + mStarted
2213db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                    + ", mUserPresent=" + mUserPresent + ", mRunning=" + mRunning);
2223db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        }
2233db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
2243db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
2253db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
2263db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Returns true if the child views are flipping.
2273db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
2283db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public boolean isFlipping() {
2293db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        return mStarted;
2303db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
2313db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
2323db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
2333db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Set if this view automatically calls {@link #startFlipping()} when it
2343db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * becomes attached to a window.
2353db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
2363db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public void setAutoStart(boolean autoStart) {
2373db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mAutoStart = autoStart;
2383db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
2393db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
2403db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
2413db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Returns true if this view automatically calls {@link #startFlipping()}
2423db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * when it becomes attached to a window.
2433db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
2443db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public boolean isAutoStart() {
2453db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        return mAutoStart;
2463db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
2473db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
2483db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private final int FLIP_MSG = 1;
2493db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
2503db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private final Handler mHandler = new Handler() {
2513db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        @Override
2523db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        public void handleMessage(Message msg) {
2533db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            if (msg.what == FLIP_MSG) {
2543db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                if (mRunning) {
2553db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                    showNext();
2563db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                }
2573db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            }
2583db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        }
2593db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    };
260a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen
261a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen    @Override
262a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen    public void willBeAdvancedByHost() {
263a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen        mAdvancedByHost = true;
264a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen        updateRunning(false);
265a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen    }
2663db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen}
267