AdapterViewFlipper.java revision 4725660292bcf11c84e9c7da127fd0215fb58e81
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,
654725660292bcf11c84e9c7da127fd0215fb58e81Adam Cohen                com.android.internal.R.styleable.AdapterViewFlipper);
663db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mFlipInterval = a.getInt(
674725660292bcf11c84e9c7da127fd0215fb58e81Adam Cohen                com.android.internal.R.styleable.AdapterViewFlipper_flipInterval, DEFAULT_INTERVAL);
683db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mAutoStart = a.getBoolean(
694725660292bcf11c84e9c7da127fd0215fb58e81Adam Cohen                com.android.internal.R.styleable.AdapterViewFlipper_autoStart, false);
701b065cd1401253f999caa5d0ac12909407cef00eAdam Cohen
714725660292bcf11c84e9c7da127fd0215fb58e81Adam Cohen        // A view flipper should cycle through the views
724725660292bcf11c84e9c7da127fd0215fb58e81Adam Cohen        mLoopViews = true;
731b065cd1401253f999caa5d0ac12909407cef00eAdam Cohen
743db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        a.recycle();
753db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
763db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
773db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
783db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        @Override
793db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        public void onReceive(Context context, Intent intent) {
803db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            final String action = intent.getAction();
813db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            if (Intent.ACTION_SCREEN_OFF.equals(action)) {
823db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                mUserPresent = false;
833db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                updateRunning();
843db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            } else if (Intent.ACTION_USER_PRESENT.equals(action)) {
853db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                mUserPresent = true;
863db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                updateRunning(false);
873db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            }
883db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        }
893db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    };
903db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
913db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    @Override
923db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    protected void onAttachedToWindow() {
933db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        super.onAttachedToWindow();
943db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
953db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        // Listen for broadcasts related to user-presence
963db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        final IntentFilter filter = new IntentFilter();
973db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        filter.addAction(Intent.ACTION_SCREEN_OFF);
983db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        filter.addAction(Intent.ACTION_USER_PRESENT);
993db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        getContext().registerReceiver(mReceiver, filter);
1003db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1013db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        if (mAutoStart) {
1023db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            // Automatically start when requested
1033db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            startFlipping();
1043db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        }
1053db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1063db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1073db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    @Override
1083db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    protected void onDetachedFromWindow() {
1093db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        super.onDetachedFromWindow();
1103db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mVisible = false;
1113db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1123db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        getContext().unregisterReceiver(mReceiver);
1133db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning();
1143db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1153db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1163db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    @Override
1173db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    protected void onWindowVisibilityChanged(int visibility) {
1183db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        super.onWindowVisibilityChanged(visibility);
1193db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mVisible = (visibility == VISIBLE);
1203db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning(false);
1213db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1223db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1233db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    @Override
1243db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public void setAdapter(Adapter adapter) {
1253db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        super.setAdapter(adapter);
1263db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning();
1273db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1283db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1293db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
1303db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * How long to wait before flipping to the next view
1313db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     *
1323db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * @param milliseconds
1333db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     *            time in milliseconds
1343db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
1353db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public void setFlipInterval(int milliseconds) {
1363db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mFlipInterval = milliseconds;
1373db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1383db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1393db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
1403db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Start a timer to cycle through child views
1413db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
1423db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public void startFlipping() {
1433db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mStarted = true;
1443db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning();
1453db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1463db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1473db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
1483db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * No more flips
1493db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
1503db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public void stopFlipping() {
1513db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mStarted = false;
1523db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning();
1533db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1543db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1553db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
156b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen    * {@inheritDoc}
157b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen    */
158b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   @Override
159b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   @RemotableViewMethod
160b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   public void showNext() {
161b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       // if the flipper is currently flipping automatically, and showNext() is called
162b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       // we should we should make sure to reset the timer
163b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       if (mRunning) {
164b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           mHandler.removeMessages(FLIP_MSG);
165b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           Message msg = mHandler.obtainMessage(FLIP_MSG);
166b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           mHandler.sendMessageDelayed(msg, mFlipInterval);
167b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       }
168b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       super.showNext();
169b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   }
170b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen
171b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   /**
172b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen    * {@inheritDoc}
173b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen    */
174b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   @Override
175b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   @RemotableViewMethod
176b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   public void showPrevious() {
177b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       // if the flipper is currently flipping automatically, and showPrevious() is called
178b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       // we should we should make sure to reset the timer
179b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       if (mRunning) {
180b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           mHandler.removeMessages(FLIP_MSG);
181b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           Message msg = mHandler.obtainMessage(FLIP_MSG);
182b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen           mHandler.sendMessageDelayed(msg, mFlipInterval);
183b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       }
184b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen       super.showPrevious();
185b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen   }
186b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen
187b04f7ad90b7d5d5e0998e3b56960004cf56e6e8fAdam Cohen    /**
1883db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Internal method to start or stop dispatching flip {@link Message} based
1893db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * on {@link #mRunning} and {@link #mVisible} state.
1903db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
1913db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private void updateRunning() {
1923db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        // by default when we update running, we want the
1933db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        // current view to animate in
1943db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        updateRunning(true);
1953db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
1963db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
1973db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
1983db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Internal method to start or stop dispatching flip {@link Message} based
1993db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * on {@link #mRunning} and {@link #mVisible} state.
2003db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     *
2013db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * @param flipNow Determines whether or not to execute the animation now, in
2023db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     *            addition to queuing future flips. If omitted, defaults to
2033db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     *            true.
2043db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
2053db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private void updateRunning(boolean flipNow) {
206a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen        boolean running = !mAdvancedByHost && mVisible && mStarted && mUserPresent
207a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen                && mAdapter != null;
2083db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        if (running != mRunning) {
2093db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            if (running) {
2103db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                showOnly(mWhichChild, flipNow);
2113db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                Message msg = mHandler.obtainMessage(FLIP_MSG);
2123db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                mHandler.sendMessageDelayed(msg, mFlipInterval);
2133db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            } else {
2143db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                mHandler.removeMessages(FLIP_MSG);
2153db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            }
2163db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            mRunning = running;
2173db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        }
2183db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        if (LOGD) {
2193db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            Log.d(TAG, "updateRunning() mVisible=" + mVisible + ", mStarted=" + mStarted
2203db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                    + ", mUserPresent=" + mUserPresent + ", mRunning=" + mRunning);
2213db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        }
2223db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
2233db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
2243db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
2253db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Returns true if the child views are flipping.
2263db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
2273db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public boolean isFlipping() {
2283db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        return mStarted;
2293db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
2303db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
2313db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
2323db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Set if this view automatically calls {@link #startFlipping()} when it
2333db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * becomes attached to a window.
2343db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
2353db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public void setAutoStart(boolean autoStart) {
2363db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        mAutoStart = autoStart;
2373db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
2383db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
2393db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    /**
2403db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * Returns true if this view automatically calls {@link #startFlipping()}
2413db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     * when it becomes attached to a window.
2423db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen     */
2433db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    public boolean isAutoStart() {
2443db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        return mAutoStart;
2453db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    }
2463db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
2473db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private final int FLIP_MSG = 1;
2483db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen
2493db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    private final Handler mHandler = new Handler() {
2503db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        @Override
2513db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        public void handleMessage(Message msg) {
2523db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            if (msg.what == FLIP_MSG) {
2533db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                if (mRunning) {
2543db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                    showNext();
2553db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen                }
2563db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen            }
2573db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen        }
2583db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen    };
259a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen
2600e2de6d7187ef67ec00a2f2544450caa4a239c39Adam Cohen    /**
2610e2de6d7187ef67ec00a2f2544450caa4a239c39Adam Cohen     * Called by an {@link android.appwidget.AppWidgetHost} to indicate that it will be
2620e2de6d7187ef67ec00a2f2544450caa4a239c39Adam Cohen     * automatically advancing the views of this {@link AdapterViewFlipper} by calling
2630e2de6d7187ef67ec00a2f2544450caa4a239c39Adam Cohen     * {@link AdapterViewFlipper#advance()} at some point in the future. This allows
2640e2de6d7187ef67ec00a2f2544450caa4a239c39Adam Cohen     * {@link AdapterViewFlipper} to prepare by no longer Advancing its children.
2650e2de6d7187ef67ec00a2f2544450caa4a239c39Adam Cohen     */
266a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen    @Override
2670e2de6d7187ef67ec00a2f2544450caa4a239c39Adam Cohen    public void fyiWillBeAdvancedByHostKThx() {
268a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen        mAdvancedByHost = true;
269a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen        updateRunning(false);
270a02fdf1ba03fad71cc80a89dfc74b17456d5b4a5Adam Cohen    }
2713db40678d33c2b5f90c380966d36b3e10ed11f05Adam Cohen}
272