ViewRootImpl.java revision 70a3f677bf015d8641f41d149b76d362bb2b801c
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
196b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.Manifest;
20cca2c9807206f320bd41bf8656a227e4f249e4baChet Haaseimport android.animation.LayoutTransition;
216b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.app.ActivityManagerNative;
226b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.ClipDescription;
236b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.ComponentCallbacks;
24c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.content.ComponentCallbacks2;
256b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.Context;
266b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.pm.PackageManager;
276b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.res.CompatibilityInfo;
286b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.res.Configuration;
296b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.res.Resources;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
310f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackbornimport android.graphics.Paint;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat;
332c095f367779ef32130c72849936a2e3013c8492Christopher Tateimport android.graphics.Point;
34a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.graphics.PointF;
356b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.graphics.PorterDuff;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region;
386b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.media.AudioManager;
396b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Binder;
406b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Bundle;
416b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Debug;
426b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Handler;
436b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.LatencyTimer;
446b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Looper;
456b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Message;
466b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.ParcelFileDescriptor;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
486b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.RemoteException;
496b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.SystemClock;
5059a12cae208790dd202656f50a40a53ef49baeebRomain Guyimport android.os.SystemProperties;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
529189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshimaimport android.util.DisplayMetrics;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
546b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.util.Log;
558643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.util.Pool;
568643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.util.Poolable;
578643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.util.PoolableManager;
588643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.util.Pools;
59949dbf7629eacfa02f267ade4643c98aef8e42a9Chet Haaseimport android.util.Slog;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
61711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackbornimport android.util.TypedValue;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.MeasureSpec;
6375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEvent;
6475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
658643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
668643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo;
678643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.IAccessibilityInteractionConnection;
688643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.IAccessibilityInteractionConnectionCallback;
690f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackbornimport android.view.animation.AccelerateDecelerateInterpolator;
700f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackbornimport android.view.animation.Interpolator;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputConnection;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.Scroller;
748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
7586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport com.android.internal.policy.PolicyManager;
768643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport com.android.internal.util.Predicate;
776b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.BaseSurfaceHolder;
786b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.IInputMethodCallback;
796b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.IInputMethodSession;
806b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.RootViewSurfaceTaker;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
8465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guyimport java.io.PrintWriter;
856b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport java.lang.ref.WeakReference;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
878643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport java.util.List;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The top of a view hierarchy, implementing the needed protocol between View
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the WindowManager.  This is for the most part an internal implementation
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * detail of {@link WindowManagerImpl}.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
96812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy@SuppressWarnings({"EmptyCatchBlock", "PointlessBooleanExpression"})
976dd005b48138708762bfade0081d031a2a4a3822Dianne Hackbornpublic final class ViewRootImpl extends Handler implements ViewParent,
980f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks {
9970a3f677bf015d8641f41d149b76d362bb2b801cDianne Hackborn    private static final String TAG = "ViewRootImpl";
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DBG = false;
101812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy    private static final boolean LOCAL_LOGV = false;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @noinspection PointlessBooleanExpression*/
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_DRAW = false || LOCAL_LOGV;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_LAYOUT = false || LOCAL_LOGV;
105711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn    private static final boolean DEBUG_DIALOG = false || LOCAL_LOGV;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_INPUT_RESIZE = false || LOCAL_LOGV;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_ORIENTATION = false || LOCAL_LOGV;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_TRACKBALL = false || LOCAL_LOGV;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_IMF = false || LOCAL_LOGV;
110694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    private static final boolean DEBUG_CONFIGURATION = false || LOCAL_LOGV;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean WATCH_POINTER = false;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11359a12cae208790dd202656f50a40a53ef49baeebRomain Guy    /**
11459a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * Set this system property to true to force the view hierarchy to render
11559a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * at 60 Hz. This can be used to measure the potential framerate.
11659a12cae208790dd202656f50a40a53ef49baeebRomain Guy     */
11759a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private static final String PROPERTY_PROFILE_RENDERING = "viewancestor.profile_rendering";
11859a12cae208790dd202656f50a40a53ef49baeebRomain Guy
11953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    private static final boolean MEASURE_LATENCY = false;
12053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    private static LatencyTimer lt;
12153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Maximum time we allow the user to roll the trackball enough to generate
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a key event, before resetting the counters.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int MAX_TRACKBALL_DELAY = 250;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static IWindowSession sWindowSession;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final Object mStaticInit = new Object();
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean mInitialized = false;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final ThreadLocal<RunQueue> sRunQueues = new ThreadLocal<RunQueue>();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1352a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    static final ArrayList<Runnable> sFirstDrawHandlers = new ArrayList<Runnable>();
1362a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    static boolean sFirstDrawComplete = false;
1372a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn
138e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    static final ArrayList<ComponentCallbacks> sConfigCallbacks
139e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            = new ArrayList<ComponentCallbacks>();
14059a12cae208790dd202656f50a40a53ef49baeebRomain Guy
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastTrackballTime = 0;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final TrackballAxis mTrackballAxisX = new TrackballAxis();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final TrackballAxis mTrackballAxisY = new TrackballAxis();
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
145cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickXDirection;
146cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickYDirection;
147cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickXKeyCode;
148cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickYKeyCode;
149cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final int[] mTmpLocation = new int[2];
1518506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
152711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn    final TypedValue mTmpValue = new TypedValue();
153711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final InputMethodCallback mInputMethodCallback;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<Object> mPendingEvents = new SparseArray<Object>();
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mPendingEventSeq = 0;
1578506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Thread mThread;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowLeaked mLocation;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowManager.LayoutParams mWindowAttributes = new WindowManager.LayoutParams();
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final W mWindow;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mView;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mFocusedView;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mRealFocusedView;  // this is not set to null in touch mode
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mViewVisibility;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppVisible = true;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
172ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    // Set to true if the owner of this window is in the stopped state,
173ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    // so the window should no longer be active.
174ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    boolean mStopped = false;
175ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1765fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    boolean mLastInCompatMode = false;
1775fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
178d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    SurfaceHolder.Callback2 mSurfaceHolderCallback;
179dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    BaseSurfaceHolder mSurfaceHolder;
180dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    boolean mIsCreating;
181dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    boolean mDrawingAllowed;
182dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Region mTransparentRegion;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Region mPreviousTransparentRegion;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mWidth;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mHeight;
1887d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    Rect mDirty;
1897d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    final Rect mCurrentDirty = new Rect();
1907d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    final Rect mPreviousDirty = new Rect();
191bb93d5598daa3312318c29401815bddf1df8c4deRomain Guy    boolean mIsAnimating;
1928506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
19364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    CompatibilityInfo.Translator mTranslator;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final View.AttachInfo mAttachInfo;
19646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    InputChannel mInputChannel;
1971e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn    InputQueue.Callback mInputQueueCallback;
1981e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn    InputQueue mInputQueue;
19986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato    FallbackEventHandler mFallbackEventHandler;
200a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mTempRect; // used in the transaction to not thrash the heap.
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mVisRect; // used to retrieve visible rect of focused view.
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mTraversalScheduled;
2054e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    long mLastTraversalFinishedTimeNanos;
2064e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    long mLastDrawDurationNanos;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWillDrawSoon;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLayoutRequested;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFirst;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mReportNextDraw;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFullRedrawNeeded;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mNewSurfaceNeeded;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mHasHadWindowFocus;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLastWasImTarget;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWindowAttributesChanged = false;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These can be accessed by any thread, must be protected with a lock.
2195583dc630f861dd9a3006390db227f9296007e00Mathias Agopian    // Surface can never be reassigned or cleared (use Surface.clear()).
2205583dc630f861dd9a3006390db227f9296007e00Mathias Agopian    private final Surface mSurface = new Surface();
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAdded;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAddedTouchMode;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2255fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    CompatibilityInfoHolder mCompatibilityInfo;
2265fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ int mAddNesting;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are accessed by multiple threads.
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mWinFrame; // frame given by window manager.
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mPendingVisibleInsets = new Rect();
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mPendingContentInsets = new Rect();
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ViewTreeObserver.InternalInsetsInfo mLastGivenInsets
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new ViewTreeObserver.InternalInsetsInfo();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
237694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    final Configuration mLastConfiguration = new Configuration();
238694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    final Configuration mPendingConfiguration = new Configuration();
23959a12cae208790dd202656f50a40a53ef49baeebRomain Guy
240e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    class ResizedInfo {
241e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Rect coveredInsets;
242e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Rect visibleInsets;
243e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Configuration newConfig;
244e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
245e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScrollMayChange;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSoftInputMode;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mLastScrolledFocus;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mScrollY;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mCurScrollY;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Scroller mScroller;
2527d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    HardwareLayer mResizeBuffer;
2537d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    long mResizeBufferStartTime;
2547d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    int mResizeBufferDuration;
2550f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    static final Interpolator mResizeInterpolator = new AccelerateDecelerateInterpolator();
256cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    private ArrayList<LayoutTransition> mPendingTransitions;
2578506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2588506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy    final ViewConfiguration mViewConfiguration;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
260a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /* Drag/drop */
261a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    ClipDescription mDragDescription;
262a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    View mCurrentDragView;
2637fb8b565f9cd2ec6a63ff4d8a89f98f68a1a138cChristopher Tate    volatile Object mLocalDragState;
264a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    final PointF mDragPoint = new PointF();
2652c095f367779ef32130c72849936a2e3013c8492Christopher Tate    final PointF mLastTouchPoint = new PointF();
26659a12cae208790dd202656f50a40a53ef49baeebRomain Guy
26759a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private boolean mProfileRendering;
26859a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private Thread mRenderProfiler;
26959a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private volatile boolean mRenderProfilingEnabled;
270a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * see {@link #playSoundEffect(int)}
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AudioManager mAudioManager;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2768643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final AccessibilityManager mAccessibilityManager;
2778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
2788643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    AccessibilityInteractionController mAccessibilityInteractionContrtoller;
2798643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
2808643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    AccessibilityInteractionConnectionManager mAccessibilityInteractionConnectionManager;
2818643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
282a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov    SendWindowContentChangedAccessibilityEvent mSendWindowContentChangedAccessibilityEvent;
283eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
28411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn    private final int mDensity;
285b08013c312e3d849029a2f4c11889274c00f438dAdam Powell
28621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /**
28721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * Consistency verifier for debugging purposes.
28821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     */
28921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    protected final InputEventConsistencyVerifier mInputEventConsistencyVerifier =
29021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            InputEventConsistencyVerifier.isInstrumentationEnabled() ?
29121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                    new InputEventConsistencyVerifier(this, 0) : null;
29221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
2934c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    public static IWindowSession getWindowSession(Looper mainLooper) {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStaticInit) {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mInitialized) {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
2974c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    InputMethodManager imm = InputMethodManager.getInstance(mainLooper);
29844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn                    sWindowSession = Display.getWindowManager().openSession(
29944bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn                            imm.getClient(), imm.getInputContext());
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInitialized = true;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3044c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            return sWindowSession;
3054c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
3064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
3074c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
3086dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn    public ViewRootImpl(Context context) {
3094c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        super();
3104c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
311812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy        if (MEASURE_LATENCY) {
312812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy            if (lt == null) {
313812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                lt = new LatencyTimer(100, 1000);
314812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy            }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // Initialize the statics when this class is first instantiated. This is
3184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // done here instead of in the static block because Zygote does not
3194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // allow the spawning of threads.
3204c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWindowSession(context.getMainLooper());
3218643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread = Thread.currentThread();
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocation = new WindowLeaked(null);
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocation.fillInStackTrace();
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWidth = -1;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeight = -1;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDirty = new Rect();
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTempRect = new Rect();
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVisRect = new Rect();
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWinFrame = new Rect();
331fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy        mWindow = new W(this);
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInputMethodCallback = new InputMethodCallback(this);
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewVisibility = View.GONE;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransparentRegion = new Region();
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPreviousTransparentRegion = new Region();
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = true; // true for the first time the view is added
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAdded = false;
3388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager = AccessibilityManager.getInstance(context);
3398643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityInteractionConnectionManager =
3408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            new AccessibilityInteractionConnectionManager();
3418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager.addAccessibilityStateChangeListener(
3428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAccessibilityInteractionConnectionManager);
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo = new View.AttachInfo(sWindowSession, mWindow, this, this);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewConfiguration = ViewConfiguration.get(context);
34511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        mDensity = context.getResources().getDisplayMetrics().densityDpi;
34686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato        mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context);
34759a12cae208790dd202656f50a40a53ef49baeebRomain Guy        mProfileRendering = Boolean.parseBoolean(
34859a12cae208790dd202656f50a40a53ef49baeebRomain Guy                SystemProperties.get(PROPERTY_PROFILE_RENDERING, "false"));
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3512a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    public static void addFirstDrawHandler(Runnable callback) {
3522a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        synchronized (sFirstDrawHandlers) {
3532a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            if (!sFirstDrawComplete) {
3542a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                sFirstDrawHandlers.add(callback);
3552a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            }
3562a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        }
3572a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    }
3582a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn
359e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    public static void addConfigCallback(ComponentCallbacks callback) {
360e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        synchronized (sConfigCallbacks) {
361e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            sConfigCallbacks.add(callback);
362e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
363e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
364e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // FIXME for perf testing only
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mProfile = false;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to profile the next traversal call.
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * FIXME for perf testing only. Remove eventually
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void profile() {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProfile = true;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether we are in touch mode. Calling this method triggers an IPC
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call and should be avoided whenever possible.
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True, if the device is in touch mode, false otherwise.
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean isInTouchMode() {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInitialized) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sWindowSession.getInTouchMode();
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We have one child
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
397e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView == null) {
4008169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                mView = view;
40186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                mFallbackEventHandler.setView(view);
4029189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                mWindowAttributes.copyFrom(attrs);
4031ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                attrs = mWindowAttributes;
404e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
405dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (view instanceof RootViewSurfaceTaker) {
406dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolderCallback =
407dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            ((RootViewSurfaceTaker)view).willYouTakeTheSurface();
408dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (mSurfaceHolderCallback != null) {
409dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolder = new TakenSurfaceHolder();
410289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn                        mSurfaceHolder.setFormat(PixelFormat.UNKNOWN);
411dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
412dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
4131aec9a2212dd76e47ce0215006e5415b6430b54fRomain Guy
4141aec9a2212dd76e47ce0215006e5415b6430b54fRomain Guy                // If the application owns the surface, don't enable hardware acceleration
4151aec9a2212dd76e47ce0215006e5415b6430b54fRomain Guy                if (mSurfaceHolder == null) {
4161aec9a2212dd76e47ce0215006e5415b6430b54fRomain Guy                    enableHardwareAcceleration(attrs);
4171aec9a2212dd76e47ce0215006e5415b6430b54fRomain Guy                }
4181aec9a2212dd76e47ce0215006e5415b6430b54fRomain Guy
4195fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                CompatibilityInfo compatibilityInfo = mCompatibilityInfo.get();
420589cebe2d58591403de4a77077941c0454bc91bcMitsuru Oshima                mTranslator = compatibilityInfo.getTranslator();
42138ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
4225be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                if (mTranslator != null) {
4235be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn                    mSurface.setCompatibilityTranslator(mTranslator);
42438ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima                }
42538ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
426e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima                boolean restore = false;
42735b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                if (mTranslator != null) {
428e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima                    restore = true;
42964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    attrs.backup();
43064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateWindowLayout(attrs);
4319189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                }
43264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (DEBUG_LAYOUT) Log.d(TAG, "WindowLayout in setView:" + attrs);
43364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
4341ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                if (!compatibilityInfo.supportsScreen()) {
4351ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                    attrs.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
4365fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    mLastInCompatMode = true;
4371ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                }
4381ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSoftInputMode = attrs.softInputMode;
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowAttributesChanged = true;
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mRootView = view;
44235b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                mAttachInfo.mScalingRequired = mTranslator != null;
44364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                mAttachInfo.mApplicationScale =
44464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        mTranslator == null ? 1.0f : mTranslator.applicationScale;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (panelParentView != null) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mPanelParentWindowToken
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            = panelParentView.getApplicationWindowToken();
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAdded = true;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int res; /* = WindowManagerImpl.ADD_OKAY; */
4518506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Schedule the first layout -before- adding to the window
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // manager, to make sure we do the relayout before receiving
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // any other events from the system.
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout();
45646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                mInputChannel = new InputChannel();
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
4589189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                    res = sWindowSession.add(mWindow, mWindowAttributes,
45946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                            getHostVisibility(), mAttachInfo.mContentInsets,
46046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                            mInputChannel);
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAdded = false;
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView = null;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mRootView = null;
46546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    mInputChannel = null;
46686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                    mFallbackEventHandler.setView(null);
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unscheduleTraversals();
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException("Adding window failed", e);
46964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                } finally {
47064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    if (restore) {
47164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        attrs.restore();
47264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
47446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
47564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (mTranslator != null) {
47664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateRectInScreenToAppWindow(mAttachInfo.mContentInsets);
4779189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingContentInsets.set(mAttachInfo.mContentInsets);
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingVisibleInsets.set(0, 0, 0, 0);
480711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                if (DEBUG_LAYOUT) Log.v(TAG, "Added window " + mWindow);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (res < WindowManagerImpl.ADD_OKAY) {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView = null;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mRootView = null;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAdded = false;
48586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                    mFallbackEventHandler.setView(null);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unscheduleTraversals();
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (res) {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_BAD_APP_TOKEN:
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN:
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- token " + attrs.token
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is not valid; is your activity running?");
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_NOT_APP_TOKEN:
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- token " + attrs.token
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is not for an application");
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_APP_EXITING:
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- app for token " + attrs.token
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is exiting");
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_DUPLICATE_ADD:
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- window " + mWindow
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " has already been added");
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_STARTING_NOT_NEEDED:
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Silently ignore -- we would have just removed it
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // right away, anyway.
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_MULTIPLE_SINGLETON:
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window " + mWindow +
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                " -- another window of this type already exists");
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_PERMISSION_DENIED:
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window " + mWindow +
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                " -- permission denied for this window type");
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException(
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Unable to add window -- unknown error code " + res);
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
52200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (view instanceof RootViewSurfaceTaker) {
52300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputQueueCallback =
52400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        ((RootViewSurfaceTaker)view).willYouTakeTheInputQueue();
52500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                }
52600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (mInputQueueCallback != null) {
52700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputQueue = new InputQueue(mInputChannel);
52800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputQueueCallback.onInputQueueCreated(mInputQueue);
52900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                } else {
53000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    InputQueue.registerInputChannel(mInputChannel, mInputHandler,
53100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                            Looper.myQueue());
53246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                }
5338643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                view.assignParent(this);
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAddedTouchMode = (res&WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE) != 0;
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppVisible = (res&WindowManagerImpl.ADD_FLAG_APP_VISIBLE) != 0;
5378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
5388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                if (mAccessibilityManager.isEnabled()) {
5398643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    mAccessibilityInteractionConnectionManager.ensureConnection();
5408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5456d7475d666baefaa3ba9f0dcee25238739454241Romain Guy    private void destroyHardwareResources() {
54665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mAttachInfo.mHardwareRenderer != null) {
54765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer.isEnabled()) {
54865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                mAttachInfo.mHardwareRenderer.destroyLayers(mView);
54965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
55065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            mAttachInfo.mHardwareRenderer.destroy(false);
55165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
55265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
55365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
55465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void destroyHardwareLayers() {
55565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mThread != Thread.currentThread()) {
55665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer != null &&
55765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    mAttachInfo.mHardwareRenderer.isEnabled()) {
558c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                HardwareRenderer.trimMemory(ComponentCallbacks2.TRIM_MEMORY_MODERATE);
55965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
56065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        } else {
56165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer != null &&
56265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    mAttachInfo.mHardwareRenderer.isEnabled()) {
56365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                mAttachInfo.mHardwareRenderer.destroyLayers(mView);
56465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
5656d7475d666baefaa3ba9f0dcee25238739454241Romain Guy        }
5666d7475d666baefaa3ba9f0dcee25238739454241Romain Guy    }
5676d7475d666baefaa3ba9f0dcee25238739454241Romain Guy
568529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy    private void enableHardwareAcceleration(WindowManager.LayoutParams attrs) {
5697eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        mAttachInfo.mHardwareAccelerated = false;
5707eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        mAttachInfo.mHardwareAccelerationRequested = false;
5714f6aff386045000c2c03b903c7109cb42092b7eaRomain Guy
5727eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        // Try to enable hardware acceleration if requested
5731b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller        final boolean hardwareAccelerated =
5741b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller                (attrs.flags & WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0;
5751b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller
576566c33105a76c6a02333db8b775721990bc6cca4Romain Guy        if (hardwareAccelerated) {
5771af23a32d879db330eb5a08b21090ec60b604a32Romain Guy            if (!HardwareRenderer.isAvailable()) {
5781af23a32d879db330eb5a08b21090ec60b604a32Romain Guy                mAttachInfo.mHardwareAccelerationRequested = true;
5791af23a32d879db330eb5a08b21090ec60b604a32Romain Guy                return;
5801af23a32d879db330eb5a08b21090ec60b604a32Romain Guy            }
5811af23a32d879db330eb5a08b21090ec60b604a32Romain Guy
5827eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn            // Only enable hardware acceleration if we are not in the system process
583c6cc0f8c19d9eccf408a443fa2bf668af261dcd0Joe Onorato            // The window manager creates ViewAncestors to display animated preview windows
5847eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn            // of launching apps and we don't want those to be hardware accelerated
5851b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller
5861b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller            final boolean systemHwAccelerated =
5871b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller                (attrs.flags & WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED_SYSTEM) != 0;
5881b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller
5891b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller            if (!HardwareRenderer.sRendererDisabled || systemHwAccelerated) {
590ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                // Don't enable hardware acceleration when we're not on the main thread
5911b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller                if (!systemHwAccelerated && Looper.getMainLooper() != Looper.myLooper()) {
5921b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller                    Log.w(HardwareRenderer.LOG_TAG, "Attempting to initialize hardware "
593ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                            + "acceleration outside of the main thread, aborting");
594ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                    return;
595ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                }
596ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy
597e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy                final boolean translucent = attrs.format != PixelFormat.OPAQUE;
598b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                if (mAttachInfo.mHardwareRenderer != null) {
599b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                    mAttachInfo.mHardwareRenderer.destroy(true);
6004caa4ed120a86e855d4d3b6b455c6fb9ca22e365Romain Guy                }
601b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                mAttachInfo.mHardwareRenderer = HardwareRenderer.createGlRenderer(2, translucent);
6027eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                mAttachInfo.mHardwareAccelerated = mAttachInfo.mHardwareAccelerationRequested
6037eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                        = mAttachInfo.mHardwareRenderer != null;
604e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            }
605e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        }
606e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
607e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getView() {
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mView;
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowLeaked getLocation() {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLocation;
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setLayoutParams(WindowManager.LayoutParams attrs, boolean newView) {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
618105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            int oldSoftInputMode = mWindowAttributes.softInputMode;
6195a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            // preserve compatible window flag if exists.
6205a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            int compatibleWindowFlag =
6215a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima                mWindowAttributes.flags & WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributes.copyFrom(attrs);
6235a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            mWindowAttributes.flags |= compatibleWindowFlag;
6245a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newView) {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSoftInputMode = attrs.softInputMode;
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout();
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
629105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            // Don't lose the mode we last auto-computed.
630105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if ((attrs.softInputMode&WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
631105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED) {
632105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mWindowAttributes.softInputMode = (mWindowAttributes.softInputMode
633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        & ~WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
634105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        | (oldSoftInputMode
635105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                & WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST);
636105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = true;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void handleAppVisibility(boolean visible) {
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAppVisible != visible) {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppVisible = visible;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void handleGetNewSurface() {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNewSurfaceNeeded = true;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullRedrawNeeded = true;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scheduleTraversals();
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestLayout() {
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutRequested = true;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scheduleTraversals();
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isLayoutRequested() {
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLayoutRequested;
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void invalidateChild(View child, Rect dirty) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
67364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (DEBUG_DRAW) Log.v(TAG, "Invalidate child: " + dirty);
67470d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase        if (dirty == null) {
67570d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase            // Fast invalidation for GL-enabled applications; GL must redraw everything
67670d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase            invalidate();
67770d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase            return;
67870d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase        }
67964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mCurScrollY != 0 || mTranslator != null) {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTempRect.set(dirty);
6811e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            dirty = mTempRect;
6828169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            if (mCurScrollY != 0) {
6831e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy               dirty.offset(0, -mCurScrollY);
6848169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            }
68564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            if (mTranslator != null) {
6861e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy                mTranslator.translateRectInAppWindowToScreen(dirty);
6871e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            }
6881e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            if (mAttachInfo.mScalingRequired) {
6891e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy                dirty.inset(-1, -1);
6908169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
692daf98e941e140e8739458126640183b9f296a2abChet Haase        if (!mDirty.isEmpty() && !mDirty.contains(dirty)) {
69302ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy            mAttachInfo.mSetIgnoreDirtyState = true;
6947d695945801b8e6a051440731b500ff109e4b5abRomain Guy            mAttachInfo.mIgnoreDirtyState = true;
6957d695945801b8e6a051440731b500ff109e4b5abRomain Guy        }
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDirty.union(dirty);
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWillDrawSoon) {
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7010d9275e565551eed57297627188aa39f3897a50bRomain Guy
7020d9275e565551eed57297627188aa39f3897a50bRomain Guy    void invalidate() {
7030d9275e565551eed57297627188aa39f3897a50bRomain Guy        mDirty.set(0, 0, mWidth, mHeight);
7040d9275e565551eed57297627188aa39f3897a50bRomain Guy        scheduleTraversals();
7050d9275e565551eed57297627188aa39f3897a50bRomain Guy    }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
707ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    void setStopped(boolean stopped) {
708ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        if (mStopped != stopped) {
709ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            mStopped = stopped;
710ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (!stopped) {
711ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                scheduleTraversals();
712ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            }
713ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        }
714ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    }
715ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewParent getParent() {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewParent invalidateChildInParent(final int[] location, final Rect dirty) {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidateChild(null, dirty);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) {
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (child != mView) {
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("child is not mine, honest!");
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Note: don't apply scroll offset, because we want to know its
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // visibility in the virtual canvas being given to the view hierarchy.
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return r.intersect(0, 0, mWidth, mHeight);
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void bringChildToFront(View child) {
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void scheduleTraversals() {
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mTraversalScheduled) {
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTraversalScheduled = true;
7404e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
7411c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            //noinspection ConstantConditions
7424e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (ViewDebug.DEBUG_LATENCY && mLastTraversalFinishedTimeNanos != 0) {
7434e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                final long now = System.nanoTime();
7444e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                Log.d(TAG, "Latency: Scheduled traversal, it has been "
7454e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + ((now - mLastTraversalFinishedTimeNanos) * 0.000001f)
7464e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + "ms since the last traversal finished.");
7474e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
7484e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendEmptyMessage(DO_TRAVERSAL);
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unscheduleTraversals() {
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTraversalScheduled) {
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTraversalScheduled = false;
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeMessages(DO_TRAVERSAL);
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int getHostVisibility() {
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAppVisible ? mView.getVisibility() : View.GONE;
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7638506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
7647d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    void disposeResizeBuffer() {
7657d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
7667d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            mResizeBuffer.destroy();
7677d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            mResizeBuffer = null;
7680f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
7690f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
7700f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
771cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    /**
772cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * Add LayoutTransition to the list of transitions to be started in the next traversal.
773cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * This list will be cleared after the transitions on the list are start()'ed. These
774cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * transitionsa re added by LayoutTransition itself when it sets up animations. The setup
775cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * happens during the layout phase of traversal, which we want to complete before any of the
776cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * animations are started (because those animations may side-effect properties that layout
777cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * depends upon, like the bounding rectangles of the affected views). So we add the transition
778cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * to the list and it is started just prior to starting the drawing phase of traversal.
779cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     *
780cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * @param transition The LayoutTransition to be started on the next traversal.
781cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     *
782cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * @hide
783cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     */
784cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    public void requestTransitionStart(LayoutTransition transition) {
785cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase        if (mPendingTransitions == null || !mPendingTransitions.contains(transition)) {
786cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            if (mPendingTransitions == null) {
787cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase                 mPendingTransitions = new ArrayList<LayoutTransition>();
788cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            }
789cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            mPendingTransitions.add(transition);
790cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase        }
791cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    }
792cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void performTraversals() {
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // cache mView since it is used so much below...
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View host = mView;
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) {
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("======================================");
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("performTraversals");
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.debug();
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (host == null || !mAdded)
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTraversalScheduled = false;
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWillDrawSoon = true;
808711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn        boolean windowSizeMayChange = false;
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean fullRedrawNeeded = mFullRedrawNeeded;
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean newSurface = false;
811dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        boolean surfaceChanged = false;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManager.LayoutParams lp = mWindowAttributes;
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int desiredWindowWidth;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int desiredWindowHeight;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int childWidthMeasureSpec;
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int childHeightMeasureSpec;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View.AttachInfo attachInfo = mAttachInfo;
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int viewVisibility = getHostVisibility();
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean viewVisibilityChanged = mViewVisibility != viewVisibility
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || mNewSurfaceNeeded;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManager.LayoutParams params = null;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindowAttributesChanged) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = false;
828dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            surfaceChanged = true;
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            params = lp;
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8315fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatibilityInfo compatibilityInfo = mCompatibilityInfo.get();
8325fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (compatibilityInfo.supportsScreen() == mLastInCompatMode) {
8335fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            params = lp;
8345fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            fullRedrawNeeded = true;
8355fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            mLayoutRequested = true;
8365fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            if (mLastInCompatMode) {
8375fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                params.flags &= ~WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
8385fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                mLastInCompatMode = false;
8395fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            } else {
8405fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                params.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
8415fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                mLastInCompatMode = true;
8425fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            }
8435fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
84464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        Rect frame = mWinFrame;
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst) {
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fullRedrawNeeded = true;
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutRequested = true;
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            if (lp.type == WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL) {
850a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                // NOTE -- system code, won't try to do compat mode.
851a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                Display disp = WindowManagerImpl.getDefault().getDefaultDisplay();
852bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                Point size = new Point();
853bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                disp.getRealSize(size);
854bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                desiredWindowWidth = size.x;
855bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                desiredWindowHeight = size.y;
856a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            } else {
857a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                DisplayMetrics packageMetrics =
858a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    mView.getContext().getResources().getDisplayMetrics();
859a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                desiredWindowWidth = packageMetrics.widthPixels;
860a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                desiredWindowHeight = packageMetrics.heightPixels;
861a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            }
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // For the very first time, tell the view hierarchy that it
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // is attached to the window.  Note that at this point the surface
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // object is not initialized to its backing store, but soon it
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // will be (assuming the window is visible).
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mSurface = mSurface;
868c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // We used to use the following condition to choose 32 bits drawing caches:
869c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // PixelFormat.hasAlpha(lp.format) || lp.format == PixelFormat.RGBX_8888
870c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // However, windows are now always 32 bits by default, so choose 32 bits
871c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            attachInfo.mUse32BitDrawingCache = true;
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mHasWindowFocus = false;
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowVisibility = viewVisibility;
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mRecomputeGlobalAttributes = false;
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mKeepScreenOn = false;
876664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            attachInfo.mSystemUiVisibility = 0;
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            viewVisibilityChanged = false;
878694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            mLastConfiguration.setTo(host.getResources().getConfiguration());
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.dispatchAttachedToWindow(attachInfo, 0);
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Screen on initialized: " + attachInfo.mKeepScreenOn);
88175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
88364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            desiredWindowWidth = frame.width();
88464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            desiredWindowHeight = frame.height();
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (desiredWindowWidth != mWidth || desiredWindowHeight != mHeight) {
886c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                if (DEBUG_ORIENTATION) Log.v(TAG,
88764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        "View " + host + " resized to: " + frame);
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fullRedrawNeeded = true;
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutRequested = true;
890711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                windowSizeMayChange = true;
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (viewVisibilityChanged) {
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowVisibility = viewVisibility;
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.dispatchWindowVisibilityChanged(viewVisibility);
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility != View.VISIBLE || mNewSurfaceNeeded) {
89865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                destroyHardwareResources();
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.GONE) {
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // After making a window gone, we will count it as being
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // shown for the first time the next time it gets focus.
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHasHadWindowFocus = false;
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean insetsChanged = false;
9088506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
909ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        if (mLayoutRequested && !mStopped) {
91015df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy            // Execute enqueued actions on every layout in case a view that was detached
91115df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy            // enqueued an action after being detached
91215df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy            getRunQueue().executeActions(attachInfo.mHandler);
91315df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy
914711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            final Resources res = mView.getContext().getResources();
915711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFirst) {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.fitSystemWindows(mAttachInfo.mContentInsets);
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // make sure touch mode code executes by setting cached value
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to opposite of the added touch mode.
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mInTouchMode = !mAddedTouchMode;
9212d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy                ensureTouchModeLocally(mAddedTouchMode);
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mAttachInfo.mContentInsets.equals(mPendingContentInsets)) {
9240f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    if (mWidth > 0 && mHeight > 0 &&
9250f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            mSurface != null && mSurface.isValid() &&
92663042d6a0347017fcc4cd98560ca3407044c165cDianne Hackborn                            !mAttachInfo.mTurnOffWindowResizeAnim &&
9270f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            mAttachInfo.mHardwareRenderer != null &&
9280f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            mAttachInfo.mHardwareRenderer.isEnabled() &&
929039857520b1a03a52051b966d87d587225bdfcc3Romain Guy                            mAttachInfo.mHardwareRenderer.validate() &&
9300f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            lp != null && !PixelFormat.formatHasAlpha(lp.format)) {
9310f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
9327d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                        disposeResizeBuffer();
9330f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
9340f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        boolean completed = false;
9357d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                        HardwareCanvas canvas = null;
9360f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        try {
9377d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            if (mResizeBuffer == null) {
9387d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                                mResizeBuffer = mAttachInfo.mHardwareRenderer.createHardwareLayer(
9397d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                                        mWidth, mHeight, false);
9407d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            } else if (mResizeBuffer.getWidth() != mWidth ||
9417d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                                    mResizeBuffer.getHeight() != mHeight) {
9427d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                                mResizeBuffer.resize(mWidth, mHeight);
9437d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            }
9447d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            canvas = mResizeBuffer.start(mAttachInfo.mHardwareCanvas);
9457d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            canvas.setViewport(mWidth, mHeight);
9467d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            canvas.onPreDraw(null);
9477d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            final int restoreCount = canvas.save();
9487d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy
949f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy                            canvas.drawColor(0xff000000, PorterDuff.Mode.SRC);
9507d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy
9510f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            int yoff;
9520f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            final boolean scrolling = mScroller != null
9530f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                                    && mScroller.computeScrollOffset();
9540f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            if (scrolling) {
9550f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                                yoff = mScroller.getCurrY();
9560f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                                mScroller.abortAnimation();
9570f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            } else {
9580f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                                yoff = mScrollY;
9590f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            }
9607d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy
9610f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            canvas.translate(0, -yoff);
9620f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            if (mTranslator != null) {
9630f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                                mTranslator.translateCanvas(canvas);
9640f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            }
9657d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy
9660f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            mView.draw(canvas);
9677d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy
9687d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            mResizeBufferStartTime = SystemClock.uptimeMillis();
9697d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            mResizeBufferDuration = mView.getResources().getInteger(
9700f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                                    com.android.internal.R.integer.config_mediumAnimTime);
9710f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            completed = true;
9727d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy
9737d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            canvas.restoreToCount(restoreCount);
9740f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        } catch (OutOfMemoryError e) {
9750f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            Log.w(TAG, "Not enough memory for content change anim buffer", e);
9760f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        } finally {
9777d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            if (canvas != null) {
9787d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                                canvas.onPostDraw();
9797d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            }
9807d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                            if (mResizeBuffer != null) {
9817d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                                mResizeBuffer.end(mAttachInfo.mHardwareCanvas);
9827d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                                if (!completed) {
9837d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                                    mResizeBuffer.destroy();
9847d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                                    mResizeBuffer = null;
9857d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                                }
9860f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                            }
9870f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                        }
9880f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    }
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mContentInsets.set(mPendingContentInsets);
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    host.fitSystemWindows(mAttachInfo.mContentInsets);
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    insetsChanged = true;
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Content insets changing to: "
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mContentInsets);
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mAttachInfo.mVisibleInsets.equals(mPendingVisibleInsets)) {
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets);
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Visible insets changing to: "
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mVisibleInsets);
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) {
1002711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    windowSizeMayChange = true;
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1004a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    if (lp.type == WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL) {
1005a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        // NOTE -- system code, won't try to do compat mode.
1006a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        Display disp = WindowManagerImpl.getDefault().getDefaultDisplay();
1007bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        Point size = new Point();
1008bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        disp.getRealSize(size);
1009bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        desiredWindowWidth = size.x;
1010bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        desiredWindowHeight = size.y;
1011a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    } else {
1012a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        DisplayMetrics packageMetrics = res.getDisplayMetrics();
1013a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        desiredWindowWidth = packageMetrics.widthPixels;
1014a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        desiredWindowHeight = packageMetrics.heightPixels;
1015a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    }
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ask host how big it wants to be
1020c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            if (DEBUG_ORIENTATION || DEBUG_LAYOUT) Log.v(TAG,
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Measuring " + host + " in display " + desiredWindowWidth
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + "x" + desiredWindowHeight + "...");
1023711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
1024711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            boolean goodMeasure = false;
1025a3e3c533ee4af6d9dba43b70ac421ba880992961Adam Powell            if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT) {
1026711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // On large screens, we don't want to allow dialogs to just
1027711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // stretch to fill the entire width of the screen to display
1028711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // one line of text.  First try doing the layout at a smaller
1029711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // size to see if it will fit.
1030711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                final DisplayMetrics packageMetrics = res.getDisplayMetrics();
1031711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                res.getValue(com.android.internal.R.dimen.config_prefDialogWidth, mTmpValue, true);
1032711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                int baseSize = 0;
1033711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                if (mTmpValue.type == TypedValue.TYPE_DIMENSION) {
1034711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    baseSize = (int)mTmpValue.getDimension(packageMetrics);
1035711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                }
1036711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": baseSize=" + baseSize);
10377d3a5bcf300aea7bffb1d46f28e244ca807f5e82Dianne Hackborn                if (baseSize != 0 && desiredWindowWidth > baseSize) {
1038711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width);
1039711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height);
1040711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1041711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured ("
1042189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                            + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")");
1043189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                    if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) {
1044711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        goodMeasure = true;
1045711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    } else {
1046711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        // Didn't fit in that size... try expanding a bit.
1047711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        baseSize = (baseSize+desiredWindowWidth)/2;
1048711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": next baseSize="
1049711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                                + baseSize);
1050189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                        childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width);
1051711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1052711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured ("
1053189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                                + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")");
1054189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                        if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) {
1055711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                            if (DEBUG_DIALOG) Log.v(TAG, "Good!");
1056711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                            goodMeasure = true;
1057711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        }
1058711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    }
1059711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                }
1060711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            }
1061711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
1062711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            if (!goodMeasure) {
1063711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width);
1064711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height);
1065711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1066aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell                if (mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight()) {
1067aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell                    windowSizeMayChange = true;
1068aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell                }
1069711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            }
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) {
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("======================================");
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("performTraversals -- after measure");
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.debug();
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10786e81e57b526a3e23038e365414acbb9688f8e44aRomain Guy        if (attachInfo.mRecomputeGlobalAttributes && host.mAttachInfo != null) {
1079664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            //Log.i(TAG, "Computing view hierarchy attributes!");
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mRecomputeGlobalAttributes = false;
1081664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            boolean oldScreenOn = attachInfo.mKeepScreenOn;
1082664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            int oldVis = attachInfo.mSystemUiVisibility;
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mKeepScreenOn = false;
1084664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            attachInfo.mSystemUiVisibility = 0;
1085664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            attachInfo.mHasSystemUiListeners = false;
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.dispatchCollectViewAttributes(0);
108714782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato            if (attachInfo.mKeepScreenOn != oldScreenOn
108814782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato                    || attachInfo.mSystemUiVisibility != oldVis
108914782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato                    || attachInfo.mHasSystemUiListeners) {
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                params = lp;
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst || attachInfo.mViewVisibilityChanged) {
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mViewVisibilityChanged = false;
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resizeMode = mSoftInputMode &
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST;
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are in auto resize mode, then we need to determine
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // what mode to use now.
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (resizeMode == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED) {
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = attachInfo.mScrollContainers.size();
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (attachInfo.mScrollContainers.get(i).isShown()) {
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resizeMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (resizeMode == 0) {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resizeMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((lp.softInputMode &
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST) != resizeMode) {
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lp.softInputMode = (lp.softInputMode &
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ~WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST) |
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            resizeMode;
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    params = lp;
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11198506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (params != null && (host.mPrivateFlags & View.REQUEST_TRANSPARENT_REGIONS) != 0) {
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!PixelFormat.formatHasAlpha(params.format)) {
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                params.format = PixelFormat.TRANSLUCENT;
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1126711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn        boolean windowShouldResize = mLayoutRequested && windowSizeMayChange
1127189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn            && ((mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight())
11282e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                || (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT &&
11292e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                        frame.width() < desiredWindowWidth && frame.width() != mWidth)
11302e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                || (lp.height == ViewGroup.LayoutParams.WRAP_CONTENT &&
11312e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                        frame.height() < desiredWindowHeight && frame.height() != mHeight));
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean computesInternalInsets =
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attachInfo.mTreeObserver.hasComputeInternalInsetsListeners();
1135812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean insetsPending = false;
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int relayoutResult = 0;
1138812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
1139812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy        if (mFirst || windowShouldResize || insetsChanged ||
1140812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                viewVisibilityChanged || params != null) {
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.VISIBLE) {
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this window is giving internal insets to the window
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // manager, and it is being added or changing its visibility,
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // then we want to first give the window manager "fake"
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // insets to cause it to effectively ignore the content of
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the window during layout.  This avoids it briefly causing
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // other windows to resize/move based on the raw frame of the
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, waiting until we can finish laying out this window
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // and get back to the window manager with the ultimately
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // computed insets.
1152812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                insetsPending = computesInternalInsets && (mFirst || viewVisibilityChanged);
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1155dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            if (mSurfaceHolder != null) {
1156dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mSurfaceHolder.mSurfaceLock.lock();
1157dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mDrawingAllowed = true;
1158dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            }
1159812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
1160c361da845a205ac35e724c0ca436744d483de7aaRomain Guy            boolean hwInitialized = false;
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean contentInsetsChanged = false;
116213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            boolean visibleInsetsChanged;
1163dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            boolean hadSurface = mSurface.isValid();
1164812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int fl = 0;
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (params != null) {
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fl = params.flags;
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (attachInfo.mKeepScreenOn) {
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
117214782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato                    params.subtreeSystemUiVisibility = attachInfo.mSystemUiVisibility;
117314782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato                    params.hasSystemUiListeners = attachInfo.mHasSystemUiListeners
117414782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato                            || params.subtreeSystemUiVisibility != 0
117514782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato                            || params.systemUiVisibility != 0;
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11778169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                if (DEBUG_LAYOUT) {
1178189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                    Log.i(TAG, "host=w:" + host.getMeasuredWidth() + ", h:" +
1179189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                            host.getMeasuredHeight() + ", params=" + params);
11808169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                }
11812a83f001fdb189f945e82e81e717ba204824b112Romain Guy
11822a83f001fdb189f945e82e81e717ba204824b112Romain Guy                final int surfaceGenerationId = mSurface.getGenerationId();
11838169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                relayoutResult = relayoutWindow(params, viewVisibility, insetsPending);
11848169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (params != null) {
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    params.flags = fl;
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_LAYOUT) Log.v(TAG, "relayout: frame=" + frame.toShortString()
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " content=" + mPendingContentInsets.toShortString()
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " visible=" + mPendingVisibleInsets.toShortString()
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " surface=" + mSurface);
11938506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1194694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                if (mPendingConfiguration.seq != 0) {
1195694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (DEBUG_CONFIGURATION) Log.v(TAG, "Visible with new config: "
1196694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            + mPendingConfiguration);
1197694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    updateConfiguration(mPendingConfiguration, !mFirst);
1198694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    mPendingConfiguration.seq = 0;
1199694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                }
1200694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                contentInsetsChanged = !mPendingContentInsets.equals(
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAttachInfo.mContentInsets);
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                visibleInsetsChanged = !mPendingVisibleInsets.equals(
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAttachInfo.mVisibleInsets);
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (contentInsetsChanged) {
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mContentInsets.set(mPendingContentInsets);
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    host.fitSystemWindows(mAttachInfo.mContentInsets);
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Content insets changing to: "
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mContentInsets);
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visibleInsetsChanged) {
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets);
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Visible insets changing to: "
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mVisibleInsets);
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!hadSurface) {
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mSurface.isValid()) {
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are creating a new surface, then we need to
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // completely redraw it.  Also, when we get to the
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // point of drawing it we will hold off and schedule
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // a new traversal instead.  This is so we can tell the
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // window manager about all of the windows being displayed
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // before actually drawing them, so it can display then
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // all at once.
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newSurface = true;
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fullRedrawNeeded = true;
122861a6e689188cd8743905e4f7b10440c7e50823f3Jack Palevich                        mPreviousTransparentRegion.setEmpty();
12298506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        if (mAttachInfo.mHardwareRenderer != null) {
1231648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            try {
1232648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                hwInitialized = mAttachInfo.mHardwareRenderer.initialize(mHolder);
1233648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            } catch (Surface.OutOfResourcesException e) {
1234648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Log.e(TAG, "OutOfResourcesException initializing HW surface", e);
1235648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                try {
1236648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    if (!sWindowSession.outOfMemory(mWindow)) {
1237648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                        Slog.w(TAG, "No processes killed for memory; killing self");
1238648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                        Process.killProcess(Process.myPid());
1239648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    }
1240648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                } catch (RemoteException ex) {
1241648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                }
1242648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                mLayoutRequested = true;    // ask wm for a new surface next time.
1243648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                return;
1244648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (!mSurface.isValid()) {
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If the surface has been removed, then reset the scroll
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // positions.
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastScrolledFocus = null;
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mScrollY = mCurScrollY = 0;
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mScroller != null) {
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mScroller.abortAnimation();
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12557d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                    disposeResizeBuffer();
12561d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    // Our surface is gone
12571d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    if (mAttachInfo.mHardwareRenderer != null &&
12581d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                            mAttachInfo.mHardwareRenderer.isEnabled()) {
12591d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                        mAttachInfo.mHardwareRenderer.destroy(true);
12601d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    }
12612a83f001fdb189f945e82e81e717ba204824b112Romain Guy                } else if (surfaceGenerationId != mSurface.getGenerationId() &&
12622a83f001fdb189f945e82e81e717ba204824b112Romain Guy                        mSurfaceHolder == null && mAttachInfo.mHardwareRenderer != null) {
12637d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                    fullRedrawNeeded = true;
1264648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    try {
1265648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        mAttachInfo.mHardwareRenderer.updateSurface(mHolder);
1266648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    } catch (Surface.OutOfResourcesException e) {
1267648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        Log.e(TAG, "OutOfResourcesException updating HW surface", e);
1268648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        try {
1269648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            if (!sWindowSession.outOfMemory(mWindow)) {
1270648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Slog.w(TAG, "No processes killed for memory; killing self");
1271648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Process.killProcess(Process.myPid());
1272648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
1273648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        } catch (RemoteException ex) {
1274648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        }
1275648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        mLayoutRequested = true;    // ask wm for a new surface next time.
1276648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        return;
1277648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    }
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12811d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_ORIENTATION) Log.v(
1283c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    TAG, "Relayout returned: frame=" + frame + ", surface=" + mSurface);
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowLeft = frame.left;
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowTop = frame.top;
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // !!FIXME!! This next section handles the case where we did not get the
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // window size we asked for. We should avoid this by getting a maximum size from
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the window session beforehand.
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWidth = frame.width();
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHeight = frame.height();
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1294dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            if (mSurfaceHolder != null) {
1295dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                // The app owns the surface; tell it about what is going on.
1296dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (mSurface.isValid()) {
1297dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    // XXX .copyFrom() doesn't work!
1298dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    //mSurfaceHolder.mSurface.copyFrom(mSurface);
1299dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.mSurface = mSurface;
1300dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
130130bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown                mSurfaceHolder.setSurfaceFrameSize(mWidth, mHeight);
1302dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mSurfaceHolder.mSurfaceLock.unlock();
1303dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (mSurface.isValid()) {
1304dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (!hadSurface) {
1305dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolder.ungetCallbacks();
1306dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
1307dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mIsCreating = true;
1308dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolderCallback.surfaceCreated(mSurfaceHolder);
1309dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1310dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        if (callbacks != null) {
1311dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            for (SurfaceHolder.Callback c : callbacks) {
1312dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                c.surfaceCreated(mSurfaceHolder);
1313dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            }
1314dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1315dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        surfaceChanged = true;
1316dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1317dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (surfaceChanged) {
1318dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolderCallback.surfaceChanged(mSurfaceHolder,
1319dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                lp.format, mWidth, mHeight);
1320dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1321dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        if (callbacks != null) {
1322dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            for (SurfaceHolder.Callback c : callbacks) {
1323dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                c.surfaceChanged(mSurfaceHolder, lp.format,
1324dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                        mWidth, mHeight);
1325dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            }
1326dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1327dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1328dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mIsCreating = false;
1329dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                } else if (hadSurface) {
1330dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.ungetCallbacks();
1331dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1332dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolderCallback.surfaceDestroyed(mSurfaceHolder);
1333dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (callbacks != null) {
1334dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        for (SurfaceHolder.Callback c : callbacks) {
1335dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            c.surfaceDestroyed(mSurfaceHolder);
1336dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1337dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1338dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.mSurfaceLock.lock();
133993c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    try {
134093c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                        mSurfaceHolder.mSurface = new Surface();
134193c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    } finally {
134293c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                        mSurfaceHolder.mSurfaceLock.unlock();
134393c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    }
1344dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
1345dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            }
134653389bdcdf6ffaaec533b73bc1d0abc5807ec7f6Romain Guy
13476b5108bc9ce6401174fb1abf6791222f3e0353c4Romain Guy            if (hwInitialized || ((windowShouldResize || params != null) &&
1348dbf78bdb7a9aed3b8393c247128a7e8c760343b5Romain Guy                    mAttachInfo.mHardwareRenderer != null &&
1349dbf78bdb7a9aed3b8393c247128a7e8c760343b5Romain Guy                    mAttachInfo.mHardwareRenderer.isEnabled())) {
1350039857520b1a03a52051b966d87d587225bdfcc3Romain Guy                mAttachInfo.mHardwareRenderer.setup(mWidth, mHeight);
13517e1160e8664a9c5c79367f4ba3c2266a39bbcef5Romain Guy                if (!hwInitialized) {
1352cf15efba0792b052dca5baa350d9fb00e6a60667Romain Guy                    mAttachInfo.mHardwareRenderer.invalidate(mHolder);
13537e1160e8664a9c5c79367f4ba3c2266a39bbcef5Romain Guy                }
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1356ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (!mStopped) {
1357ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                boolean focusChangedDueToTouchMode = ensureTouchModeLocally(
1358ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        (relayoutResult&WindowManagerImpl.RELAYOUT_IN_TOUCH_MODE) != 0);
1359ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                if (focusChangedDueToTouchMode || mWidth != host.getMeasuredWidth()
1360ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        || mHeight != host.getMeasuredHeight() || contentInsetsChanged) {
1361ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width);
1362ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height);
1363ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1364ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (DEBUG_LAYOUT) Log.v(TAG, "Ooops, something changed!  mWidth="
1365ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + mWidth + " measuredWidth=" + host.getMeasuredWidth()
1366ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " mHeight=" + mHeight
1367ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " measuredHeight=" + host.getMeasuredHeight()
1368ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " coveredInsetsChanged=" + contentInsetsChanged);
1369ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1370ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                     // Ask host how big it wants to be
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1372ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1373ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // Implementation of weights from WindowManager.LayoutParams
1374ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // We just grow the dimensions as needed and re-measure if
1375ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // needs be
1376ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    int width = host.getMeasuredWidth();
1377ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    int height = host.getMeasuredHeight();
1378ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    boolean measureAgain = false;
1379ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1380ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (lp.horizontalWeight > 0.0f) {
1381ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        width += (int) ((mWidth - width) * lp.horizontalWeight);
1382ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width,
1383ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                MeasureSpec.EXACTLY);
1384ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        measureAgain = true;
1385ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1386ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (lp.verticalWeight > 0.0f) {
1387ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        height += (int) ((mHeight - height) * lp.verticalWeight);
1388ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height,
1389ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                MeasureSpec.EXACTLY);
1390ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        measureAgain = true;
1391ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1392ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1393ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (measureAgain) {
1394ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        if (DEBUG_LAYOUT) Log.v(TAG,
1395ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                "And hey let's measure once more: width=" + width
1396ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                + " height=" + height);
1397ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1398ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1399ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1400ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    mLayoutRequested = true;
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1405ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        final boolean didLayout = mLayoutRequested && !mStopped;
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean triggerGlobalLayoutListener = didLayout
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || attachInfo.mRecomputeGlobalAttributes;
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (didLayout) {
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutRequested = false;
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrollMayChange = true;
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_ORIENTATION || DEBUG_LAYOUT) Log.v(
1412c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                TAG, "Laying out " + host + " to (" +
1413189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                host.getMeasuredWidth() + ", " + host.getMeasuredHeight() + ")");
141413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            long startTime = 0L;
14155429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy            if (ViewDebug.DEBUG_PROFILE_LAYOUT) {
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                startTime = SystemClock.elapsedRealtime();
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1418189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn            host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
142043a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato            if (false && ViewDebug.consistencyCheckEnabled) {
142113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                if (!host.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_LAYOUT)) {
142213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                    throw new IllegalStateException("The view hierarchy is an inconsistent state,"
142313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                            + "please refer to the logs with the tag "
142413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                            + ViewDebug.CONSISTENCY_LOG_TAG + " for more infomation.");
142513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                }
142613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            }
142713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy
14285429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy            if (ViewDebug.DEBUG_PROFILE_LAYOUT) {
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(60001, SystemClock.elapsedRealtime() - startTime);
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // By this point all views have been sized and positionned
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We can compute the transparent area
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((host.mPrivateFlags & View.REQUEST_TRANSPARENT_REGIONS) != 0) {
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // start out transparent
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // TODO: AVOID THAT CALL BY CACHING THE RESULT?
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.getLocationInWindow(mTmpLocation);
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTransparentRegion.set(mTmpLocation[0], mTmpLocation[1],
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTmpLocation[0] + host.mRight - host.mLeft,
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTmpLocation[1] + host.mBottom - host.mTop);
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.gatherTransparentRegion(mTransparentRegion);
144464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (mTranslator != null) {
144564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateRegionInWindowToScreen(mTransparentRegion);
144664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                }
144764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mTransparentRegion.equals(mPreviousTransparentRegion)) {
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mPreviousTransparentRegion.set(mTransparentRegion);
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // reconfigure window manager
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sWindowSession.setTransparentRegion(mWindow, mTransparentRegion);
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException e) {
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) {
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("======================================");
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("performTraversals -- after setFrame");
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.debug();
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (triggerGlobalLayoutListener) {
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mRecomputeGlobalAttributes = false;
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mTreeObserver.dispatchOnGlobalLayout();
1468eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
1469eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            if (AccessibilityManager.getInstance(host.mContext).isEnabled()) {
1470eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                postSendWindowContentChangedCallback();
1471eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            }
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (computesInternalInsets) {
1475fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Clear the original insets.
1476fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            final ViewTreeObserver.InternalInsetsInfo insets = attachInfo.mGivenInternalInsets;
1477fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            insets.reset();
1478fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1479fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Compute new insets in place.
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mTreeObserver.dispatchOnComputeInternalInsets(insets);
1481fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1482fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Tell the window manager.
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (insetsPending || !mLastGivenInsets.equals(insets)) {
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastGivenInsets.set(insets);
1485fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1486fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                // Translate insets to screen coordinates if needed.
1487fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Rect contentInsets;
1488fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Rect visibleInsets;
1489fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Region touchableRegion;
1490fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                if (mTranslator != null) {
1491fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    contentInsets = mTranslator.getTranslatedContentInsets(insets.contentInsets);
1492fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    visibleInsets = mTranslator.getTranslatedVisibleInsets(insets.visibleInsets);
1493fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    touchableRegion = mTranslator.getTranslatedTouchableArea(insets.touchableRegion);
1494fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                } else {
1495fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    contentInsets = insets.contentInsets;
1496fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    visibleInsets = insets.visibleInsets;
1497fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    touchableRegion = insets.touchableRegion;
1498fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                }
1499fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sWindowSession.setInsets(mWindow, insets.mTouchableInsets,
1502fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                            contentInsets, visibleInsets, touchableRegion);
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15078506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst) {
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // handle first focus request
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: mView.hasFocus()="
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mView.hasFocus());
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView != null) {
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mView.hasFocus()) {
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView.requestFocus(View.FOCUS_FORWARD);
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFocusedView = mRealFocusedView = mView.findFocus();
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: requested focused view="
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mFocusedView);
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRealFocusedView = mView.findFocus();
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: existing focused view="
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mRealFocusedView);
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = false;
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWillDrawSoon = false;
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNewSurfaceNeeded = false;
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewVisibility = viewVisibility;
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mHasWindowFocus) {
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean imTarget = WindowManager.LayoutParams
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .mayUseInputMethod(mWindowAttributes.flags);
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imTarget != mLastWasImTarget) {
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWasImTarget = imTarget;
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InputMethodManager imm = InputMethodManager.peekInstance();
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (imm != null && imTarget) {
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imm.startGettingWindowFocus(mView);
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imm.onWindowFocus(mView, mView.findFocus(),
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mWindowAttributes.softInputMode,
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !mHasHadWindowFocus, mWindowAttributes.flags);
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15458506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1546ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy        boolean cancelDraw = attachInfo.mTreeObserver.dispatchOnPreDraw() ||
1547ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy                viewVisibility != View.VISIBLE;
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!cancelDraw && !newSurface) {
1550cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            if (mPendingTransitions != null && mPendingTransitions.size() > 0) {
1551cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase                for (int i = 0; i < mPendingTransitions.size(); ++i) {
1552cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase                    mPendingTransitions.get(i).startChangingAnimations();
1553cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase                }
1554cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase                mPendingTransitions.clear();
1555cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            }
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFullRedrawNeeded = false;
15574e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
15584e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            final long drawStartTime;
15594e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (ViewDebug.DEBUG_LATENCY) {
15604e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                drawStartTime = System.nanoTime();
15614e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
15624e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            draw(fullRedrawNeeded);
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15654e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (ViewDebug.DEBUG_LATENCY) {
15664e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                mLastDrawDurationNanos = System.nanoTime() - drawStartTime;
15674e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
15684e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((relayoutResult&WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || mReportNextDraw) {
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_LOGV) {
1572c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    Log.v(TAG, "FINISHED DRAWING: " + mWindowAttributes.getTitle());
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReportNextDraw = false;
1575d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                if (mSurfaceHolder != null && mSurface.isValid()) {
1576d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    mSurfaceHolderCallback.surfaceRedrawNeeded(mSurfaceHolder);
1577d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1578d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    if (callbacks != null) {
1579d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        for (SurfaceHolder.Callback c : callbacks) {
1580d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            if (c instanceof SurfaceHolder.Callback2) {
1581d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                                ((SurfaceHolder.Callback2)c).surfaceRedrawNeeded(
1582d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                                        mSurfaceHolder);
1583d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            }
1584d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        }
1585d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    }
1586d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                }
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sWindowSession.finishDrawing(mWindow);
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We were supposed to report when we are done drawing. Since we canceled the
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // draw, remember it here.
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((relayoutResult&WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0) {
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReportNextDraw = true;
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (fullRedrawNeeded) {
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFullRedrawNeeded = true;
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1601ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy
1602ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy            if (viewVisibility == View.VISIBLE) {
1603ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy                // Try again
1604ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy                scheduleTraversals();
1605ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy            }
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestTransparentRegion(View child) {
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the test below should not fail unless someone is messing with us
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == child) {
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mView.mPrivateFlags |= View.REQUEST_TRANSPARENT_REGIONS;
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Need to make sure we re-evaluate the window attributes next
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // time around, to ensure the window has the correct format.
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = true;
16171bd80ad7fdf71e437fa650f02366664c27b66b46Mathias Agopian            requestLayout();
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Figures out the measure spec for the root view in a window based on it's
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layout params.
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param windowSize
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            The available width or height of the window
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rootDimension
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            The layout params for one dimension (width or height) of the
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            window.
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The measure spec to use to measure the root view.
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int getRootMeasureSpec(int windowSize, int rootDimension) {
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int measureSpec;
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (rootDimension) {
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1638980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy        case ViewGroup.LayoutParams.MATCH_PARENT:
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window can't resize. Force root view to be windowSize.
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY);
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case ViewGroup.LayoutParams.WRAP_CONTENT:
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window can resize. Set max size for root view.
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST);
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window wants to be an exact size. Force root view to be that size.
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY);
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return measureSpec;
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16540f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    int mHardwareYOffset;
16550f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    int mResizeAlpha;
16560f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    final Paint mResizePaint = new Paint();
16570f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
16587d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    public void onHardwarePreDraw(HardwareCanvas canvas) {
16590f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        canvas.translate(0, -mHardwareYOffset);
16600f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
16610f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
16627d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    public void onHardwarePostDraw(HardwareCanvas canvas) {
16637d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
16640f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            mResizePaint.setAlpha(mResizeAlpha);
16657d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            canvas.drawHardwareLayer(mResizeBuffer, 0.0f, mHardwareYOffset, mResizePaint);
16660f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
16670f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
16680f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
1669ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    /**
1670ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     * @hide
1671ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     */
1672ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    void outputDisplayList(View view) {
1673ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        if (mAttachInfo != null && mAttachInfo.mHardwareCanvas != null) {
1674ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            DisplayList displayList = view.getDisplayList();
1675ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            if (displayList != null) {
167659a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mAttachInfo.mHardwareCanvas.outputDisplayList(displayList);
167759a12cae208790dd202656f50a40a53ef49baeebRomain Guy            }
167859a12cae208790dd202656f50a40a53ef49baeebRomain Guy        }
167959a12cae208790dd202656f50a40a53ef49baeebRomain Guy    }
168059a12cae208790dd202656f50a40a53ef49baeebRomain Guy
168159a12cae208790dd202656f50a40a53ef49baeebRomain Guy    /**
168259a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * @see #PROPERTY_PROFILE_RENDERING
168359a12cae208790dd202656f50a40a53ef49baeebRomain Guy     */
168459a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private void profileRendering(boolean enabled) {
168559a12cae208790dd202656f50a40a53ef49baeebRomain Guy        if (mProfileRendering) {
168659a12cae208790dd202656f50a40a53ef49baeebRomain Guy            mRenderProfilingEnabled = enabled;
168759a12cae208790dd202656f50a40a53ef49baeebRomain Guy            if (mRenderProfiler == null) {
168859a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler = new Thread(new Runnable() {
168959a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    @Override
169059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    public void run() {
169159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        Log.d(TAG, "Starting profiling thread");
169259a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        while (mRenderProfilingEnabled) {
169359a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            mAttachInfo.mHandler.post(new Runnable() {
169459a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                @Override
169559a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                public void run() {
169659a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                    mDirty.set(0, 0, mWidth, mHeight);
169759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                    scheduleTraversals();
169859a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                }
169959a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            });
170059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            try {
170159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                // TODO: This should use vsync when we get an API
170259a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                Thread.sleep(15);
170359a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            } catch (InterruptedException e) {
170459a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                Log.d(TAG, "Exiting profiling thread");
170559a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            }
170659a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        }
170759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    }
170859a12cae208790dd202656f50a40a53ef49baeebRomain Guy                }, "Rendering Profiler");
170959a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler.start();
171059a12cae208790dd202656f50a40a53ef49baeebRomain Guy            } else {
171159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler.interrupt();
171259a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler = null;
1713ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
1714ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
1715ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
1716ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void draw(boolean fullRedrawNeeded) {
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface surface = mSurface;
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (surface == null || !surface.isValid()) {
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17232a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        if (!sFirstDrawComplete) {
17242a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            synchronized (sFirstDrawHandlers) {
17252a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                sFirstDrawComplete = true;
1726812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                final int count = sFirstDrawHandlers.size();
1727812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                for (int i = 0; i< count; i++) {
17282a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                    post(sFirstDrawHandlers.get(i));
17292a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                }
17302a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            }
17312a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        }
173259a12cae208790dd202656f50a40a53ef49baeebRomain Guy
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scrollToRectOrFocus(null, false);
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mViewScrollChanged) {
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mViewScrollChanged = false;
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mTreeObserver.dispatchOnScrollChanged();
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17398506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int yoff;
17410f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        boolean animating = mScroller != null && mScroller.computeScrollOffset();
17420f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        if (animating) {
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            yoff = mScroller.getCurrY();
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            yoff = mScrollY;
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurScrollY != yoff) {
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurScrollY = yoff;
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fullRedrawNeeded = true;
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
175164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        float appScale = mAttachInfo.mApplicationScale;
175264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        boolean scalingRequired = mAttachInfo.mScalingRequired;
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17540f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        int resizeAlpha = 0;
17557d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
17567d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            long deltaTime = SystemClock.uptimeMillis() - mResizeBufferStartTime;
17577d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            if (deltaTime < mResizeBufferDuration) {
17587d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                float amt = deltaTime/(float) mResizeBufferDuration;
17590f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                amt = mResizeInterpolator.getInterpolation(amt);
17600f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                animating = true;
17610f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                resizeAlpha = 255 - (int)(amt*255);
17620f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            } else {
17637d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                disposeResizeBuffer();
17640f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            }
17650f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
17660f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Rect dirty = mDirty;
1768dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        if (mSurfaceHolder != null) {
1769dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // The app owns the surface, we won't draw.
1770dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            dirty.setEmpty();
17710f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            if (animating) {
17720f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                if (mScroller != null) {
17730f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    mScroller.abortAnimation();
17740f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                }
17757d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                disposeResizeBuffer();
17760f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            }
1777dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return;
1778dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
177958ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy
178058ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy        if (fullRedrawNeeded) {
178158ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy            mAttachInfo.mIgnoreDirtyState = true;
1782c3166e15f8898a2ba66fb177efbddb1d0edf6140Romain Guy            dirty.set(0, 0, (int) (mWidth * appScale + 0.5f), (int) (mHeight * appScale + 0.5f));
178358ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy        }
1784ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase
1785b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
1786fd5072606b85948cbe7c026b6d251774a9facb97Romain Guy            if (!dirty.isEmpty() || mIsAnimating) {
1787101e2ae00c478e13f34c81db05a9a921ad637571Romain Guy                mIsAnimating = false;
17880f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                mHardwareYOffset = yoff;
17890f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                mResizeAlpha = resizeAlpha;
17907d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
17917d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                mCurrentDirty.set(dirty);
17927d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                mCurrentDirty.union(mPreviousDirty);
17937d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                mPreviousDirty.set(dirty);
17947d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                dirty.setEmpty();
17957d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
1796f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy                Rect currentDirty = mCurrentDirty;
1797f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy                if (animating) {
1798f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy                    currentDirty = null;
1799f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy                }
1800f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy
1801f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy                mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this, currentDirty);
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1803812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
18040f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            if (animating) {
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFullRedrawNeeded = true;
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduleTraversals();
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1808812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_ORIENTATION || DEBUG_DRAW) {
1813c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            Log.v(TAG, "Draw " + mView + "/"
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mWindowAttributes.getTitle()
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": dirty={" + dirty.left + "," + dirty.top
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + "," + dirty.right + "," + dirty.bottom + "} surface="
18179189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                    + surface + " surface.isValid()=" + surface.isValid() + ", appScale:" +
18189189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                    appScale + ", width=" + mWidth + ", height=" + mHeight);
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1821a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian        if (!dirty.isEmpty() || mIsAnimating) {
1822a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            Canvas canvas;
1823a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            try {
1824a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                int left = dirty.left;
1825a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                int top = dirty.top;
1826a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                int right = dirty.right;
1827a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                int bottom = dirty.bottom;
1828fea12b87f2988f20ea87314c4a1b47e1a0f4d95eRomain Guy
18294e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                final long lockCanvasStartTime;
18304e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                if (ViewDebug.DEBUG_LATENCY) {
18314e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                    lockCanvasStartTime = System.nanoTime();
18324e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                }
18334e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
1834a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                canvas = surface.lockCanvas(dirty);
1835a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian
18364e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                if (ViewDebug.DEBUG_LATENCY) {
18374e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                    long now = System.nanoTime();
18384e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                    Log.d(TAG, "Latency: Spent "
18394e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                            + ((now - lockCanvasStartTime) * 0.000001f)
18404e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                            + "ms waiting for surface.lockCanvas()");
18414e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                }
18424e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
1843a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                if (left != dirty.left || top != dirty.top || right != dirty.right ||
1844a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        bottom != dirty.bottom) {
1845a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    mAttachInfo.mIgnoreDirtyState = true;
1846a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                }
1847a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian
1848a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                // TODO: Do this in native
1849a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                canvas.setDensity(mDensity);
1850a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            } catch (Surface.OutOfResourcesException e) {
1851c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                Log.e(TAG, "OutOfResourcesException locking surface", e);
1852648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                try {
1853648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    if (!sWindowSession.outOfMemory(mWindow)) {
1854648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        Slog.w(TAG, "No processes killed for memory; killing self");
1855648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        Process.killProcess(Process.myPid());
1856648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    }
1857648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                } catch (RemoteException ex) {
1858648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                }
185983a6f450bde23e1bfd07ee1c218dab35053dec76Dianne Hackborn                mLayoutRequested = true;    // ask wm for a new surface next time.
1860a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                return;
1861a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            } catch (IllegalArgumentException e) {
1862c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                Log.e(TAG, "IllegalArgumentException locking surface", e);
1863db773c557226e8008a1fff7596321a69289c80baDianne Hackborn                // Don't assume this is due to out of memory, it could be
1864db773c557226e8008a1fff7596321a69289c80baDianne Hackborn                // something else, and if it is something else then we could
1865db773c557226e8008a1fff7596321a69289c80baDianne Hackborn                // kill stuff (or ourself) for no reason.
186683a6f450bde23e1bfd07ee1c218dab35053dec76Dianne Hackborn                mLayoutRequested = true;    // ask wm for a new surface next time.
1867a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                return;
18685bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy            }
18695bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy
1870a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            try {
1871a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                if (!dirty.isEmpty() || mIsAnimating) {
1872a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    long startTime = 0L;
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1874a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    if (DEBUG_ORIENTATION || DEBUG_DRAW) {
1875c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                        Log.v(TAG, "Surface " + surface + " drawing to bitmap w="
1876a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                + canvas.getWidth() + ", h=" + canvas.getHeight());
1877a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        //canvas.drawARGB(255, 255, 0, 0);
1878a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18805429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy                    if (ViewDebug.DEBUG_PROFILE_DRAWING) {
1881a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        startTime = SystemClock.elapsedRealtime();
1882a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1884a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // If this bitmap's format includes an alpha channel, we
1885a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // need to clear it before drawing so that the child will
1886a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // properly re-composite its drawing on a transparent
1887a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // background. This automatically respects the clip/dirty region
1888a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // or
1889a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // If we are applying an offset, we need to clear the area
1890a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // where the offset doesn't appear to avoid having garbage
1891a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // left in the blank areas.
1892a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    if (!canvas.isOpaque() || yoff != 0) {
1893a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        canvas.drawColor(0, PorterDuff.Mode.CLEAR);
1894a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1896a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    dirty.setEmpty();
1897a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    mIsAnimating = false;
1898a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    mAttachInfo.mDrawingTime = SystemClock.uptimeMillis();
1899a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    mView.mPrivateFlags |= View.DRAWN;
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1901a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    if (DEBUG_DRAW) {
1902a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        Context cxt = mView.getContext();
1903a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        Log.i(TAG, "Drawing: package:" + cxt.getPackageName() +
1904a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                ", metrics=" + cxt.getResources().getDisplayMetrics() +
1905a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                ", compatibilityInfo=" + cxt.getResources().getCompatibilityInfo());
1906a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
1907a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    try {
1908a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        canvas.translate(0, -yoff);
1909a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        if (mTranslator != null) {
1910a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                            mTranslator.translateCanvas(canvas);
1911a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        }
1912a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        canvas.setScreenDensity(scalingRequired
1913a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                ? DisplayMetrics.DENSITY_DEVICE : 0);
191402ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy                        mAttachInfo.mSetIgnoreDirtyState = false;
1915a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        mView.draw(canvas);
1916a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    } finally {
191702ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy                        if (!mAttachInfo.mSetIgnoreDirtyState) {
1918ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                            // Only clear the flag if it was not set during the mView.draw() call
1919ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                            mAttachInfo.mIgnoreDirtyState = false;
1920ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                        }
1921a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
19228169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
192343a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato                    if (false && ViewDebug.consistencyCheckEnabled) {
1924a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        mView.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_DRAWING);
19258169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                    }
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19275429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy                    if (ViewDebug.DEBUG_PROFILE_DRAWING) {
1928a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        EventLog.writeEvent(60000, SystemClock.elapsedRealtime() - startTime);
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1932a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            } finally {
1933a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                surface.unlockCanvasAndPost(canvas);
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_LOGV) {
1938c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            Log.v(TAG, "Surface " + surface + " unlockCanvasAndPost");
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19408506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
19410f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        if (animating) {
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFullRedrawNeeded = true;
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean scrollToRectOrFocus(Rect rectangle, boolean immediate) {
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View.AttachInfo attachInfo = mAttachInfo;
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect ci = attachInfo.mContentInsets;
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect vi = attachInfo.mVisibleInsets;
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int scrollY = 0;
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean handled = false;
19538506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (vi.left > ci.left || vi.top > ci.top
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || vi.right > ci.right || vi.bottom > ci.bottom) {
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We'll assume that we aren't going to change the scroll
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // offset, since we want to avoid that unless it is actually
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // going to make the focus visible...  otherwise we scroll
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // all over the place.
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrollY = mScrollY;
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We can be called for two different situations: during a draw,
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // to update the scroll position if the focus has changed (in which
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // case 'rectangle' is null), or in response to a
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // requestChildRectangleOnScreen() call (in which case 'rectangle'
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // is non-null and we just want to scroll to whatever that
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // rectangle is).
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View focus = mRealFocusedView;
1968e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy
1969e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            // When in touch mode, focus points to the previously focused view,
1970e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            // which may have been removed from the view hierarchy. The following
1971b71193bffc1d2ec60efd987300e2e85e678aa6f0Joe Onorato            // line checks whether the view is still in our hierarchy.
1972b71193bffc1d2ec60efd987300e2e85e678aa6f0Joe Onorato            if (focus == null || focus.mAttachInfo != mAttachInfo) {
1973e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy                mRealFocusedView = null;
1974e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy                return false;
1975e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            }
1976e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focus != mLastScrolledFocus) {
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If the focus has changed, then ignore any requests to scroll
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to a rectangle; first we want to make sure the entire focus
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // view is visible.
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rectangle = null;
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Eval scroll: focus=" + focus
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " rectangle=" + rectangle + " ci=" + ci
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " vi=" + vi);
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focus == mLastScrolledFocus && !mScrollMayChange
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && rectangle == null) {
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Optimization: if the focus hasn't changed since last
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // time, and no layout has happened, then just leave things
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // as they are.
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Keeping scroll y="
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + mScrollY + " vi=" + vi.toShortString());
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (focus != null) {
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We need to determine if the currently focused view is
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // within the visible part of the window and, if not, apply
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // a pan so it can be seen.
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastScrolledFocus = focus;
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScrollMayChange = false;
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Need to scroll?");
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Try to find the rectangle from the focus view.
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (focus.getGlobalVisibleRect(mVisRect, null)) {
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Root w="
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mView.getWidth() + " h=" + mView.getHeight()
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " ci=" + ci.toShortString()
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " vi=" + vi.toShortString());
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (rectangle == null) {
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        focus.getFocusedRect(mTempRect);
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Focus " + focus
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": focusRect=" + mTempRect.toShortString());
20101c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                        if (mView instanceof ViewGroup) {
20111c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                            ((ViewGroup) mView).offsetDescendantRectToMyCoords(
20121c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                                    focus, mTempRect);
20131c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                        }
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Focus in window: focusRect="
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString()
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visRect=" + mVisRect.toShortString());
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTempRect.set(rectangle);
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Request scroll to rect: "
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString()
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visRect=" + mVisRect.toShortString());
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mTempRect.intersect(mVisRect)) {
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Focus window visible rect: "
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString());
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mTempRect.height() >
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                (mView.getHeight()-vi.top-vi.bottom)) {
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If the focus simply is not going to fit, then
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // best is probably just to leave things as-is.
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Too tall; leaving scrollY=" + scrollY);
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if ((mTempRect.top-scrollY) < vi.top) {
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            scrollY -= vi.top - (mTempRect.top-scrollY);
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Top covered; scrollY=" + scrollY);
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if ((mTempRect.bottom-scrollY)
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                > (mView.getHeight()-vi.bottom)) {
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            scrollY += (mTempRect.bottom-scrollY)
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    - (mView.getHeight()-vi.bottom);
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Bottom covered; scrollY=" + scrollY);
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        handled = true;
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20518506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scrollY != mScrollY) {
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Pan scroll changed: old="
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mScrollY + " , new=" + scrollY);
20557d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            if (!immediate && mResizeBuffer == null) {
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mScroller == null) {
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mScroller = new Scroller(mView.getContext());
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScroller.startScroll(0, mScrollY, 0, scrollY-mScrollY);
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (mScroller != null) {
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScroller.abortAnimation();
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrollY = scrollY;
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20658506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return handled;
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20688506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestChildFocus(View child, View focused) {
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFocusedView != focused) {
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(mFocusedView, focused);
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFocusedView = mRealFocusedView = focused;
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Request child focus: focus now "
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + mFocusedView);
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearChildFocus(View child) {
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View oldFocus = mFocusedView;
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Clearing child focus");
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFocusedView = mRealFocusedView = null;
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null && !mView.hasFocus()) {
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If a view gets the focus, the listener will be invoked from requestChildFocus()
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mView.requestFocus(View.FOCUS_FORWARD)) {
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(oldFocus, null);
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (oldFocus != null) {
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(oldFocus, null);
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void focusableViewAvailable(View v) {
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21011c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy        if (mView != null) {
21021c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            if (!mView.hasFocus()) {
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                v.requestFocus();
21041c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            } else {
21051c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // the one case where will transfer focus away from the current one
21061c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // is if the current view is a view group that prefers to give focus
21071c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // to its children first AND the view is a descendant of it.
21081c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                mFocusedView = mView.findFocus();
21091c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                boolean descendantsHaveDibsOnFocus =
21101c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                        (mFocusedView instanceof ViewGroup) &&
21111c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                            (((ViewGroup) mFocusedView).getDescendantFocusability() ==
21121c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                                    ViewGroup.FOCUS_AFTER_DESCENDANTS);
21131c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                if (descendantsHaveDibsOnFocus && isViewDescendantOf(v, mFocusedView)) {
21141c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                    // If a view gets the focus, the listener will be invoked from requestChildFocus()
21151c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                    v.requestFocus();
21161c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                }
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void recomputeViewAttributes(View child) {
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == child) {
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mRecomputeGlobalAttributes = true;
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mWillDrawSoon) {
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduleTraversals();
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchDetachedFromWindow() {
213290fc03bc493fc2c984599b198b9d50bc387134f2Romain Guy        if (mView != null && mView.mAttachInfo != null) {
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mView.dispatchDetachedFromWindow();
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityInteractionConnectionManager.ensureNoConnection();
21378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager.removeAccessibilityStateChangeListener(
21388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAccessibilityInteractionConnectionManager);
2139eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        removeSendWindowContentChangedCallback();
21408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView = null;
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mRootView = null;
21435583dc630f861dd9a3006390db227f9296007e00Mathias Agopian        mAttachInfo.mSurface = null;
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
214529d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy        destroyHardwareRenderer();
21464caa4ed120a86e855d4d3b6b455c6fb9ca22e365Romain Guy
21470586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        mSurface.release();
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
214900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (mInputChannel != null) {
215000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (mInputQueueCallback != null) {
215100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                mInputQueueCallback.onInputQueueDestroyed(mInputQueue);
215200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                mInputQueueCallback = null;
215300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            } else {
215400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                InputQueue.unregisterInputChannel(mInputChannel);
215546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
215646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sWindowSession.remove(mWindow);
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2161349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
216200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // Dispose the input channel after removing the window so the Window Manager
216300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // doesn't interpret the input channel being closed as an abnormal termination.
216400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (mInputChannel != null) {
216500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputChannel.dispose();
216600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputChannel = null;
2167349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        }
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21698506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2170694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    void updateConfiguration(Configuration config, boolean force) {
2171694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        if (DEBUG_CONFIGURATION) Log.v(TAG,
2172694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                "Applying new config to window "
2173694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                + mWindowAttributes.getTitle()
2174694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                + ": " + config);
21755fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
21765fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatibilityInfo ci = mCompatibilityInfo.getIfNeeded();
21775fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (ci != null) {
21785fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            config = new Configuration(config);
21795fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            ci.applyToConfiguration(config);
21805fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
21815fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
2182694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        synchronized (sConfigCallbacks) {
2183694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            for (int i=sConfigCallbacks.size()-1; i>=0; i--) {
2184694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                sConfigCallbacks.get(i).onConfigurationChanged(config);
2185694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            }
2186694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        }
2187694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        if (mView != null) {
2188694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // At this point the resources have been updated to
2189694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // have the most recent config, whatever that is.  Use
2190694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // the on in them which may be newer.
21911c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            config = mView.getResources().getConfiguration();
2192694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            if (force || mLastConfiguration.diff(config) != 0) {
2193694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mLastConfiguration.setTo(config);
2194694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mView.dispatchConfigurationChanged(config);
2195694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            }
2196694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        }
2197694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    }
2198694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return true if child is an ancestor of parent, (or equal to the parent).
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean isViewDescendantOf(View child, View parent) {
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (child == parent) {
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ViewParent theParent = child.getParent();
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (theParent instanceof ViewGroup) && isViewDescendantOf((View) theParent, parent);
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2211cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy    private static void forceLayout(View view) {
2212cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        view.forceLayout();
2213cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        if (view instanceof ViewGroup) {
2214cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            ViewGroup group = (ViewGroup) view;
2215cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            final int count = group.getChildCount();
2216cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            for (int i = 0; i < count; i++) {
2217cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                forceLayout(group.getChildAt(i));
2218cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            }
2219cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        }
2220cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy    }
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DO_TRAVERSAL = 1000;
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DIE = 1001;
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int RESIZED = 1002;
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int RESIZED_REPORT = 1003;
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int WINDOW_FOCUS_CHANGED = 1004;
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_KEY = 1005;
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_POINTER = 1006;
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_TRACKBALL = 1007;
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_APP_VISIBILITY = 1008;
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_GET_NEW_SURFACE = 1009;
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int FINISHED_EVENT = 1010;
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_KEY_FROM_IME = 1011;
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int FINISH_INPUT_CONNECTION = 1012;
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int CHECK_FOCUS = 1013;
2236ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    public final static int CLOSE_SYSTEM_DIALOGS = 1014;
2237a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    public final static int DISPATCH_DRAG_EVENT = 1015;
223891e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate    public final static int DISPATCH_DRAG_LOCATION_EVENT = 1016;
2239664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    public final static int DISPATCH_SYSTEM_UI_VISIBILITY = 1017;
224010f4126a367071a49f208f10ceb1ed0e1151d48cJoe Onorato    public final static int DISPATCH_GENERIC_MOTION = 1018;
22415fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public final static int UPDATE_CONFIGURATION = 1019;
2242f741e679c496f7345304a6543f01d7048e31d1a7Dianne Hackborn    public final static int DO_PERFORM_ACCESSIBILITY_ACTION = 1020;
2243f741e679c496f7345304a6543f01d7048e31d1a7Dianne Hackborn    public final static int DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID = 1021;
2244f741e679c496f7345304a6543f01d7048e31d1a7Dianne Hackborn    public final static int DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID = 1022;
2245f741e679c496f7345304a6543f01d7048e31d1a7Dianne Hackborn    public final static int DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT = 1023;
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2248f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy    public String getMessageName(Message message) {
2249f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy        switch (message.what) {
2250f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DO_TRAVERSAL:
2251f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DO_TRAVERSAL";
2252f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DIE:
2253f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DIE";
2254f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case RESIZED:
2255f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "RESIZED";
2256f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case RESIZED_REPORT:
2257f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "RESIZED_REPORT";
2258f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case WINDOW_FOCUS_CHANGED:
2259f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "WINDOW_FOCUS_CHANGED";
2260f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_KEY:
2261f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_KEY";
2262f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_POINTER:
2263f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_POINTER";
2264f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_TRACKBALL:
2265f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_TRACKBALL";
2266f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_APP_VISIBILITY:
2267f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_APP_VISIBILITY";
2268f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_GET_NEW_SURFACE:
2269f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_GET_NEW_SURFACE";
2270f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case FINISHED_EVENT:
2271f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "FINISHED_EVENT";
2272f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_KEY_FROM_IME:
2273f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_KEY_FROM_IME";
2274f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case FINISH_INPUT_CONNECTION:
2275f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "FINISH_INPUT_CONNECTION";
2276f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case CHECK_FOCUS:
2277f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "CHECK_FOCUS";
2278f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case CLOSE_SYSTEM_DIALOGS:
2279f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "CLOSE_SYSTEM_DIALOGS";
2280f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_DRAG_EVENT:
2281f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_DRAG_EVENT";
2282f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_DRAG_LOCATION_EVENT:
2283f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_DRAG_LOCATION_EVENT";
2284f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_SYSTEM_UI_VISIBILITY:
2285f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_SYSTEM_UI_VISIBILITY";
2286f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_GENERIC_MOTION:
2287f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_GENERIC_MOTION";
2288f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case UPDATE_CONFIGURATION:
2289f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "UPDATE_CONFIGURATION";
2290f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DO_PERFORM_ACCESSIBILITY_ACTION:
2291f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DO_PERFORM_ACCESSIBILITY_ACTION";
2292f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID:
2293f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID";
2294f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID:
2295f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID";
2296f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT:
2297f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT";
2298f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy
2299f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy        }
2300f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy        return super.getMessageName(message);
2301f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy    }
2302f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy
2303f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy    @Override
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void handleMessage(Message msg) {
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (msg.what) {
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case View.AttachInfo.INVALIDATE_MSG:
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ((View) msg.obj).invalidate();
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case View.AttachInfo.INVALIDATE_RECT_MSG:
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View.AttachInfo.InvalidateInfo info = (View.AttachInfo.InvalidateInfo) msg.obj;
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info.target.invalidate(info.left, info.top, info.right, info.bottom);
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info.release();
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DO_TRAVERSAL:
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mProfile) {
2316c6cc0f8c19d9eccf408a443fa2bf668af261dcd0Joe Onorato                Debug.startMethodTracing("ViewAncestor");
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23194e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            final long traversalStartTime;
23204e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (ViewDebug.DEBUG_LATENCY) {
23214e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                traversalStartTime = System.nanoTime();
23224e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                mLastDrawDurationNanos = 0;
23234e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
23244e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performTraversals();
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23274e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (ViewDebug.DEBUG_LATENCY) {
23284e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                long now = System.nanoTime();
23294e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                Log.d(TAG, "Latency: Spent "
23304e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + ((now - traversalStartTime) * 0.000001f)
23314e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + "ms in performTraversals(), with "
23324e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + (mLastDrawDurationNanos * 0.000001f)
23334e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + "ms of that time in draw()");
23344e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                mLastTraversalFinishedTimeNanos = now;
23354e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
23364e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mProfile) {
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Debug.stopMethodTracing();
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProfile = false;
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case FINISHED_EVENT:
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handleFinishedEvent(msg.arg1, msg.arg2 != 0);
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DISPATCH_KEY:
234692ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown            deliverKeyEvent((KeyEvent)msg.obj, msg.arg1 != 0);
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
23483915bb845b032dc184dba5e60970b803390ca3edJeff Brown        case DISPATCH_POINTER:
23493915bb845b032dc184dba5e60970b803390ca3edJeff Brown            deliverPointerEvent((MotionEvent) msg.obj, msg.arg1 != 0);
23503915bb845b032dc184dba5e60970b803390ca3edJeff Brown            break;
23513915bb845b032dc184dba5e60970b803390ca3edJeff Brown        case DISPATCH_TRACKBALL:
23523915bb845b032dc184dba5e60970b803390ca3edJeff Brown            deliverTrackballEvent((MotionEvent) msg.obj, msg.arg1 != 0);
23533915bb845b032dc184dba5e60970b803390ca3edJeff Brown            break;
2354cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        case DISPATCH_GENERIC_MOTION:
2355cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            deliverGenericMotionEvent((MotionEvent) msg.obj, msg.arg1 != 0);
2356cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            break;
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DISPATCH_APP_VISIBILITY:
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handleAppVisibility(msg.arg1 != 0);
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DISPATCH_GET_NEW_SURFACE:
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handleGetNewSurface();
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case RESIZED:
2364e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            ResizedInfo ri = (ResizedInfo)msg.obj;
236564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWinFrame.width() == msg.arg1 && mWinFrame.height() == msg.arg2
2367e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    && mPendingContentInsets.equals(ri.coveredInsets)
2368d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn                    && mPendingVisibleInsets.equals(ri.visibleInsets)
2369d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn                    && ((ResizedInfo)msg.obj).newConfig == null) {
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // fall through...
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case RESIZED_REPORT:
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAdded) {
2375e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                Configuration config = ((ResizedInfo)msg.obj).newConfig;
2376e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (config != null) {
2377694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    updateConfiguration(config, false);
2378e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                }
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWinFrame.left = 0;
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWinFrame.right = msg.arg1;
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWinFrame.top = 0;
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWinFrame.bottom = msg.arg2;
2383e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                mPendingContentInsets.set(((ResizedInfo)msg.obj).coveredInsets);
2384e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                mPendingVisibleInsets.set(((ResizedInfo)msg.obj).visibleInsets);
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (msg.what == RESIZED_REPORT) {
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mReportNextDraw = true;
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2388cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy
2389cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                if (mView != null) {
2390cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                    forceLayout(mView);
2391cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                }
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout();
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case WINDOW_FOCUS_CHANGED: {
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAdded) {
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean hasWindowFocus = msg.arg1 != 0;
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mHasWindowFocus = hasWindowFocus;
239959a12cae208790dd202656f50a40a53ef49baeebRomain Guy
240059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                profileRendering(hasWindowFocus);
240159a12cae208790dd202656f50a40a53ef49baeebRomain Guy
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (hasWindowFocus) {
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean inTouchMode = msg.arg2 != 0;
24042d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy                    ensureTouchModeLocally(inTouchMode);
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2406c361da845a205ac35e724c0ca436744d483de7aaRomain Guy                    if (mAttachInfo.mHardwareRenderer != null &&
2407c361da845a205ac35e724c0ca436744d483de7aaRomain Guy                            mSurface != null && mSurface.isValid()) {
24087d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                        mFullRedrawNeeded = true;
2409648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        try {
2410648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            mAttachInfo.mHardwareRenderer.initializeIfNeeded(mWidth, mHeight,
2411648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    mAttachInfo, mHolder);
2412648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        } catch (Surface.OutOfResourcesException e) {
2413648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            Log.e(TAG, "OutOfResourcesException locking surface", e);
2414648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            try {
2415648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                if (!sWindowSession.outOfMemory(mWindow)) {
2416648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    Slog.w(TAG, "No processes killed for memory; killing self");
2417648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    Process.killProcess(Process.myPid());
2418648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                }
2419648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            } catch (RemoteException ex) {
2420648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
2421648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            // Retry in a bit.
2422648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            sendMessageDelayed(obtainMessage(msg.what, msg.arg1, msg.arg2), 500);
2423648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            return;
2424648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        }
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24278506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWasImTarget = WindowManager.LayoutParams
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .mayUseInputMethod(mWindowAttributes.flags);
24308506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InputMethodManager imm = InputMethodManager.peekInstance();
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mView != null) {
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (hasWindowFocus && imm != null && mLastWasImTarget) {
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        imm.startGettingWindowFocus(mView);
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
243683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    mAttachInfo.mKeyDispatchState.reset();
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView.dispatchWindowFocusChanged(hasWindowFocus);
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
243975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Note: must be done after the focus change callbacks,
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // so all of the view state is set up correctly.
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (hasWindowFocus) {
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (imm != null && mLastWasImTarget) {
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        imm.onWindowFocus(mView, mView.findFocus(),
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mWindowAttributes.softInputMode,
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                !mHasHadWindowFocus, mWindowAttributes.flags);
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Clear the forward bit.  We can just do this directly, since
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // the window manager doesn't care about it.
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWindowAttributes.softInputMode &=
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ((WindowManager.LayoutParams)mView.getLayoutParams())
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .softInputMode &=
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHasHadWindowFocus = true;
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
245775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
245875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                if (hasWindowFocus && mView != null) {
245975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                    sendAccessibilityEvents();
246075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                }
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DIE:
246494d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn            doDie();
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2466105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        case DISPATCH_KEY_FROM_IME: {
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_LOGV) Log.v(
2468c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                TAG, "Dispatching key "
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + msg.obj + " from IME to " + mView);
2470105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            KeyEvent event = (KeyEvent)msg.obj;
2471105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if ((event.getFlags()&KeyEvent.FLAG_FROM_SYSTEM) != 0) {
2472105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                // The IME is trying to say this event is from the
2473105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                // system!  Bad bad bad!
24741c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                //noinspection UnusedAssignment
2475812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                event = KeyEvent.changeFlags(event, event.getFlags() & ~KeyEvent.FLAG_FROM_SYSTEM);
2476105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
24773915bb845b032dc184dba5e60970b803390ca3edJeff Brown            deliverKeyEventPostIme((KeyEvent)msg.obj, false);
2478105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        } break;
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case FINISH_INPUT_CONNECTION: {
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputMethodManager imm = InputMethodManager.peekInstance();
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imm != null) {
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imm.reportFinishInputConnection((InputConnection)msg.obj);
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case CHECK_FOCUS: {
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputMethodManager imm = InputMethodManager.peekInstance();
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imm != null) {
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imm.checkFocus();
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2491ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        case CLOSE_SYSTEM_DIALOGS: {
2492ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            if (mView != null) {
2493ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                mView.onCloseSystemDialogs((String)msg.obj);
2494ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            }
2495ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        } break;
249691e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        case DISPATCH_DRAG_EVENT:
249791e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        case DISPATCH_DRAG_LOCATION_EVENT: {
24987fb8b565f9cd2ec6a63ff4d8a89f98f68a1a138cChristopher Tate            DragEvent event = (DragEvent)msg.obj;
24997fb8b565f9cd2ec6a63ff4d8a89f98f68a1a138cChristopher Tate            event.mLocalState = mLocalDragState;    // only present when this app called startDrag()
25007fb8b565f9cd2ec6a63ff4d8a89f98f68a1a138cChristopher Tate            handleDragEvent(event);
2501a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        } break;
2502664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        case DISPATCH_SYSTEM_UI_VISIBILITY: {
2503664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            handleDispatchSystemUiVisibilityChanged(msg.arg1);
2504664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        } break;
25055fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        case UPDATE_CONFIGURATION: {
25065fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            Configuration config = (Configuration)msg.obj;
25075fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            if (config.isOtherSeqNewer(mLastConfiguration)) {
25085fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                config = mLastConfiguration;
25095fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            }
25105fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            updateConfiguration(config, false);
25115fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        } break;
25128643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID: {
2513601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mView != null) {
2514601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
2515601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .findAccessibilityNodeInfoByAccessibilityIdUiThread(msg);
2516601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
25178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        } break;
25188643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        case DO_PERFORM_ACCESSIBILITY_ACTION: {
2519601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mView != null) {
2520601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
2521601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .perfromAccessibilityActionUiThread(msg);
2522601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
25238643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        } break;
25248643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID: {
2525601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mView != null) {
2526601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
2527601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .findAccessibilityNodeInfoByViewIdUiThread(msg);
2528601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
25298643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        } break;
25308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT: {
2531601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mView != null) {
2532601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
2533601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .findAccessibilityNodeInfosByViewTextUiThread(msg);
2534601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
25358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        } break;
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
25391c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy    private void startInputEvent(InputQueue.FinishedCallback finishedCallback) {
254093ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        if (mFinishedCallback != null) {
254193ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown            Slog.w(TAG, "Received a new input event from the input queue but there is "
254293ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown                    + "already an unfinished input event in progress.");
254393ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        }
254493ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown
25454e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
25464e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventReceiveTimeNanos = System.nanoTime();
25474e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverTimeNanos = 0;
25484e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverPostImeTimeNanos = 0;
25494e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
25504e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
255193ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        mFinishedCallback = finishedCallback;
255293ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown    }
255393ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown
25544e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    private void finishInputEvent(InputEvent event, boolean handled) {
255593ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        if (LOCAL_LOGV) Log.v(TAG, "Telling window manager input event is finished");
255692ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown
25574e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (mFinishedCallback == null) {
255893ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown            Slog.w(TAG, "Attempted to tell the input queue that the current input event "
255993ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown                    + "is finished but there is no input event actually in progress.");
25604e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            return;
25614e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
25624e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
25634e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
25644e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            final long now = System.nanoTime();
25654e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            final long eventTime = event.getEventTimeNano();
25664e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            final StringBuilder msg = new StringBuilder();
25674e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append("Latency: Spent ");
25684e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append((now - mInputEventReceiveTimeNanos) * 0.000001f);
25694e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append("ms processing ");
25704e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (event instanceof KeyEvent) {
25714e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                final KeyEvent  keyEvent = (KeyEvent)event;
25724e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append("key event, action=");
25734e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append(KeyEvent.actionToString(keyEvent.getAction()));
25744e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            } else {
25754e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                final MotionEvent motionEvent = (MotionEvent)event;
25764e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append("motion event, action=");
25774e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append(MotionEvent.actionToString(motionEvent.getAction()));
25784e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append(", historySize=");
25794e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append(motionEvent.getHistorySize());
25804e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
25814e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append(", handled=");
25824e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append(handled);
25834e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append(", received at +");
25844e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append((mInputEventReceiveTimeNanos - eventTime) * 0.000001f);
25854e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (mInputEventDeliverTimeNanos != 0) {
25864e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append("ms, delivered at +");
25874e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append((mInputEventDeliverTimeNanos - eventTime) * 0.000001f);
25884e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
25894e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (mInputEventDeliverPostImeTimeNanos != 0) {
25904e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append("ms, delivered post IME at +");
25914e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append((mInputEventDeliverPostImeTimeNanos - eventTime) * 0.000001f);
25924e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
25934e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append("ms, finished at +");
25944e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append((now - eventTime) * 0.000001f);
25954e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append("ms.");
25964e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            Log.d(TAG, msg.toString());
259746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
25984e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
25994e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        mFinishedCallback.finished(handled);
26004e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        mFinishedCallback = null;
260146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
260246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Something in the current window tells us we need to change the touch mode.  For
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * example, we are not in touch mode, and the user touches the screen.
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the touch mode has changed, tell the window manager, and handle it locally.
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inTouchMode Whether we want to be in touch mode.
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the touch mode changed and focus changed was changed as a result
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean ensureTouchMode(boolean inTouchMode) {
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) Log.d("touchmode", "ensureTouchMode(" + inTouchMode + "), current "
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "touch mode is " + mAttachInfo.mInTouchMode);
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mInTouchMode == inTouchMode) return false;
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // tell the window manager
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sWindowSession.setInTouchMode(inTouchMode);
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(e);
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // handle the change
26252d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy        return ensureTouchModeLocally(inTouchMode);
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Ensure that the touch mode for this window is set, and if it is changing,
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * take the appropriate action.
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inTouchMode Whether we want to be in touch mode.
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the touch mode changed and focus changed was changed as a result
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26342d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy    private boolean ensureTouchModeLocally(boolean inTouchMode) {
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) Log.d("touchmode", "ensureTouchModeLocally(" + inTouchMode + "), current "
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "touch mode is " + mAttachInfo.mInTouchMode);
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mInTouchMode == inTouchMode) return false;
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mInTouchMode = inTouchMode;
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mTreeObserver.dispatchOnTouchModeChanged(inTouchMode);
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26432d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy        return (inTouchMode) ? enterTouchMode() : leaveTouchMode();
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean enterTouchMode() {
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null) {
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView.hasFocus()) {
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // note: not relying on mFocusedView here because this could
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // be when the window is first being added, and mFocused isn't
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // set yet.
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final View focused = mView.findFocus();
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (focused != null && !focused.isFocusableInTouchMode()) {
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ViewGroup ancestorToTakeFocus =
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            findAncestorToTakeFocusInTouchMode(focused);
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ancestorToTakeFocus != null) {
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // there is an ancestor that wants focus after its descendants that
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // is focusable in touch mode.. give it focus
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return ancestorToTakeFocus.requestFocus();
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // nothing appropriate to have focus in touch mode, clear it out
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mView.unFocus();
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(focused, null);
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFocusedView = null;
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return true;
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Find an ancestor of focused that wants focus after its descendants and is
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focusable in touch mode.
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param focused The currently focused view.
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return An appropriate view, or null if no such view exists.
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ViewGroup findAncestorToTakeFocusInTouchMode(View focused) {
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewParent parent = focused.getParent();
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (parent instanceof ViewGroup) {
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ViewGroup vgParent = (ViewGroup) parent;
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (vgParent.getDescendantFocusability() == ViewGroup.FOCUS_AFTER_DESCENDANTS
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && vgParent.isFocusableInTouchMode()) {
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return vgParent;
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (vgParent.isRootNamespace()) {
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parent = vgParent.getParent();
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean leaveTouchMode() {
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null) {
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView.hasFocus()) {
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // i learned the hard way to not trust mFocusedView :)
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedView = mView.findFocus();
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!(mFocusedView instanceof ViewGroup)) {
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // some view has focus, let it keep it
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (((ViewGroup)mFocusedView).getDescendantFocusability() !=
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ViewGroup.FOCUS_AFTER_DESCENDANTS) {
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // some view group has focus, and doesn't prefer its children
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // over itself for focus, so let them keep it.
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // find the best view to give focus to in this brave new non-touch-mode
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // world
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View focused = focusSearch(null, View.FOCUS_DOWN);
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focused != null) {
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return focused.requestFocus(View.FOCUS_DOWN);
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27243915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private void deliverPointerEvent(MotionEvent event, boolean sendDone) {
27254e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
27264e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverTimeNanos = System.nanoTime();
27274e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
27284e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
27297564d62a773857b2f46405d22f296edb3530d88eJeff Brown        final boolean isTouchEvent = event.isTouchEvent();
273021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
27317564d62a773857b2f46405d22f296edb3530d88eJeff Brown            if (isTouchEvent) {
273221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                mInputEventConsistencyVerifier.onTouchEvent(event, 0);
273321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            } else {
273421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                mInputEventConsistencyVerifier.onGenericMotionEvent(event, 0);
273521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            }
273621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
273721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
27383915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If there is no view, then the event will not be handled.
27393915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
274033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, false);
27413915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
27423915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
27433915bb845b032dc184dba5e60970b803390ca3edJeff Brown
27443915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Translate the pointer event for compatibility, if needed.
274500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (mTranslator != null) {
274600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mTranslator.translateEventInScreenToAppWindow(event);
274700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27497564d62a773857b2f46405d22f296edb3530d88eJeff Brown        // Enter touch mode on down or scroll.
27507564d62a773857b2f46405d22f296edb3530d88eJeff Brown        final int action = event.getAction();
27517564d62a773857b2f46405d22f296edb3530d88eJeff Brown        if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_SCROLL) {
27523915bb845b032dc184dba5e60970b803390ca3edJeff Brown            ensureTouchMode(true);
27533915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
275400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
27553915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Offset the scroll position.
27563915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mCurScrollY != 0) {
27573915bb845b032dc184dba5e60970b803390ca3edJeff Brown            event.offsetLocation(0, mCurScrollY);
27583915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
27593915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (MEASURE_LATENCY) {
276033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            lt.sample("A Dispatching PointerEvents", System.nanoTime() - event.getEventTimeNano());
27613915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
27623915bb845b032dc184dba5e60970b803390ca3edJeff Brown
27633915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Remember the touch position for possible drag-initiation.
27647564d62a773857b2f46405d22f296edb3530d88eJeff Brown        if (isTouchEvent) {
27657564d62a773857b2f46405d22f296edb3530d88eJeff Brown            mLastTouchPoint.x = event.getRawX();
27667564d62a773857b2f46405d22f296edb3530d88eJeff Brown            mLastTouchPoint.y = event.getRawY();
27677564d62a773857b2f46405d22f296edb3530d88eJeff Brown        }
27683915bb845b032dc184dba5e60970b803390ca3edJeff Brown
27693915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Dispatch touch to view hierarchy.
277033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        boolean handled = mView.dispatchPointerEvent(event);
27713915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (MEASURE_LATENCY) {
277233bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            lt.sample("B Dispatched PointerEvents ", System.nanoTime() - event.getEventTimeNano());
27733915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
27743915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (handled) {
277533bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, true);
27763915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
27773915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
27783915bb845b032dc184dba5e60970b803390ca3edJeff Brown
27793915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Pointer event was unhandled.
278033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        finishMotionEvent(event, sendDone, false);
27813915bb845b032dc184dba5e60970b803390ca3edJeff Brown    }
27823915bb845b032dc184dba5e60970b803390ca3edJeff Brown
278333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    private void finishMotionEvent(MotionEvent event, boolean sendDone, boolean handled) {
27843915bb845b032dc184dba5e60970b803390ca3edJeff Brown        event.recycle();
27853915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (sendDone) {
27864e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            finishInputEvent(event, handled);
27873915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
27881c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy        //noinspection ConstantConditions
278933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        if (LOCAL_LOGV || WATCH_POINTER) {
279033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
279133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                Log.i(TAG, "Done dispatching!");
279233bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            }
279333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        }
279400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown    }
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27963915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private void deliverTrackballEvent(MotionEvent event, boolean sendDone) {
27974e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
27984e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverTimeNanos = System.nanoTime();
27994e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
28004e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_TRACKBALL) Log.v(TAG, "Motion event:" + event);
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
280321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
280421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onTrackballEvent(event, 0);
280521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
280621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
28073915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If there is no view, then the event will not be handled.
28083915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
280933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, false);
28103915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28133915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Deliver the trackball event to the view.
28143915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView.dispatchTrackballEvent(event)) {
28153915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // If we reach this, we delivered a trackball event to mView and
28163915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // mView consumed it. Because we will not translate the trackball
28173915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // event into a key event, touch mode will not exit, so we exit
28183915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // touch mode here.
28193915bb845b032dc184dba5e60970b803390ca3edJeff Brown            ensureTouchMode(false);
28203915bb845b032dc184dba5e60970b803390ca3edJeff Brown
282133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, true);
28223915bb845b032dc184dba5e60970b803390ca3edJeff Brown            mLastTrackballTime = Integer.MIN_VALUE;
28233915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
28243915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
28253915bb845b032dc184dba5e60970b803390ca3edJeff Brown
28263915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Translate the trackball event into DPAD keys and try to deliver those.
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final TrackballAxis x = mTrackballAxisX;
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final TrackballAxis y = mTrackballAxisY;
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long curTime = SystemClock.uptimeMillis();
28313915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if ((mLastTrackballTime + MAX_TRACKBALL_DELAY) < curTime) {
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // It has been too long since the last movement,
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // so restart at the beginning.
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            x.reset(0);
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            y.reset(0);
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTrackballTime = curTime;
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
283900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final int action = event.getAction();
284049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        final int metaState = event.getMetaState();
284100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        switch (action) {
284200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case MotionEvent.ACTION_DOWN:
284300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
284400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
284500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                deliverKeyEvent(new KeyEvent(curTime, curTime,
284649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER, 0, metaState,
284749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
284849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        InputDevice.SOURCE_KEYBOARD), false);
284900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                break;
285000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case MotionEvent.ACTION_UP:
285100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
285200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
285300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                deliverKeyEvent(new KeyEvent(curTime, curTime,
285449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER, 0, metaState,
285549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
285649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        InputDevice.SOURCE_KEYBOARD), false);
285700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                break;
285800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
286000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (DEBUG_TRACKBALL) Log.v(TAG, "TB X=" + x.position + " step="
286100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + x.step + " dir=" + x.dir + " acc=" + x.acceleration
286200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " move=" + event.getX()
286300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " / Y=" + y.position + " step="
286400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + y.step + " dir=" + y.dir + " acc=" + y.acceleration
286500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " move=" + event.getY());
286600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final float xOff = x.collect(event.getX(), event.getEventTime(), "X");
286700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final float yOff = y.collect(event.getY(), event.getEventTime(), "Y");
286800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
286900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // Generate DPAD events based on the trackball movement.
287000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // We pick the axis that has moved the most as the direction of
287100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // the DPAD.  When we generate DPAD events for one axis, then the
287200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // other axis is reset -- we don't want to perform DPAD jumps due
287300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // to slight movements in the trackball when making major movements
287400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // along the other axis.
287500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        int keycode = 0;
287600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        int movement = 0;
287700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        float accel = 1;
287800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (xOff > yOff) {
287900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            movement = x.generate((2/event.getXPrecision()));
288000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement != 0) {
288100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                keycode = movement > 0 ? KeyEvent.KEYCODE_DPAD_RIGHT
288200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        : KeyEvent.KEYCODE_DPAD_LEFT;
288300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                accel = x.acceleration;
288400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
288500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
288600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        } else if (yOff > 0) {
288700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            movement = y.generate((2/event.getYPrecision()));
288800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement != 0) {
288900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                keycode = movement > 0 ? KeyEvent.KEYCODE_DPAD_DOWN
289000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        : KeyEvent.KEYCODE_DPAD_UP;
289100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                accel = y.acceleration;
289200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
289300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
289400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
289500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
289600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (keycode != 0) {
289700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement < 0) movement = -movement;
289800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            int accelMovement = (int)(movement * accel);
289900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (DEBUG_TRACKBALL) Log.v(TAG, "Move: movement=" + movement
290000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    + " accelMovement=" + accelMovement
290100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    + " accel=" + accel);
290200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (accelMovement > movement) {
290300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (DEBUG_TRACKBALL) Log.v("foo", "Delivering fake DPAD: "
290400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        + keycode);
290500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                movement--;
290649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                int repeatCount = accelMovement - movement;
290700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                deliverKeyEvent(new KeyEvent(curTime, curTime,
290849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_MULTIPLE, keycode, repeatCount, metaState,
290949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
291049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        InputDevice.SOURCE_KEYBOARD), false);
291100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
291200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            while (movement > 0) {
291300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (DEBUG_TRACKBALL) Log.v("foo", "Delivering fake DPAD: "
291400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        + keycode);
291500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                movement--;
291600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                curTime = SystemClock.uptimeMillis();
291700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                deliverKeyEvent(new KeyEvent(curTime, curTime,
291849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_DOWN, keycode, 0, metaState,
291949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
292049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        InputDevice.SOURCE_KEYBOARD), false);
292100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                deliverKeyEvent(new KeyEvent(curTime, curTime,
292249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_UP, keycode, 0, metaState,
292349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
292449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        InputDevice.SOURCE_KEYBOARD), false);
292549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                }
292600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mLastTrackballTime = curTime;
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29283915bb845b032dc184dba5e60970b803390ca3edJeff Brown
29293915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Unfortunately we can't tell whether the application consumed the keys, so
29303915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // we always consider the trackball event handled.
293133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        finishMotionEvent(event, sendDone, true);
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2934cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private void deliverGenericMotionEvent(MotionEvent event, boolean sendDone) {
29354e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
29364e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverTimeNanos = System.nanoTime();
29374e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
29384e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
293921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
294021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onGenericMotionEvent(event, 0);
294121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
294221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
2943cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int source = event.getSource();
2944cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final boolean isJoystick = (source & InputDevice.SOURCE_CLASS_JOYSTICK) != 0;
2945cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2946cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        // If there is no view, then the event will not be handled.
2947cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (mView == null || !mAdded) {
2948cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (isJoystick) {
2949cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                updateJoystickDirection(event, false);
2950cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
295133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, false);
2952cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return;
2953cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
2954cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2955cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        // Deliver the event to the view.
2956cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (mView.dispatchGenericMotionEvent(event)) {
2957cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (isJoystick) {
2958cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                updateJoystickDirection(event, false);
2959cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
296033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, true);
2961cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return;
2962cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
2963cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2964cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (isJoystick) {
2965cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            // Translate the joystick event into DPAD keys and try to deliver those.
2966cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            updateJoystickDirection(event, true);
296733bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, true);
2968cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else {
296933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, false);
2970cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
2971cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
2972cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2973cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private void updateJoystickDirection(MotionEvent event, boolean synthesizeNewKeys) {
2974cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final long time = event.getEventTime();
2975cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int metaState = event.getMetaState();
2976cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int deviceId = event.getDeviceId();
2977cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int source = event.getSource();
29786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
29796f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        int xDirection = joystickAxisValueToDirection(event.getAxisValue(MotionEvent.AXIS_HAT_X));
29806f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        if (xDirection == 0) {
29816f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            xDirection = joystickAxisValueToDirection(event.getX());
29826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
29836f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
29846f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        int yDirection = joystickAxisValueToDirection(event.getAxisValue(MotionEvent.AXIS_HAT_Y));
29856f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        if (yDirection == 0) {
29866f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            yDirection = joystickAxisValueToDirection(event.getY());
29876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
2988cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2989cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (xDirection != mLastJoystickXDirection) {
2990cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (mLastJoystickXKeyCode != 0) {
2991cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                deliverKeyEvent(new KeyEvent(time, time,
2992cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_UP, mLastJoystickXKeyCode, 0, metaState,
2993cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source), false);
2994cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickXKeyCode = 0;
2995cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
2996cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2997cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            mLastJoystickXDirection = xDirection;
2998cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2999cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (xDirection != 0 && synthesizeNewKeys) {
3000cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickXKeyCode = xDirection > 0
3001cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        ? KeyEvent.KEYCODE_DPAD_RIGHT : KeyEvent.KEYCODE_DPAD_LEFT;
3002cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                deliverKeyEvent(new KeyEvent(time, time,
3003cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_DOWN, mLastJoystickXKeyCode, 0, metaState,
3004cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source), false);
3005cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3006cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3007cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3008cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (yDirection != mLastJoystickYDirection) {
3009cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (mLastJoystickYKeyCode != 0) {
3010cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                deliverKeyEvent(new KeyEvent(time, time,
3011cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_UP, mLastJoystickYKeyCode, 0, metaState,
3012cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source), false);
3013cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickYKeyCode = 0;
3014cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3015cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3016cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            mLastJoystickYDirection = yDirection;
3017cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3018cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (yDirection != 0 && synthesizeNewKeys) {
3019cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickYKeyCode = yDirection > 0
3020cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        ? KeyEvent.KEYCODE_DPAD_DOWN : KeyEvent.KEYCODE_DPAD_UP;
3021cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                deliverKeyEvent(new KeyEvent(time, time,
3022cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_DOWN, mLastJoystickYKeyCode, 0, metaState,
3023cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source), false);
3024cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3025cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3026cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3027cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3028cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private static int joystickAxisValueToDirection(float value) {
3029cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (value >= 0.5f) {
3030cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return 1;
3031cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else if (value <= -0.5f) {
3032cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return -1;
3033cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else {
3034cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return 0;
3035cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3036cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3037cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30394e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * Returns true if the key is used for keyboard navigation.
30404e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @param keyEvent The key event.
30414e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @return True if the key is used for keyboard navigation.
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30434e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown    private static boolean isNavigationKey(KeyEvent keyEvent) {
30444e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        switch (keyEvent.getKeyCode()) {
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_LEFT:
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_RIGHT:
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_UP:
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_DOWN:
30494e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_DPAD_CENTER:
30504e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_PAGE_UP:
30514e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_PAGE_DOWN:
30524e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_MOVE_HOME:
30534e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_MOVE_END:
30544e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_TAB:
30554e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_SPACE:
30564e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_ENTER:
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30634e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * Returns true if the key is used for typing.
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keyEvent The key event.
30654e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @return True if the key is used for typing.
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30674e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown    private static boolean isTypingKey(KeyEvent keyEvent) {
30684e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        return keyEvent.getUnicodeChar() > 0;
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30724e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * See if the key event means we should leave touch mode (and leave touch mode if so).
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event.
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether this key event should be consumed (meaning the act of
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   leaving touch mode alone is considered the event).
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean checkForLeavingTouchModeAndConsume(KeyEvent event) {
30784e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Only relevant in touch mode.
30794e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (!mAttachInfo.mInTouchMode) {
30804e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            return false;
30814e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        }
30824e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown
30834e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Only consider leaving touch mode on DOWN or MULTIPLE actions, never on UP.
308451a6bee6719820d09595f474264fcb833eff470aAdam Powell        final int action = event.getAction();
308551a6bee6719820d09595f474264fcb833eff470aAdam Powell        if (action != KeyEvent.ACTION_DOWN && action != KeyEvent.ACTION_MULTIPLE) {
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30884e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown
30894e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Don't leave touch mode if the IME told us not to.
30904e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if ((event.getFlags() & KeyEvent.FLAG_KEEP_TOUCH_MODE) != 0) {
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30944e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // If the key can be used for keyboard navigation then leave touch mode
30954e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // and select a focused view if needed (in ensureTouchMode).
30964e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // When a new focused view is selected, we consume the navigation key because
30974e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // navigation doesn't make much sense unless a view already has focus so
30984e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // the key's purpose is to set focus.
30994e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (isNavigationKey(event)) {
31004e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            return ensureTouchMode(false);
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31034e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // If the key can be used for typing then leave touch mode
31044e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // and select a focused view if needed (in ensureTouchMode).
31054e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Always allow the view to process the typing key.
31064e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (isTypingKey(event)) {
31074e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            ensureTouchMode(false);
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int enqueuePendingEvent(Object event, boolean sendDone) {
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int seq = mPendingEventSeq+1;
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (seq < 0) seq = 0;
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPendingEventSeq = seq;
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPendingEvents.put(seq, event);
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sendDone ? seq : -seq;
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Object retrievePendingEvent(int seq) {
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (seq < 0) seq = -seq;
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object event = mPendingEvents.get(seq);
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (event != null) {
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPendingEvents.remove(seq);
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return event;
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31308506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void deliverKeyEvent(KeyEvent event, boolean sendDone) {
31324e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
31334e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverTimeNanos = System.nanoTime();
31344e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
31354e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
313621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
313721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onKeyEvent(event, 0);
313821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
313921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
31403915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If there is no view, then the event will not be handled.
31413915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
31423915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, false);
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31453915bb845b032dc184dba5e60970b803390ca3edJeff Brown
31463915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (LOCAL_LOGV) Log.v(TAG, "Dispatching key " + event + " to " + mView);
31473915bb845b032dc184dba5e60970b803390ca3edJeff Brown
31483915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Perform predispatching before the IME.
31493915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView.dispatchKeyEventPreIme(event)) {
31503915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, true);
31513915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
31523915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
31533915bb845b032dc184dba5e60970b803390ca3edJeff Brown
31543915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Dispatch to the IME before propagating down the view hierarchy.
31553915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // The IME will eventually call back into handleFinishedEvent.
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mLastWasImTarget) {
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputMethodManager imm = InputMethodManager.peekInstance();
31583915bb845b032dc184dba5e60970b803390ca3edJeff Brown            if (imm != null) {
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seq = enqueuePendingEvent(event, sendDone);
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_IMF) Log.v(TAG, "Sending key event to IME: seq="
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + seq + " event=" + event);
31623915bb845b032dc184dba5e60970b803390ca3edJeff Brown                imm.dispatchKeyEvent(mView.getContext(), seq, event, mInputMethodCallback);
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31663915bb845b032dc184dba5e60970b803390ca3edJeff Brown
31673915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Not dispatching to IME, continue with post IME actions.
31683915bb845b032dc184dba5e60970b803390ca3edJeff Brown        deliverKeyEventPostIme(event, sendDone);
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31713915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private void handleFinishedEvent(int seq, boolean handled) {
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final KeyEvent event = (KeyEvent)retrievePendingEvent(seq);
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_IMF) Log.v(TAG, "IME finished event: seq=" + seq
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " handled=" + handled + " event=" + event);
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (event != null) {
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean sendDone = seq >= 0;
31773915bb845b032dc184dba5e60970b803390ca3edJeff Brown            if (handled) {
31783915bb845b032dc184dba5e60970b803390ca3edJeff Brown                finishKeyEvent(event, sendDone, true);
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
31803915bb845b032dc184dba5e60970b803390ca3edJeff Brown                deliverKeyEventPostIme(event, sendDone);
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31848506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
31853915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private void deliverKeyEventPostIme(KeyEvent event, boolean sendDone) {
31864e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
31874e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverPostImeTimeNanos = System.nanoTime();
31884e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
31894e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
31903915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If the view went away, then the event will not be handled.
31913915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
31923915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, false);
31933915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
31943915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31963915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If the key's purpose is to exit touch mode then we consume it and consider it handled.
31973915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (checkForLeavingTouchModeAndConsume(event)) {
31983915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, true);
31993915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
32003915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
32018506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
32029065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        // Make sure the fallback event policy sees all keys that will be delivered to the
32039065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        // view hierarchy.
32049065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        mFallbackEventHandler.preDispatchKeyEvent(event);
32059065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
32063915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Deliver the key to the view hierarchy.
32073915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView.dispatchKeyEvent(event)) {
32083915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, true);
32093915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
32103915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
321186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato
3212c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown        // If the Control modifier is held, try to interpret the key as a shortcut.
3213c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown        if (event.getAction() == KeyEvent.ACTION_UP
3214c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                && event.isCtrlPressed()
3215c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                && !KeyEvent.isModifierKey(event.getKeyCode())) {
3216c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            if (mView.dispatchKeyShortcutEvent(event)) {
3217c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                finishKeyEvent(event, sendDone, true);
3218c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                return;
3219c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            }
3220c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown        }
3221c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
32223915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Apply the fallback event policy.
32233915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mFallbackEventHandler.dispatchKeyEvent(event)) {
32243915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, true);
32253915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
32263915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32283915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Handle automatic focus changes.
32293915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (event.getAction() == KeyEvent.ACTION_DOWN) {
32303915bb845b032dc184dba5e60970b803390ca3edJeff Brown            int direction = 0;
32313915bb845b032dc184dba5e60970b803390ca3edJeff Brown            switch (event.getKeyCode()) {
32323915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_LEFT:
32334e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
32344e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_LEFT;
32354e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
32363915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
32373915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_RIGHT:
32384e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
32394e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_RIGHT;
32404e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
32413915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
32423915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_UP:
32434e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
32444e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_UP;
32454e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
32463915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
32473915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_DOWN:
32484e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
32494e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_DOWN;
32504e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
32514e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                break;
32524e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            case KeyEvent.KEYCODE_TAB:
32534e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
32544e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_FORWARD;
32554e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
32564e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_BACKWARD;
32574e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
32583915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
32593915bb845b032dc184dba5e60970b803390ca3edJeff Brown            }
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32613915bb845b032dc184dba5e60970b803390ca3edJeff Brown            if (direction != 0) {
32623915bb845b032dc184dba5e60970b803390ca3edJeff Brown                View focused = mView != null ? mView.findFocus() : null;
32633915bb845b032dc184dba5e60970b803390ca3edJeff Brown                if (focused != null) {
32643915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    View v = focused.focusSearch(direction);
32653915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    if (v != null && v != focused) {
32663915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // do the math the get the interesting rect
32673915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // of previous focused into the coord system of
32683915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // newly focused view
32693915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        focused.getFocusedRect(mTempRect);
32703915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        if (mView instanceof ViewGroup) {
32713915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            ((ViewGroup) mView).offsetDescendantRectToMyCoords(
32723915bb845b032dc184dba5e60970b803390ca3edJeff Brown                                    focused, mTempRect);
32733915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            ((ViewGroup) mView).offsetRectIntoDescendantCoords(
32743915bb845b032dc184dba5e60970b803390ca3edJeff Brown                                    v, mTempRect);
32753915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        }
32763915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        if (v.requestFocus(direction, mTempRect)) {
32773915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            playSoundEffect(
32783915bb845b032dc184dba5e60970b803390ca3edJeff Brown                                    SoundEffectConstants.getContantForFocusDirection(direction));
32793915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            finishKeyEvent(event, sendDone, true);
32803915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            return;
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
32833915bb845b032dc184dba5e60970b803390ca3edJeff Brown
32843915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    // Give the focused view a last chance to handle the dpad key.
32853915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    if (mView.dispatchUnhandledMove(focused, direction)) {
32863915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        finishKeyEvent(event, sendDone, true);
32873915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        return;
32883915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    }
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32913915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32933915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Key was unhandled.
32943915bb845b032dc184dba5e60970b803390ca3edJeff Brown        finishKeyEvent(event, sendDone, false);
32953915bb845b032dc184dba5e60970b803390ca3edJeff Brown    }
32963915bb845b032dc184dba5e60970b803390ca3edJeff Brown
32973915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private void finishKeyEvent(KeyEvent event, boolean sendDone, boolean handled) {
32983915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (sendDone) {
32994e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            finishInputEvent(event, handled);
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3303a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /* drag/drop */
3304407b4e91fe7627545b8110e683953353236b4543Christopher Tate    void setLocalDragState(Object obj) {
3305407b4e91fe7627545b8110e683953353236b4543Christopher Tate        mLocalDragState = obj;
3306407b4e91fe7627545b8110e683953353236b4543Christopher Tate    }
3307407b4e91fe7627545b8110e683953353236b4543Christopher Tate
3308a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    private void handleDragEvent(DragEvent event) {
3309a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // From the root, only drag start/end/location are dispatched.  entered/exited
3310a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // are determined and dispatched by the viewgroup hierarchy, who then report
3311a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // that back here for ultimate reporting back to the framework.
3312a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (mView != null && mAdded) {
3313a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            final int what = event.mAction;
3314a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3315a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            if (what == DragEvent.ACTION_DRAG_EXITED) {
3316a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // A direct EXITED event means that the window manager knows we've just crossed
3317a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // a window boundary, so the current drag target within this one must have
3318a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // just been exited.  Send it the usual notifications and then we're done
3319a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // for now.
33209d1ab883293b047b654935b84d0803c8c383be91Chris Tate                mView.dispatchDragEvent(event);
3321a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } else {
3322a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Cache the drag description when the operation starts, then fill it in
3323a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // on subsequent calls as a convenience
3324a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if (what == DragEvent.ACTION_DRAG_STARTED) {
33259d1ab883293b047b654935b84d0803c8c383be91Chris Tate                    mCurrentDragView = null;    // Start the current-recipient tracking
3326a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    mDragDescription = event.mClipDescription;
3327a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                } else {
3328a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mClipDescription = mDragDescription;
3329a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3330a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3331a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // For events with a [screen] location, translate into window coordinates
3332a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if ((what == DragEvent.ACTION_DRAG_LOCATION) || (what == DragEvent.ACTION_DROP)) {
3333a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    mDragPoint.set(event.mX, event.mY);
3334a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mTranslator != null) {
3335a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mTranslator.translatePointInScreenToAppWindow(mDragPoint);
3336a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3337a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3338a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mCurScrollY != 0) {
3339a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragPoint.offset(0, mCurScrollY);
3340a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3341a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3342a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mX = mDragPoint.x;
3343a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mY = mDragPoint.y;
3344a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3345a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3346a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Remember who the current drag target is pre-dispatch
3347a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                final View prevDragView = mCurrentDragView;
3348a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3349a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Now dispatch the drag/drop event
3350d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                boolean result = mView.dispatchDragEvent(event);
3351a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3352a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // If we changed apparent drag target, tell the OS about it
3353a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if (prevDragView != mCurrentDragView) {
3354a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    try {
3355a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (prevDragView != null) {
3356a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            sWindowSession.dragRecipientExited(mWindow);
3357a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
3358a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (mCurrentDragView != null) {
3359a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            sWindowSession.dragRecipientEntered(mWindow);
3360a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
3361a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } catch (RemoteException e) {
3362a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.e(TAG, "Unable to note drag target change");
3363a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3364a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3365d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate
3366407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // Report the drop result when we're done
3367d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                if (what == DragEvent.ACTION_DROP) {
33681fc014fd0051a48083c6d469c2a4f22da1aa15e4Christopher Tate                    mDragDescription = null;
3369d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    try {
3370d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Log.i(TAG, "Reporting drop result: " + result);
3371d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        sWindowSession.reportDropResult(mWindow, result);
3372d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    } catch (RemoteException e) {
3373d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Log.e(TAG, "Unable to report drop result");
3374d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
3375d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                }
3376407b4e91fe7627545b8110e683953353236b4543Christopher Tate
3377407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // When the drag operation ends, release any local state object
3378407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // that may have been in use
3379407b4e91fe7627545b8110e683953353236b4543Christopher Tate                if (what == DragEvent.ACTION_DRAG_ENDED) {
3380407b4e91fe7627545b8110e683953353236b4543Christopher Tate                    setLocalDragState(null);
3381407b4e91fe7627545b8110e683953353236b4543Christopher Tate                }
3382a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
3383a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
3384a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        event.recycle();
3385a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
3386a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3387664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    public void handleDispatchSystemUiVisibilityChanged(int visibility) {
3388664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        if (mView == null) return;
338914782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato        if (mAttachInfo != null) {
339014782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato            mAttachInfo.mSystemUiVisibility = visibility;
339114782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato        }
3392664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        mView.dispatchSystemUiVisibilityChanged(visibility);
3393664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
3394664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
33952c095f367779ef32130c72849936a2e3013c8492Christopher Tate    public void getLastTouchPoint(Point outLocation) {
33962c095f367779ef32130c72849936a2e3013c8492Christopher Tate        outLocation.x = (int) mLastTouchPoint.x;
33972c095f367779ef32130c72849936a2e3013c8492Christopher Tate        outLocation.y = (int) mLastTouchPoint.y;
33982c095f367779ef32130c72849936a2e3013c8492Christopher Tate    }
33992c095f367779ef32130c72849936a2e3013c8492Christopher Tate
34009d1ab883293b047b654935b84d0803c8c383be91Chris Tate    public void setDragFocus(View newDragTarget) {
3401a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (mCurrentDragView != newDragTarget) {
3402048691cfac42acce24d9462eca5e57ca5aa78e7dChris Tate            mCurrentDragView = newDragTarget;
3403a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
3404a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
3405a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AudioManager getAudioManager() {
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == null) {
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("getAudioManager called when there is no mView");
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAudioManager == null) {
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAudioManager = (AudioManager) mView.getContext().getSystemService(Context.AUDIO_SERVICE);
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAudioManager;
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    public AccessibilityInteractionController getAccessibilityInteractionController() {
34178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        if (mView == null) {
34188643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            throw new IllegalStateException("getAccessibilityInteractionController"
34198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    + " called when there is no mView");
34208643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
34218643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        if (mAccessibilityInteractionContrtoller == null) {
34228643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            mAccessibilityInteractionContrtoller = new AccessibilityInteractionController();
34238643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
34248643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        return mAccessibilityInteractionContrtoller;
34258643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
34268643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
34278169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
34288169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            boolean insetsPending) throws RemoteException {
342964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
343064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        float appScale = mAttachInfo.mApplicationScale;
34313d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        boolean restore = false;
343264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (params != null && mTranslator != null) {
3433e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            restore = true;
3434e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            params.backup();
343564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateWindowLayout(params);
34369189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        }
343764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (params != null) {
343864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            if (DBG) Log.d(TAG, "WindowLayout in layoutWindow:" + params);
34393d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        }
3440694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        mPendingConfiguration.seq = 0;
3441f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        //Log.d(TAG, ">>>>>> CALLING relayout");
34428169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima        int relayoutResult = sWindowSession.relayout(
34438169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                mWindow, params,
3444189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                (int) (mView.getMeasuredWidth() * appScale + 0.5f),
3445189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                (int) (mView.getMeasuredHeight() * appScale + 0.5f),
34468169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                viewVisibility, insetsPending, mWinFrame,
3447694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mPendingContentInsets, mPendingVisibleInsets,
3448694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mPendingConfiguration, mSurface);
3449f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        //Log.d(TAG, "<<<<<< BACK FROM relayout");
34503d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        if (restore) {
3451e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            params.restore();
34523d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        }
345364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
345464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mTranslator != null) {
345564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWinFrame(mWinFrame);
345664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(mPendingContentInsets);
345764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(mPendingVisibleInsets);
34589189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        }
34598169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima        return relayoutResult;
34608169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    }
34618506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
34629189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    /**
34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void playSoundEffect(int effectId) {
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
346813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi        try {
346913b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            final AudioManager audioManager = getAudioManager();
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
347113b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            switch (effectId) {
347213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.CLICK:
347313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
347413b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
347513b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_DOWN:
347613b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN);
347713b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
347813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_LEFT:
347913b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT);
348013b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
348113b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_RIGHT:
348213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT);
348313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
348413b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_UP:
348513b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP);
348613b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
348713b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                default:
348813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    throw new IllegalArgumentException("unknown effect id " + effectId +
348913b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                            " not defined in " + SoundEffectConstants.class.getCanonicalName());
349013b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            }
349113b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi        } catch (IllegalStateException e) {
349213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            // Exception thrown by getAudioManager() when mView is null
349313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            Log.e(TAG, "FATAL EXCEPTION when attempting to play sound effect: " + e);
349413b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            e.printStackTrace();
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean performHapticFeedback(int effectId, boolean always) {
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sWindowSession.performHapticFeedback(mWindow, effectId, always);
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View focusSearch(View focused, int direction) {
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(mView instanceof ViewGroup)) {
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return FocusFinder.getInstance().findNextFocus((ViewGroup) mView, focused, direction);
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void debug() {
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView.debug();
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
352365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
352465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    public void dumpGfxInfo(PrintWriter pw, int[] info) {
352565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mView != null) {
352665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            getGfxInfo(mView, info);
352765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        } else {
352865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            info[0] = info[1] = 0;
352965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
353065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
353165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
353265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    private void getGfxInfo(View view, int[] info) {
353365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        DisplayList displayList = view.mDisplayList;
353465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        info[0]++;
353565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (displayList != null) {
353665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            info[1] += displayList.getSize();
353765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
353865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
353965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (view instanceof ViewGroup) {
354065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            ViewGroup group = (ViewGroup) view;
354165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
354265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            int count = group.getChildCount();
354365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            for (int i = 0; i < count; i++) {
354465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                getGfxInfo(group.getChildAt(i), info);
354565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
354665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
354765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void die(boolean immediate) {
355094d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        if (immediate) {
355194d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn            doDie();
355294d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        } else {
355394d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn            sendEmptyMessage(DIE);
355494d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        }
355594d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn    }
355694d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn
355794d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn    void doDie() {
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
3559b75fa30aaf03d9e425d150b452501e5df0621351Jeff Brown        if (LOCAL_LOGV) Log.v(TAG, "DIE in " + this + " of " + mSurface);
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAdded && !mFirst) {
356229d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy                destroyHardwareRenderer();
356329d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int viewVisibility = mView.getVisibility();
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean viewVisibilityChanged = mViewVisibility != viewVisibility;
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWindowAttributesChanged || viewVisibilityChanged) {
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If layout params have been changed, first give them
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to the window manager to make sure it has the correct
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // animation info.
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
35718169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                        if ((relayoutWindow(mWindowAttributes, viewVisibility, false)
35728169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                                & WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0) {
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sWindowSession.finishDrawing(mWindow);
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException e) {
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35790586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mSurface.release();
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAdded) {
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAdded = false;
358394d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn                dispatchDetachedFromWindow();
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35885fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public void requestUpdateConfiguration(Configuration config) {
35895fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        Message msg = obtainMessage(UPDATE_CONFIGURATION, config);
35905fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        sendMessage(msg);
35915fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
35925fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
359329d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy    private void destroyHardwareRenderer() {
3594b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        if (mAttachInfo.mHardwareRenderer != null) {
3595b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            mAttachInfo.mHardwareRenderer.destroy(true);
3596b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            mAttachInfo.mHardwareRenderer = null;
359729d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy            mAttachInfo.mHardwareAccelerated = false;
359829d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy        }
359929d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy    }
360029d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchFinishedEvent(int seq, boolean handled) {
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(FINISHED_EVENT);
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = seq;
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg2 = handled ? 1 : 0;
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36073d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchResized(int w, int h, Rect coveredInsets,
3609e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            Rect visibleInsets, boolean reportDraw, Configuration newConfig) {
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_LAYOUT) Log.v(TAG, "Resizing " + this + ": w=" + w
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " h=" + h + " coveredInsets=" + coveredInsets.toShortString()
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " visibleInsets=" + visibleInsets.toShortString()
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " reportDraw=" + reportDraw);
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(reportDraw ? RESIZED_REPORT :RESIZED);
361564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mTranslator != null) {
361664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(coveredInsets);
361764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(visibleInsets);
361864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            w *= mTranslator.applicationInvertedScale;
361964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            h *= mTranslator.applicationInvertedScale;
362064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        }
362164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        msg.arg1 = w;
362264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        msg.arg2 = h;
3623e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ResizedInfo ri = new ResizedInfo();
3624e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ri.coveredInsets = new Rect(coveredInsets);
3625e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ri.visibleInsets = new Rect(visibleInsets);
3626e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ri.newConfig = newConfig;
3627e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        msg.obj = ri;
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
363046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
36314e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    private long mInputEventReceiveTimeNanos;
36324e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    private long mInputEventDeliverTimeNanos;
36334e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    private long mInputEventDeliverPostImeTimeNanos;
36343915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private InputQueue.FinishedCallback mFinishedCallback;
363546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
363646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    private final InputHandler mInputHandler = new InputHandler() {
36373915bb845b032dc184dba5e60970b803390ca3edJeff Brown        public void handleKey(KeyEvent event, InputQueue.FinishedCallback finishedCallback) {
36381c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            startInputEvent(finishedCallback);
363992ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown            dispatchKey(event, true);
364046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
364146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
36423915bb845b032dc184dba5e60970b803390ca3edJeff Brown        public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) {
36431c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            startInputEvent(finishedCallback);
364493ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown            dispatchMotion(event, true);
364546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
364646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    };
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchKey(KeyEvent event) {
364992ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown        dispatchKey(event, false);
365092ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown    }
365192ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown
365292ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown    private void dispatchKey(KeyEvent event, boolean sendDone) {
365392ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown        //noinspection ConstantConditions
365492ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown        if (false && event.getAction() == KeyEvent.ACTION_DOWN) {
365592ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown            if (event.getKeyCode() == KeyEvent.KEYCODE_CAMERA) {
3656812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                if (DBG) Log.d("keydisp", "===================================================");
3657812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                if (DBG) Log.d("keydisp", "Focused view Hierarchy is:");
3658812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debug();
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3661812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                if (DBG) Log.d("keydisp", "===================================================");
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(DISPATCH_KEY);
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.obj = event;
366792ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown        msg.arg1 = sendDone ? 1 : 0;
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_LOGV) Log.v(
3670c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            TAG, "sending key " + event + " to " + mView);
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessageAtTime(msg, event.getEventTime());
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3674c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
367593ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown    private void dispatchMotion(MotionEvent event, boolean sendDone) {
3676c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        int source = event.getSource();
3677c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) {
367893ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown            dispatchPointer(event, sendDone);
3679c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        } else if ((source & InputDevice.SOURCE_CLASS_TRACKBALL) != 0) {
368093ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown            dispatchTrackball(event, sendDone);
3681c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        } else {
3682cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            dispatchGenericMotion(event, sendDone);
3683c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
3684c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
368693ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown    private void dispatchPointer(MotionEvent event, boolean sendDone) {
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(DISPATCH_POINTER);
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.obj = event;
368993ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        msg.arg1 = sendDone ? 1 : 0;
369000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        sendMessageAtTime(msg, event.getEventTime());
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369393ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown    private void dispatchTrackball(MotionEvent event, boolean sendDone) {
36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(DISPATCH_TRACKBALL);
36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.obj = event;
369693ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        msg.arg1 = sendDone ? 1 : 0;
369700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        sendMessageAtTime(msg, event.getEventTime());
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3699cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3700cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private void dispatchGenericMotion(MotionEvent event, boolean sendDone) {
3701cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        Message msg = obtainMessage(DISPATCH_GENERIC_MOTION);
3702cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        msg.obj = event;
3703cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        msg.arg1 = sendDone ? 1 : 0;
3704cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        sendMessageAtTime(msg, event.getEventTime());
3705cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3706cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchAppVisibility(boolean visible) {
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(DISPATCH_APP_VISIBILITY);
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = visible ? 1 : 0;
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchGetNewSurface() {
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(DISPATCH_GET_NEW_SURFACE);
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) {
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = Message.obtain();
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.what = WINDOW_FOCUS_CHANGED;
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = hasFocus ? 1 : 0;
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg2 = inTouchMode ? 1 : 0;
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3726ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    public void dispatchCloseSystemDialogs(String reason) {
3727ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        Message msg = Message.obtain();
3728ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        msg.what = CLOSE_SYSTEM_DIALOGS;
3729ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        msg.obj = reason;
3730ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        sendMessage(msg);
3731ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    }
3732a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3733a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    public void dispatchDragEvent(DragEvent event) {
373491e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        final int what;
373591e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        if (event.getAction() == DragEvent.ACTION_DRAG_LOCATION) {
373691e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate            what = DISPATCH_DRAG_LOCATION_EVENT;
373791e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate            removeMessages(what);
373891e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        } else {
373991e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate            what = DISPATCH_DRAG_EVENT;
374091e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        }
374191e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        Message msg = obtainMessage(what, event);
3742a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        sendMessage(msg);
3743a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
3744a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3745664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    public void dispatchSystemUiVisibilityChanged(int visibility) {
3746664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        sendMessage(obtainMessage(DISPATCH_SYSTEM_UI_VISIBILITY, visibility, 0));
3747664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
3748664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
374975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
375075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * The window is getting focus so if there is anything focused/selected
375175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * send an {@link AccessibilityEvent} to announce that.
375275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
375375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private void sendAccessibilityEvents() {
37548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        if (!mAccessibilityManager.isEnabled()) {
375575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return;
375675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
375775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
375875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        View focusedView = mView.findFocus();
375975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (focusedView != null && focusedView != mView) {
376075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            focusedView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
376175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
376275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
376375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
3764eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    /**
3765eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * Post a callback to send a
3766eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * {@link AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED} event.
3767a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov     * This event is send at most once every
3768a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov     * {@link ViewConfiguration#getSendRecurringAccessibilityEventsInterval()}.
3769eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     */
3770eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    private void postSendWindowContentChangedCallback() {
3771a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        if (mSendWindowContentChangedAccessibilityEvent == null) {
3772a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov            mSendWindowContentChangedAccessibilityEvent =
3773a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov                new SendWindowContentChangedAccessibilityEvent();
3774a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        }
3775a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        if (!mSendWindowContentChangedAccessibilityEvent.mIsPending) {
3776a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov            mSendWindowContentChangedAccessibilityEvent.mIsPending = true;
3777a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov            postDelayed(mSendWindowContentChangedAccessibilityEvent,
3778a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov                    ViewConfiguration.getSendRecurringAccessibilityEventsInterval());
3779eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
3780eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
3781eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
3782eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    /**
3783eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * Remove a posted callback to send a
3784eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * {@link AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED} event.
3785eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     */
3786eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    private void removeSendWindowContentChangedCallback() {
3787a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        if (mSendWindowContentChangedAccessibilityEvent != null) {
3788a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov            removeCallbacks(mSendWindowContentChangedAccessibilityEvent);
3789eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
3790eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
3791eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean showContextMenuForChild(View originalView) {
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37966e34636749217654f43221885afb7a29bb5ca96aAdam Powell    public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) {
37976e34636749217654f43221885afb7a29bb5ca96aAdam Powell        return null;
37986e34636749217654f43221885afb7a29bb5ca96aAdam Powell    }
37996e34636749217654f43221885afb7a29bb5ca96aAdam Powell
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void createContextMenu(ContextMenu menu) {
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void childDrawableStateChanged(View child) {
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3806736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public boolean requestSendAccessibilityEvent(View child, AccessibilityEvent event) {
3807736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        if (mView == null) {
3808736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            return false;
3809736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        }
38108643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager.sendAccessibilityEvent(event);
3811736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        return true;
3812736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    }
3813736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void checkThread() {
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mThread != Thread.currentThread()) {
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new CalledFromWrongThreadException(
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Only the original thread that created a view hierarchy can touch its views.");
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
3822c6cc0f8c19d9eccf408a443fa2bf668af261dcd0Joe Onorato        // ViewAncestor never intercepts touch event, so this can be a no-op
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean requestChildRectangleOnScreen(View child, Rect rectangle,
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean immediate) {
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return scrollToRectOrFocus(rectangle, immediate);
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38298506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
3830dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    class TakenSurfaceHolder extends BaseSurfaceHolder {
3831dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
3832dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public boolean onAllowLockCanvas() {
3833dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return mDrawingAllowed;
3834dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
3835dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
3836dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
3837dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void onRelayoutContainer() {
3838dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // Not currently interesting -- from changing between fixed and layout size.
3839dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
3840dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
3841dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setFormat(int format) {
3842dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceFormat(format);
3843dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
3844dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
3845dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setType(int type) {
3846dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceType(type);
3847dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
3848dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
3849dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
3850dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void onUpdateSurface() {
3851dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // We take care of format and type changes on our own.
3852dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            throw new IllegalStateException("Shouldn't be here");
3853dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
3854dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
3855dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public boolean isCreating() {
3856dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return mIsCreating;
3857dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
3858dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
3859dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
3860dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setFixedSize(int width, int height) {
3861dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            throw new UnsupportedOperationException(
3862dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    "Currently only support sizing from layout");
3863dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
3864dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
3865dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setKeepScreenOn(boolean screenOn) {
3866dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceKeepScreenOn(screenOn);
3867dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
3868dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    }
3869dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class InputMethodCallback extends IInputMethodCallback.Stub {
38716dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        private WeakReference<ViewRootImpl> mViewAncestor;
38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38736dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        public InputMethodCallback(ViewRootImpl viewAncestor) {
38746dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor);
38759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38768506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void finishedEvent(int seq, boolean handled) {
38786dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
38798643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
38808643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchFinishedEvent(seq, handled);
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void sessionCreated(IInputMethodSession session) {
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Stub -- not for use in the client.
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38888506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class W extends IWindow.Stub {
38906dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        private final WeakReference<ViewRootImpl> mViewAncestor;
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38926dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        W(ViewRootImpl viewAncestor) {
38936dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor);
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3896fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy        public void resized(int w, int h, Rect coveredInsets, Rect visibleInsets,
3897fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy                boolean reportDraw, Configuration newConfig) {
38986dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
38998643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
39008643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchResized(w, h, coveredInsets, visibleInsets, reportDraw,
39018643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        newConfig);
39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void dispatchAppVisibility(boolean visible) {
39066dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
39078643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
39088643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchAppVisibility(visible);
39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void dispatchGetNewSurface() {
39136dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
39148643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
39158643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchGetNewSurface();
39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) {
39206dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
39218643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
39228643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.windowFocusChanged(hasFocus, inTouchMode);
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static int checkCallingPermission(String permission) {
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault().checkPermission(
39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        permission, Binder.getCallingPid(), Binder.getCallingUid());
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_DENIED;
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void executeCommand(String command, String parameters, ParcelFileDescriptor out) {
39366dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
39378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
39388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                final View view = viewAncestor.mView;
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (view != null) {
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (checkCallingPermission(Manifest.permission.DUMP) !=
39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            PackageManager.PERMISSION_GRANTED) {
39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw new SecurityException("Insufficient permissions to invoke"
39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " executeCommand() from pid=" + Binder.getCallingPid()
39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ", uid=" + Binder.getCallingUid());
39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    OutputStream clientStream = null;
39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        clientStream = new ParcelFileDescriptor.AutoCloseOutputStream(out);
39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ViewDebug.dispatchCommand(view, command, parameters, clientStream);
39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException e) {
39529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        e.printStackTrace();
39539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } finally {
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (clientStream != null) {
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                clientStream.close();
39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (IOException e) {
39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                e.printStackTrace();
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
396572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn
3966ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        public void closeSystemDialogs(String reason) {
39676dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
39688643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
39698643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchCloseSystemDialogs(reason);
3970ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            }
3971ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
3972ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn
3973bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
3974bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                boolean sync) {
397519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            if (sync) {
397619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                try {
397719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    sWindowSession.wallpaperOffsetsComplete(asBinder());
397819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                } catch (RemoteException e) {
39797580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                }
39807580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
39817580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
39828643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
39837580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        public void dispatchWallpaperCommand(String action, int x, int y,
39847580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                int z, Bundle extras, boolean sync) {
39857580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (sync) {
39867580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                try {
39877580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    sWindowSession.wallpaperCommandComplete(asBinder(), null);
39887580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                } catch (RemoteException e) {
398919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
399019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            }
399172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        }
3992a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3993a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        /* Drag/drop */
3994a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        public void dispatchDragEvent(DragEvent event) {
39956dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
39968643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
39978643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchDragEvent(event);
3998a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
3999a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
4000664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
4001664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        public void dispatchSystemUiVisibilityChanged(int visibility) {
40026dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
40038643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
40048643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchSystemUiVisibilityChanged(visibility);
4005664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            }
4006664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        }
40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Maintains state information for a single trackball axis, generating
40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * discrete (DPAD) movements based on raw trackball motion.
40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final class TrackballAxis {
40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
40159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum amount of acceleration we will apply.
40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final float MAX_ACCELERATION = 20;
40188506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum amount of time (in milliseconds) between events in order
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for us to consider the user to be doing fast trackball movements,
40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * and thus apply an acceleration.
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final long FAST_MOVE_TIME = 150;
40258506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Scaling factor to the time (in milliseconds) between events to how
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * much to multiple/divide the current acceleration.  When movement
40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * is < FAST_MOVE_TIME this multiplies the acceleration; when >
40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * FAST_MOVE_TIME it divides it.
40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final float ACCEL_MOVE_SCALING_FACTOR = (1.0f/40);
40338506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
40349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float position;
40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float absPosition;
40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float acceleration = 1;
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long lastMoveTime = 0;
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int step;
40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int dir;
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nonAccelMovement;
40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void reset(int _step) {
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            position = 0;
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            acceleration = 1;
40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lastMoveTime = 0;
40469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            step = _step;
40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dir = 0;
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Add trackball movement into the state.  If the direction of movement
40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * has been reversed, the state is reset before adding the
40539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * movement (so that you don't have to compensate for any previously
40549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * collected movement before see the result of the movement in the
40559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * new direction).
40569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Returns the absolute value of the amount of movement
40589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * collected so far.
40599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
40609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float collect(float off, long time, String axis) {
40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long normTime;
40629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (off > 0) {
40639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = (long)(off * FAST_MOVE_TIME);
40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (dir < 0) {
40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " reversed to positive!");
40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    position = 0;
40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    step = 0;
40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = 1;
40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastMoveTime = 0;
40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = 1;
40729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (off < 0) {
40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = (long)((-off) * FAST_MOVE_TIME);
40749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (dir > 0) {
40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " reversed to negative!");
40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    position = 0;
40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    step = 0;
40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = 1;
40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastMoveTime = 0;
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = -1;
40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = 0;
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40858506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The number of milliseconds between each movement that is
40879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // considered "normal" and will not result in any acceleration
40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // or deceleration, scaled by the offset we have here.
40899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (normTime > 0) {
40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long delta = time - lastMoveTime;
40919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lastMoveTime = time;
40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float acc = acceleration;
40939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (delta < normTime) {
40949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // The user is scrolling rapidly, so increase acceleration.
40959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float scale = (normTime-delta) * ACCEL_MOVE_SCALING_FACTOR;
40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (scale > 1) acc *= scale;
40979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " accelerate: off="
40989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + off + " normTime=" + normTime + " delta=" + delta
40999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " scale=" + scale + " acc=" + acc);
41009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = acc < MAX_ACCELERATION ? acc : MAX_ACCELERATION;
41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // The user is scrolling slowly, so decrease acceleration.
41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float scale = (delta-normTime) * ACCEL_MOVE_SCALING_FACTOR;
41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (scale > 1) acc /= scale;
41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " deccelerate: off="
41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + off + " normTime=" + normTime + " delta=" + delta
41079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " scale=" + scale + " acc=" + acc);
41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = acc > 1 ? acc : 1;
41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            position += off;
41129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (absPosition = Math.abs(position));
41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
41169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Generate the number of discrete movement events appropriate for
41179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the currently collected trackball movement.
41189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
41199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param precision The minimum movement required to generate the
41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * first discrete movement.
41219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Returns the number of discrete movements, either positive
41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * or negative, or 0 if there is not enough trackball movement yet
41249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for a discrete movement.
41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int generate(float precision) {
41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int movement = 0;
41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            nonAccelMovement = 0;
41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int dir = position >= 0 ? 1 : -1;
41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (step) {
41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we are going to execute the first step, then we want
41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to do this as soon as possible instead of waiting for
41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // a full movement, in order to make things look responsive.
41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case 0:
41369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < precision) {
41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        nonAccelMovement += dir;
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        step = 1;
41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
41439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we have generated the first movement, then we need
41449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to wait for the second complete trackball motion before
41459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // generating the second discrete movement.
41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case 1:
41479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < 2) {
41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        nonAccelMovement += dir;
41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        position += dir > 0 ? -2 : 2;
41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        absPosition = Math.abs(position);
41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        step = 2;
41559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // After the first two, we generate discrete movements
41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // consistently with the trackball, applying an acceleration
41589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // if the trackball is moving quickly.  This is a simple
41599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // acceleration on top of what we already compute based
41609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // on how quickly the wheel is being turned, to apply
41619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // a longer increasing acceleration to continuous movement
41629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in one direction.
41639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    default:
41649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < 1) {
41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
41669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
41689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        position += dir >= 0 ? -1 : 1;
41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        absPosition = Math.abs(position);
41709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        float acc = acceleration;
41719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        acc *= 1.1f;
41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        acceleration = acc < MAX_ACCELERATION ? acc : acceleration;
41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (true);
41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class CalledFromWrongThreadException extends AndroidRuntimeException {
41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CalledFromWrongThreadException(String msg) {
41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(msg);
41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SurfaceHolder mHolder = new SurfaceHolder() {
41869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // we only need a SurfaceHolder for opengl. it would be nice
41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to implement everything else though, especially the callback
41889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // support (opengl doesn't make use of it right now, but eventually
41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // will).
41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface getSurface() {
41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSurface;
41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isCreating() {
41959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
41969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void addCallback(Callback callback) {
41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void removeCallback(Callback callback) {
42029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setFixedSize(int width, int height) {
42059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setSizeFromLayout() {
42089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setFormat(int format) {
42119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setType(int type) {
42149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setKeepScreenOn(boolean screenOn) {
42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Canvas lockCanvas() {
42209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Canvas lockCanvas(Rect dirty) {
42249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unlockCanvasAndPost(Canvas canvas) {
42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Rect getSurfaceFrame() {
42309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
42339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static RunQueue getRunQueue() {
42359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RunQueue rq = sRunQueues.get();
42369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rq != null) {
42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return rq;
42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        rq = new RunQueue();
42409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sRunQueues.set(rq);
42419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return rq;
42429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42438506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
42449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
42469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
42479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final class RunQueue {
42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ArrayList<HandlerAction> mActions = new ArrayList<HandlerAction>();
42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void post(Runnable action) {
42519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            postDelayed(action, 0);
42529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void postDelayed(Runnable action, long delayMillis) {
42559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            HandlerAction handlerAction = new HandlerAction();
42569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.action = action;
42579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.delay = delayMillis;
42589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
42609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mActions.add(handlerAction);
42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void removeCallbacks(Runnable action) {
42659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HandlerAction handlerAction = new HandlerAction();
42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.action = action;
42679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
42699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ArrayList<HandlerAction> actions = mActions;
42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (actions.remove(handlerAction)) {
42729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Keep going
42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
42749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void executeActions(Handler handler) {
42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
42799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ArrayList<HandlerAction> actions = mActions;
42809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int count = actions.size();
42819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < count; i++) {
42839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final HandlerAction handlerAction = actions.get(i);
42849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    handler.postDelayed(handlerAction.action, handlerAction.delay);
42859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
42869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
428715df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy                actions.clear();
42889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static class HandlerAction {
42929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Runnable action;
42939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long delay;
42949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
42969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public boolean equals(Object o) {
42979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (this == o) return true;
42989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (o == null || getClass() != o.getClass()) return false;
42999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                HandlerAction that = (HandlerAction) o;
43019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return !(action != null ? !action.equals(that.action) : that.action != null);
43029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int hashCode() {
43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int result = action != null ? action.hashCode() : 0;
43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = 31 * result + (int) (delay ^ (delay >>> 32));
43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return result;
43109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43148643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
43158643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * Class for managing the accessibility interaction connection
43168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * based on the global accessibility state.
43178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
43188643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final class AccessibilityInteractionConnectionManager
43198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            implements AccessibilityStateChangeListener {
43208643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void onAccessibilityStateChanged(boolean enabled) {
43218643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (enabled) {
43228643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                ensureConnection();
43238643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            } else {
43248643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                ensureNoConnection();
43258643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
43268643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
43278643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
43288643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void ensureConnection() {
43298643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final boolean registered = mAttachInfo.mAccessibilityWindowId != View.NO_ID;
43308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (!registered) {
43318643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAttachInfo.mAccessibilityWindowId =
43328643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    mAccessibilityManager.addAccessibilityInteractionConnection(mWindow,
43336dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                            new AccessibilityInteractionConnection(ViewRootImpl.this));
43348643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
43358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
43368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
43378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void ensureNoConnection() {
43388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final boolean registered = mAttachInfo.mAccessibilityWindowId != View.NO_ID;
43398643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (registered) {
43408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAttachInfo.mAccessibilityWindowId = View.NO_ID;
43418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAccessibilityManager.removeAccessibilityInteractionConnection(mWindow);
43428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
43438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
43448643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
43458643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
43468643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
43478643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * This class is an interface this ViewAncestor provides to the
43488643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * AccessibilityManagerService to the latter can interact with
43498643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * the view hierarchy in this ViewAncestor.
43508643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
43518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final class AccessibilityInteractionConnection
43528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            extends IAccessibilityInteractionConnection.Stub {
43536dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        private final WeakReference<ViewRootImpl> mViewAncestor;
43548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
43556dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        AccessibilityInteractionConnection(ViewRootImpl viewAncestor) {
43566dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor);
43578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
43588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
43598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByAccessibilityId(int accessibilityId,
43608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback) {
4361601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mViewAncestor.get() != null) {
4362601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
4363601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .findAccessibilityNodeInfoByAccessibilityIdClientThread(accessibilityId,
43648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        interactionId, callback);
4365601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
43668643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
43678643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
43688643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void performAccessibilityAction(int accessibilityId, int action,
43698643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback) {
4370601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mViewAncestor.get() != null) {
4371601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
4372601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .performAccessibilityActionClientThread(accessibilityId, action, interactionId,
4373601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                            callback);
43748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
43758643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
43768643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
43778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByViewId(int viewId,
43788643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback) {
4379601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mViewAncestor.get() != null) {
4380601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
4381601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .findAccessibilityNodeInfoByViewIdClientThread(viewId, interactionId, callback);
43828643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
43838643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
43848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
4385eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        public void findAccessibilityNodeInfosByViewText(String text, int accessibilityId,
4386eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback) {
4387601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mViewAncestor.get() != null) {
4388601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
4389eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                    .findAccessibilityNodeInfosByViewTextClientThread(text, accessibilityId,
4390eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                            interactionId, callback);
43918643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
43928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
43938643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
43948643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
43958643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
43968643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * Class for managing accessibility interactions initiated from the system
43978643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * and targeting the view hierarchy. A *ClientThread method is to be
43988643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * called from the interaction connection this ViewAncestor gives the
43998643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * system to talk to it and a corresponding *UiThread method that is executed
44008643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * on the UI thread.
44018643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
44028643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final class AccessibilityInteractionController {
44038643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private static final int POOL_SIZE = 5;
44048643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44058643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private FindByAccessibilitytIdPredicate mFindByAccessibilityIdPredicate =
44068643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            new FindByAccessibilitytIdPredicate();
44078643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44088643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private ArrayList<AccessibilityNodeInfo> mTempAccessibilityNodeInfoList =
44098643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            new ArrayList<AccessibilityNodeInfo>();
44108643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44118643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        // Reusable poolable arguments for interacting with the view hierarchy
44128643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        // to fit more arguments than Message and to avoid sharing objects between
44138643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        // two messages since several threads can send messages concurrently.
44148643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private final Pool<SomeArgs> mPool = Pools.synchronizedPool(Pools.finitePool(
44158643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                new PoolableManager<SomeArgs>() {
44168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    public SomeArgs newInstance() {
44178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        return new SomeArgs();
44188643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    }
44198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44208643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    public void onAcquired(SomeArgs info) {
44218643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        /* do nothing */
44228643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    }
44238643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44248643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    public void onReleased(SomeArgs info) {
44258643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        info.clear();
44268643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    }
44278643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }, POOL_SIZE)
44288643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        );
44298643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public class SomeArgs implements Poolable<SomeArgs> {
44318643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            private SomeArgs mNext;
44328643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            private boolean mIsPooled;
44338643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44348643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public Object arg1;
44358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public Object arg2;
44368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public int argi1;
44378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public int argi2;
44388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public int argi3;
44398643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public SomeArgs getNextPoolable() {
44418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return mNext;
44428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
44438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44448643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public boolean isPooled() {
44458643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return mIsPooled;
44468643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
44478643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44488643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public void setNextPoolable(SomeArgs args) {
44498643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mNext = args;
44508643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
44518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public void setPooled(boolean isPooled) {
44538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mIsPooled = isPooled;
44548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
44558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            private void clear() {
44578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                arg1 = null;
44588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                arg2 = null;
44598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                argi1 = 0;
44608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                argi2 = 0;
44618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                argi3 = 0;
44628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
44638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
44648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44658643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByAccessibilityIdClientThread(int accessibilityId,
44668643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback) {
44678643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            Message message = Message.obtain();
44688643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID;
44698643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.arg1 = accessibilityId;
44708643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.arg2 = interactionId;
44718643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.obj = callback;
44728643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            sendMessage(message);
44738643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
44748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44758643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByAccessibilityIdUiThread(Message message) {
44768643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int accessibilityId = message.arg1;
44778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int interactionId = message.arg2;
44788643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
44798643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) message.obj;
44808643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44818dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            AccessibilityNodeInfo info = null;
44828dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            try {
44838dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                FindByAccessibilitytIdPredicate predicate = mFindByAccessibilityIdPredicate;
44848dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                predicate.init(accessibilityId);
44856dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                View root = ViewRootImpl.this.mView;
44868dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                View target = root.findViewByPredicate(predicate);
4487ea1da3d2e61625afcc7753ba2e03c5d2fb565daeSvetoslav Ganov                if (target != null && target.isShown()) {
44888dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    info = target.createAccessibilityNodeInfo();
44898dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
44908dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
44918643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                try {
44928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    callback.setFindAccessibilityNodeInfoResult(info, interactionId);
44938643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                } catch (RemoteException re) {
44948643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    /* ignore - the other side will time out */
44958643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }
44968643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
44978643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
44988643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44998643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByViewIdClientThread(int viewId, int interactionId,
45008643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                IAccessibilityInteractionConnectionCallback callback) {
45018643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            Message message = Message.obtain();
45028643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID;
45038643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.arg1 = viewId;
45048643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.arg2 = interactionId;
45058643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.obj = callback;
45068643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            sendMessage(message);
45078643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
45088643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45098643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByViewIdUiThread(Message message) {
45108643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int viewId = message.arg1;
45118643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int interactionId = message.arg2;
45128643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
45138643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) message.obj;
45148643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45158dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            AccessibilityNodeInfo info = null;
45168dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            try {
45176dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                View root = ViewRootImpl.this.mView;
45188dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                View target = root.findViewById(viewId);
4519ea1da3d2e61625afcc7753ba2e03c5d2fb565daeSvetoslav Ganov                if (target != null && target.isShown()) {
45208dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    info = target.createAccessibilityNodeInfo();
45218dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
45228dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
45238643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                try {
45248643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    callback.setFindAccessibilityNodeInfoResult(info, interactionId);
45258643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                } catch (RemoteException re) {
45268643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    /* ignore - the other side will time out */
45278643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }
45288643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
45298643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
45308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
4531eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        public void findAccessibilityNodeInfosByViewTextClientThread(String text,
4532eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                int accessibilityViewId, int interactionId,
45338643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                IAccessibilityInteractionConnectionCallback callback) {
45348643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            Message message = Message.obtain();
45358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT;
45368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = mPool.acquire();
45378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.arg1 = text;
4538eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            args.argi1 = accessibilityViewId;
4539eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            args.argi2 = interactionId;
45408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.arg2 = callback;
45418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.obj = args;
45428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            sendMessage(message);
45438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
45448643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45458643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfosByViewTextUiThread(Message message) {
45468643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = (SomeArgs) message.obj;
45478643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final String text = (String) args.arg1;
4548eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            final int accessibilityViewId = args.argi1;
4549eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            final int interactionId = args.argi2;
45508643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
45518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) args.arg2;
45528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            mPool.release(args);
45538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45548dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            List<AccessibilityNodeInfo> infos = null;
45558dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            try {
45568dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                ArrayList<View> foundViews = mAttachInfo.mFocusablesTempList;
45578dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                foundViews.clear();
45588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
4559d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy                View root;
4560eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                if (accessibilityViewId != View.NO_ID) {
4561eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                    root = findViewByAccessibilityId(accessibilityViewId);
4562eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                } else {
45636dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                    root = ViewRootImpl.this.mView;
4564eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                }
4565eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
4566ea1da3d2e61625afcc7753ba2e03c5d2fb565daeSvetoslav Ganov                if (root == null || !root.isShown()) {
4567eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                    return;
4568eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                }
4569eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
45708dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                root.findViewsWithText(foundViews, text);
45718dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                if (foundViews.isEmpty()) {
45728dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    return;
45738dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
45748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45758dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                infos = mTempAccessibilityNodeInfoList;
45768dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                infos.clear();
45778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45788dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                final int viewCount = foundViews.size();
45798dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                for (int i = 0; i < viewCount; i++) {
45808dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    View foundView = foundViews.get(i);
4581ea1da3d2e61625afcc7753ba2e03c5d2fb565daeSvetoslav Ganov                    if (foundView.isShown()) {
4582ea1da3d2e61625afcc7753ba2e03c5d2fb565daeSvetoslav Ganov                        infos.add(foundView.createAccessibilityNodeInfo());
4583ea1da3d2e61625afcc7753ba2e03c5d2fb565daeSvetoslav Ganov                    }
45848dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                 }
45858dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
45868dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                try {
45878dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    callback.setFindAccessibilityNodeInfosResult(infos, interactionId);
45888dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                } catch (RemoteException re) {
45898dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    /* ignore - the other side will time out */
45908dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
45918643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
45928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
45938643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45948643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void performAccessibilityActionClientThread(int accessibilityId, int action,
45958643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback) {
45968643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            Message message = Message.obtain();
45978643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.what = DO_PERFORM_ACCESSIBILITY_ACTION;
45988643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = mPool.acquire();
45998643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.argi1 = accessibilityId;
46008643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.argi2 = action;
46018643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.argi3 = interactionId;
46028643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.arg1 = callback;
46038643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.obj = args;
46048643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            sendMessage(message);
46058643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
46068643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46078643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void perfromAccessibilityActionUiThread(Message message) {
46088643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = (SomeArgs) message.obj;
46098643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int accessibilityId = args.argi1;
46108643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int action = args.argi2;
46118643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int interactionId = args.argi3;
46128643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
46138643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) args.arg1;
46148643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            mPool.release(args);
46158643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            boolean succeeded = false;
46178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            try {
46188dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                switch (action) {
46198dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    case AccessibilityNodeInfo.ACTION_FOCUS: {
46208dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                        succeeded = performActionFocus(accessibilityId);
46218dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    } break;
46228dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    case AccessibilityNodeInfo.ACTION_CLEAR_FOCUS: {
46238dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                        succeeded = performActionClearFocus(accessibilityId);
46248dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    } break;
46258dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    case AccessibilityNodeInfo.ACTION_SELECT: {
46268dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                        succeeded = performActionSelect(accessibilityId);
46278dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    } break;
46288dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    case AccessibilityNodeInfo.ACTION_CLEAR_SELECTION: {
46298dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                        succeeded = performActionClearSelection(accessibilityId);
46308dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    } break;
46318dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
46328dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
46338dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                try {
46348dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    callback.setPerformAccessibilityActionResult(succeeded, interactionId);
46358dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                } catch (RemoteException re) {
46368dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    /* ignore - the other side will time out */
46378dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
46388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46398643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
46408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private boolean performActionFocus(int accessibilityId) {
46428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            View target = findViewByAccessibilityId(accessibilityId);
46438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (target == null) {
46448643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
46458643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46468643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            // Get out of touch mode since accessibility wants to move focus around.
46478643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            ensureTouchMode(false);
46488643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            return target.requestFocus();
46498643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
46508643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private boolean performActionClearFocus(int accessibilityId) {
46528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            View target = findViewByAccessibilityId(accessibilityId);
46538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (target == null) {
46548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
46558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (!target.isFocused()) {
46578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
46588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            target.clearFocus();
46608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            return !target.isFocused();
46618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
46628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private boolean performActionSelect(int accessibilityId) {
46648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            View target = findViewByAccessibilityId(accessibilityId);
46658643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (target == null) {
46668643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
46678643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46688643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (target.isSelected()) {
46698643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
46708643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46718643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            target.setSelected(true);
46728643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            return target.isSelected();
46738643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
46748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46758643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private boolean performActionClearSelection(int accessibilityId) {
46768643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            View target = findViewByAccessibilityId(accessibilityId);
46778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (target == null) {
46788643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
46798643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46808643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (!target.isSelected()) {
46818643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
46828643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46838643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            target.setSelected(false);
46848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            return !target.isSelected();
46858643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
46868643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46878643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private View findViewByAccessibilityId(int accessibilityId) {
46886dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            View root = ViewRootImpl.this.mView;
46898643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (root == null) {
46908643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return null;
46918643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            mFindByAccessibilityIdPredicate.init(accessibilityId);
4693ea1da3d2e61625afcc7753ba2e03c5d2fb565daeSvetoslav Ganov            View foundView = root.findViewByPredicate(mFindByAccessibilityIdPredicate);
4694ea1da3d2e61625afcc7753ba2e03c5d2fb565daeSvetoslav Ganov            return (foundView != null && foundView.isShown()) ? foundView : null;
46958643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
46968643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46978643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private final class FindByAccessibilitytIdPredicate implements Predicate<View> {
46988643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public int mSerchedId;
46998643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
47008643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public void init(int searchedId) {
47018643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mSerchedId = searchedId;
47028643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
47038643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
47048643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public boolean apply(View view) {
47058643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return (view.getAccessibilityViewId() == mSerchedId);
47068643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
47078643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
47088643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
4709eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
4710a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov    private class SendWindowContentChangedAccessibilityEvent implements Runnable {
4711a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        public volatile boolean mIsPending;
4712a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov
4713eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        public void run() {
4714eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            if (mView != null) {
4715ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                // Check again for accessibility state since this is executed delayed.
4716ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                AccessibilityManager accessibilityManager =
4717ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                    AccessibilityManager.getInstance(mView.mContext);
4718ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                if (accessibilityManager.isEnabled()) {
4719ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                    // Send the event directly since we do not want to append the
4720ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                    // source text because this is the text for the entire window
4721ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                    // and we just want to notify that the content has changed.
4722ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                    AccessibilityEvent event = AccessibilityEvent.obtain(
4723ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                            AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
4724ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                    mView.onInitializeAccessibilityEvent(event);
4725ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                    accessibilityManager.sendAccessibilityEvent(event);
4726ce5ee2dc8dec2a1369ceaad15a39d29909ed0172Svetoslav Ganov                }
4727a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov                mIsPending = false;
4728eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            }
4729eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
4730eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
47319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4732