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;
648bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganovimport android.view.accessibility.AccessibilityInteractionClient;
6575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
668643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
678643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo;
688643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.IAccessibilityInteractionConnection;
698643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.IAccessibilityInteractionConnectionCallback;
700f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackbornimport android.view.animation.AccelerateDecelerateInterpolator;
710f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackbornimport android.view.animation.Interpolator;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputConnection;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.Scroller;
758643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
7686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport com.android.internal.policy.PolicyManager;
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;
1112f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private static final boolean DEBUG_FPS = false;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean WATCH_POINTER = false;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11459a12cae208790dd202656f50a40a53ef49baeebRomain Guy    /**
11559a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * Set this system property to true to force the view hierarchy to render
11659a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * at 60 Hz. This can be used to measure the potential framerate.
11759a12cae208790dd202656f50a40a53ef49baeebRomain Guy     */
11859a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private static final String PROPERTY_PROFILE_RENDERING = "viewancestor.profile_rendering";
11959a12cae208790dd202656f50a40a53ef49baeebRomain Guy
12053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    private static final boolean MEASURE_LATENCY = false;
12153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    private static LatencyTimer lt;
12253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Maximum time we allow the user to roll the trackball enough to generate
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a key event, before resetting the counters.
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int MAX_TRACKBALL_DELAY = 250;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static IWindowSession sWindowSession;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final Object mStaticInit = new Object();
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean mInitialized = false;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final ThreadLocal<RunQueue> sRunQueues = new ThreadLocal<RunQueue>();
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1362a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    static final ArrayList<Runnable> sFirstDrawHandlers = new ArrayList<Runnable>();
1372a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    static boolean sFirstDrawComplete = false;
1382a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn
139e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    static final ArrayList<ComponentCallbacks> sConfigCallbacks
140e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            = new ArrayList<ComponentCallbacks>();
14159a12cae208790dd202656f50a40a53ef49baeebRomain Guy
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastTrackballTime = 0;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final TrackballAxis mTrackballAxisX = new TrackballAxis();
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final TrackballAxis mTrackballAxisY = new TrackballAxis();
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
146cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickXDirection;
147cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickYDirection;
148cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickXKeyCode;
149cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickYKeyCode;
150cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final int[] mTmpLocation = new int[2];
1528506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
153711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn    final TypedValue mTmpValue = new TypedValue();
154711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final InputMethodCallback mInputMethodCallback;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<Object> mPendingEvents = new SparseArray<Object>();
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mPendingEventSeq = 0;
1588506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Thread mThread;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowLeaked mLocation;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowManager.LayoutParams mWindowAttributes = new WindowManager.LayoutParams();
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final W mWindow;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
167180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn    final int mTargetSdkVersion;
168180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn
1699a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    int mSeq;
1709a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mView;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mFocusedView;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mRealFocusedView;  // this is not set to null in touch mode
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mViewVisibility;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppVisible = true;
176180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn    int mOrigWindowType = -1;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
178ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    // Set to true if the owner of this window is in the stopped state,
179ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    // so the window should no longer be active.
180ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    boolean mStopped = false;
181ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1825fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    boolean mLastInCompatMode = false;
1835fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
184d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    SurfaceHolder.Callback2 mSurfaceHolderCallback;
185dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    BaseSurfaceHolder mSurfaceHolder;
186dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    boolean mIsCreating;
187dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    boolean mDrawingAllowed;
188dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Region mTransparentRegion;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Region mPreviousTransparentRegion;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mWidth;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mHeight;
1947d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    Rect mDirty;
1957d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    final Rect mCurrentDirty = new Rect();
1967d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    final Rect mPreviousDirty = new Rect();
197bb93d5598daa3312318c29401815bddf1df8c4deRomain Guy    boolean mIsAnimating;
1988506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
19964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    CompatibilityInfo.Translator mTranslator;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final View.AttachInfo mAttachInfo;
20246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    InputChannel mInputChannel;
2031e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn    InputQueue.Callback mInputQueueCallback;
2041e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn    InputQueue mInputQueue;
20586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato    FallbackEventHandler mFallbackEventHandler;
206a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mTempRect; // used in the transaction to not thrash the heap.
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mVisRect; // used to retrieve visible rect of focused view.
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mTraversalScheduled;
2114e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    long mLastTraversalFinishedTimeNanos;
2124e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    long mLastDrawDurationNanos;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWillDrawSoon;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLayoutRequested;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFirst;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mReportNextDraw;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFullRedrawNeeded;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mNewSurfaceNeeded;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mHasHadWindowFocus;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLastWasImTarget;
2211f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    InputEventMessage mPendingInputEvents = null;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWindowAttributesChanged = false;
224f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy    int mWindowAttributesChangesFlag = 0;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These can be accessed by any thread, must be protected with a lock.
2275583dc630f861dd9a3006390db227f9296007e00Mathias Agopian    // Surface can never be reassigned or cleared (use Surface.clear()).
2285583dc630f861dd9a3006390db227f9296007e00Mathias Agopian    private final Surface mSurface = new Surface();
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAdded;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAddedTouchMode;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2335fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    CompatibilityInfoHolder mCompatibilityInfo;
2345fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ int mAddNesting;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are accessed by multiple threads.
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mWinFrame; // frame given by window manager.
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mPendingVisibleInsets = new Rect();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mPendingContentInsets = new Rect();
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ViewTreeObserver.InternalInsetsInfo mLastGivenInsets
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new ViewTreeObserver.InternalInsetsInfo();
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
245694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    final Configuration mLastConfiguration = new Configuration();
246694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    final Configuration mPendingConfiguration = new Configuration();
24759a12cae208790dd202656f50a40a53ef49baeebRomain Guy
248e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    class ResizedInfo {
249e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Rect coveredInsets;
250e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Rect visibleInsets;
251e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Configuration newConfig;
252e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
253e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScrollMayChange;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSoftInputMode;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mLastScrolledFocus;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mScrollY;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mCurScrollY;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Scroller mScroller;
2607d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    HardwareLayer mResizeBuffer;
2617d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    long mResizeBufferStartTime;
2627d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    int mResizeBufferDuration;
2630f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    static final Interpolator mResizeInterpolator = new AccelerateDecelerateInterpolator();
264cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    private ArrayList<LayoutTransition> mPendingTransitions;
2658506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2668506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy    final ViewConfiguration mViewConfiguration;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
268a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /* Drag/drop */
269a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    ClipDescription mDragDescription;
270a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    View mCurrentDragView;
2717fb8b565f9cd2ec6a63ff4d8a89f98f68a1a138cChristopher Tate    volatile Object mLocalDragState;
272a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    final PointF mDragPoint = new PointF();
2732c095f367779ef32130c72849936a2e3013c8492Christopher Tate    final PointF mLastTouchPoint = new PointF();
27459a12cae208790dd202656f50a40a53ef49baeebRomain Guy
27559a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private boolean mProfileRendering;
27659a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private Thread mRenderProfiler;
27759a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private volatile boolean mRenderProfilingEnabled;
278a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
2792f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    // Variables to track frames per second, enabled via DEBUG_FPS flag
2802f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private long mFpsStartTime = -1;
2812f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private long mFpsPrevTime = -1;
2822f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private int mFpsNumFrames;
2832f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * see {@link #playSoundEffect(int)}
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AudioManager mAudioManager;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2898643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final AccessibilityManager mAccessibilityManager;
2908643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
2915ac84423a28fea4924eb1c389d647defe1c1b93cGilles Debunne    AccessibilityInteractionController mAccessibilityInteractionController;
2928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
2938643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    AccessibilityInteractionConnectionManager mAccessibilityInteractionConnectionManager;
2948643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
295a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov    SendWindowContentChangedAccessibilityEvent mSendWindowContentChangedAccessibilityEvent;
296eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
29711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn    private final int mDensity;
298b08013c312e3d849029a2f4c11889274c00f438dAdam Powell
29921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /**
30021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * Consistency verifier for debugging purposes.
30121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     */
30221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    protected final InputEventConsistencyVerifier mInputEventConsistencyVerifier =
30321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            InputEventConsistencyVerifier.isInstrumentationEnabled() ?
30421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                    new InputEventConsistencyVerifier(this, 0) : null;
30521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
3064c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    public static IWindowSession getWindowSession(Looper mainLooper) {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStaticInit) {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mInitialized) {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
3104c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    InputMethodManager imm = InputMethodManager.getInstance(mainLooper);
31144bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn                    sWindowSession = Display.getWindowManager().openSession(
31244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn                            imm.getClient(), imm.getInputContext());
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInitialized = true;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3174c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            return sWindowSession;
3184c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
3194c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
3209a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn
3219a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    static final class SystemUiVisibilityInfo {
3229a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int seq;
3239a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int globalVisibility;
3249a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int localValue;
3259a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int localChanges;
3269a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    }
3274c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
3286dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn    public ViewRootImpl(Context context) {
3294c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        super();
3304c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
331812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy        if (MEASURE_LATENCY) {
332812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy            if (lt == null) {
333812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                lt = new LatencyTimer(100, 1000);
334812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy            }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3374c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // Initialize the statics when this class is first instantiated. This is
3384c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // done here instead of in the static block because Zygote does not
3394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // allow the spawning of threads.
3404c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWindowSession(context.getMainLooper());
3418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread = Thread.currentThread();
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocation = new WindowLeaked(null);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocation.fillInStackTrace();
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWidth = -1;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeight = -1;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDirty = new Rect();
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTempRect = new Rect();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVisRect = new Rect();
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWinFrame = new Rect();
351fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy        mWindow = new W(this);
352180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn        mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInputMethodCallback = new InputMethodCallback(this);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewVisibility = View.GONE;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransparentRegion = new Region();
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPreviousTransparentRegion = new Region();
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = true; // true for the first time the view is added
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAdded = false;
3598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager = AccessibilityManager.getInstance(context);
3608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityInteractionConnectionManager =
3618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            new AccessibilityInteractionConnectionManager();
3628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager.addAccessibilityStateChangeListener(
3638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAccessibilityInteractionConnectionManager);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo = new View.AttachInfo(sWindowSession, mWindow, this, this);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewConfiguration = ViewConfiguration.get(context);
36611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        mDensity = context.getResources().getDisplayMetrics().densityDpi;
36786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato        mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context);
36859a12cae208790dd202656f50a40a53ef49baeebRomain Guy        mProfileRendering = Boolean.parseBoolean(
36959a12cae208790dd202656f50a40a53ef49baeebRomain Guy                SystemProperties.get(PROPERTY_PROFILE_RENDERING, "false"));
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3722a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    public static void addFirstDrawHandler(Runnable callback) {
3732a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        synchronized (sFirstDrawHandlers) {
3742a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            if (!sFirstDrawComplete) {
3752a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                sFirstDrawHandlers.add(callback);
3762a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            }
3772a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        }
3782a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    }
3792a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn
380e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    public static void addConfigCallback(ComponentCallbacks callback) {
381e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        synchronized (sConfigCallbacks) {
382e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            sConfigCallbacks.add(callback);
383e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
384e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
385e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // FIXME for perf testing only
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mProfile = false;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to profile the next traversal call.
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * FIXME for perf testing only. Remove eventually
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void profile() {
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProfile = true;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether we are in touch mode. Calling this method triggers an IPC
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call and should be avoided whenever possible.
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True, if the device is in touch mode, false otherwise.
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean isInTouchMode() {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInitialized) {
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sWindowSession.getInTouchMode();
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We have one child
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
418e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView == null) {
4218169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                mView = view;
42286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                mFallbackEventHandler.setView(view);
4239189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                mWindowAttributes.copyFrom(attrs);
4241ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                attrs = mWindowAttributes;
425e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
426dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (view instanceof RootViewSurfaceTaker) {
427dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolderCallback =
428dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            ((RootViewSurfaceTaker)view).willYouTakeTheSurface();
429dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (mSurfaceHolderCallback != null) {
430dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolder = new TakenSurfaceHolder();
431289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn                        mSurfaceHolder.setFormat(PixelFormat.UNKNOWN);
432dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
433dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
4341aec9a2212dd76e47ce0215006e5415b6430b54fRomain Guy
4355fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                CompatibilityInfo compatibilityInfo = mCompatibilityInfo.get();
436589cebe2d58591403de4a77077941c0454bc91bcMitsuru Oshima                mTranslator = compatibilityInfo.getTranslator();
43738ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
438856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy                // If the application owns the surface, don't enable hardware acceleration
439856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy                if (mSurfaceHolder == null) {
440856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy                    enableHardwareAcceleration(attrs);
44138ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima                }
44238ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
443e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima                boolean restore = false;
44435b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                if (mTranslator != null) {
445856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy                    mSurface.setCompatibilityTranslator(mTranslator);
446e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima                    restore = true;
44764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    attrs.backup();
44864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateWindowLayout(attrs);
4499189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                }
45064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (DEBUG_LAYOUT) Log.d(TAG, "WindowLayout in setView:" + attrs);
45164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
4521ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                if (!compatibilityInfo.supportsScreen()) {
4531ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                    attrs.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
4545fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    mLastInCompatMode = true;
4551ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                }
4561ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSoftInputMode = attrs.softInputMode;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowAttributesChanged = true;
459f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy                mWindowAttributesChangesFlag = WindowManager.LayoutParams.EVERYTHING_CHANGED;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mRootView = view;
46135b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                mAttachInfo.mScalingRequired = mTranslator != null;
46264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                mAttachInfo.mApplicationScale =
46364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        mTranslator == null ? 1.0f : mTranslator.applicationScale;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (panelParentView != null) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mPanelParentWindowToken
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            = panelParentView.getApplicationWindowToken();
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAdded = true;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int res; /* = WindowManagerImpl.ADD_OKAY; */
4708506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Schedule the first layout -before- adding to the window
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // manager, to make sure we do the relayout before receiving
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // any other events from the system.
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout();
475cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if ((mWindowAttributes.inputFeatures
476cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) {
477cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    mInputChannel = new InputChannel();
478cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
480180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                    mOrigWindowType = mWindowAttributes.type;
4819a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                    res = sWindowSession.add(mWindow, mSeq, mWindowAttributes,
48246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                            getHostVisibility(), mAttachInfo.mContentInsets,
48346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                            mInputChannel);
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAdded = false;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView = null;
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mRootView = null;
48846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    mInputChannel = null;
48986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                    mFallbackEventHandler.setView(null);
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unscheduleTraversals();
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException("Adding window failed", e);
49264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                } finally {
49364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    if (restore) {
49464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        attrs.restore();
49564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
49746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
49864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (mTranslator != null) {
49964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateRectInScreenToAppWindow(mAttachInfo.mContentInsets);
5009189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                }
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingContentInsets.set(mAttachInfo.mContentInsets);
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingVisibleInsets.set(0, 0, 0, 0);
503711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                if (DEBUG_LAYOUT) Log.v(TAG, "Added window " + mWindow);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (res < WindowManagerImpl.ADD_OKAY) {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView = null;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mRootView = null;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAdded = false;
50886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                    mFallbackEventHandler.setView(null);
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unscheduleTraversals();
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (res) {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_BAD_APP_TOKEN:
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN:
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- token " + attrs.token
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is not valid; is your activity running?");
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_NOT_APP_TOKEN:
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- token " + attrs.token
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is not for an application");
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_APP_EXITING:
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- app for token " + attrs.token
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is exiting");
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_DUPLICATE_ADD:
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- window " + mWindow
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " has already been added");
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_STARTING_NOT_NEEDED:
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Silently ignore -- we would have just removed it
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // right away, anyway.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_MULTIPLE_SINGLETON:
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window " + mWindow +
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                " -- another window of this type already exists");
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_PERMISSION_DENIED:
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window " + mWindow +
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                " -- permission denied for this window type");
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException(
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Unable to add window -- unknown error code " + res);
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
54500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (view instanceof RootViewSurfaceTaker) {
54600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputQueueCallback =
54700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        ((RootViewSurfaceTaker)view).willYouTakeTheInputQueue();
54800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                }
549cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (mInputChannel != null) {
550cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    if (mInputQueueCallback != null) {
551cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        mInputQueue = new InputQueue(mInputChannel);
552cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        mInputQueueCallback.onInputQueueCreated(mInputQueue);
553cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    } else {
554cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        InputQueue.registerInputChannel(mInputChannel, mInputHandler,
555cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                                Looper.myQueue());
556cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    }
55746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                }
5588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                view.assignParent(this);
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAddedTouchMode = (res&WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE) != 0;
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppVisible = (res&WindowManagerImpl.ADD_FLAG_APP_VISIBLE) != 0;
5628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
5638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                if (mAccessibilityManager.isEnabled()) {
5648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    mAccessibilityInteractionConnectionManager.ensureConnection();
5658643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5708ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    void destroyHardwareResources() {
57165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mAttachInfo.mHardwareRenderer != null) {
57265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer.isEnabled()) {
57365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                mAttachInfo.mHardwareRenderer.destroyLayers(mView);
57465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
57565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            mAttachInfo.mHardwareRenderer.destroy(false);
57665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
57765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
57865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
57931f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy    void terminateHardwareResources() {
58031f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy        if (mAttachInfo.mHardwareRenderer != null) {
58131f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy            mAttachInfo.mHardwareRenderer.destroyHardwareResources(mView);
58231f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy            mAttachInfo.mHardwareRenderer.destroy(false);
58331f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy        }
58431f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy    }
58531f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy
58665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void destroyHardwareLayers() {
58765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mThread != Thread.currentThread()) {
58865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer != null &&
58965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    mAttachInfo.mHardwareRenderer.isEnabled()) {
590c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                HardwareRenderer.trimMemory(ComponentCallbacks2.TRIM_MEMORY_MODERATE);
59165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
59265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        } else {
59365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer != null &&
59465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    mAttachInfo.mHardwareRenderer.isEnabled()) {
59565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                mAttachInfo.mHardwareRenderer.destroyLayers(mView);
59665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
5976d7475d666baefaa3ba9f0dcee25238739454241Romain Guy        }
5986d7475d666baefaa3ba9f0dcee25238739454241Romain Guy    }
5996d7475d666baefaa3ba9f0dcee25238739454241Romain Guy
600529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy    private void enableHardwareAcceleration(WindowManager.LayoutParams attrs) {
6017eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        mAttachInfo.mHardwareAccelerated = false;
6027eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        mAttachInfo.mHardwareAccelerationRequested = false;
6034f6aff386045000c2c03b903c7109cb42092b7eaRomain Guy
604856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy        // Don't enable hardware acceleration when the application is in compatibility mode
605856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy        if (mTranslator != null) return;
606856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy
6077eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        // Try to enable hardware acceleration if requested
6081b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller        final boolean hardwareAccelerated =
6091b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller                (attrs.flags & WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0;
6101b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller
611566c33105a76c6a02333db8b775721990bc6cca4Romain Guy        if (hardwareAccelerated) {
6121af23a32d879db330eb5a08b21090ec60b604a32Romain Guy            if (!HardwareRenderer.isAvailable()) {
6131af23a32d879db330eb5a08b21090ec60b604a32Romain Guy                return;
6141af23a32d879db330eb5a08b21090ec60b604a32Romain Guy            }
6151af23a32d879db330eb5a08b21090ec60b604a32Romain Guy
6165d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // Persistent processes (including the system) should not do
6175d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // accelerated rendering on low-end devices.  In that case,
6185d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // sRendererDisabled will be set.  In addition, the system process
6195d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // itself should never do accelerated rendering.  In that case, both
6205d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // sRendererDisabled and sSystemRendererDisabled are set.  When
6215d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // sSystemRendererDisabled is set, PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED
6225d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // can be used by code on the system process to escape that and enable
6235d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // HW accelerated drawing.  (This is basically for the lock screen.)
6245d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn
6255d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            final boolean fakeHwAccelerated = (attrs.privateFlags &
6265d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                    WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED) != 0;
6275d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            final boolean forceHwAccelerated = (attrs.privateFlags &
6285d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                    WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED) != 0;
6295d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn
6305d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            if (!HardwareRenderer.sRendererDisabled || (HardwareRenderer.sSystemRendererDisabled
6315d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                    && forceHwAccelerated)) {
632ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                // Don't enable hardware acceleration when we're not on the main thread
6335d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                if (!HardwareRenderer.sSystemRendererDisabled
6345d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                        && Looper.getMainLooper() != Looper.myLooper()) {
6351b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller                    Log.w(HardwareRenderer.LOG_TAG, "Attempting to initialize hardware "
636ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                            + "acceleration outside of the main thread, aborting");
637ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                    return;
638ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                }
639ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy
640e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy                final boolean translucent = attrs.format != PixelFormat.OPAQUE;
641b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                if (mAttachInfo.mHardwareRenderer != null) {
642b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                    mAttachInfo.mHardwareRenderer.destroy(true);
6434caa4ed120a86e855d4d3b6b455c6fb9ca22e365Romain Guy                }
644b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                mAttachInfo.mHardwareRenderer = HardwareRenderer.createGlRenderer(2, translucent);
6457eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                mAttachInfo.mHardwareAccelerated = mAttachInfo.mHardwareAccelerationRequested
6467eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                        = mAttachInfo.mHardwareRenderer != null;
6475d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            } else if (fakeHwAccelerated) {
6485d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // The window had wanted to use hardware acceleration, but this
6495d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // is not allowed in its process.  By setting this flag, it can
6505d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // still render as if it was accelerated.  This is basically for
6515d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // the preview windows the window manager shows for launching
6525d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // applications, so they will look more like the app being launched.
65307213e6d8895af10951851435adf96a779863f6cDianne Hackborn                mAttachInfo.mHardwareAccelerationRequested = true;
654e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            }
655e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        }
656e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
657e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getView() {
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mView;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowLeaked getLocation() {
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLocation;
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setLayoutParams(WindowManager.LayoutParams attrs, boolean newView) {
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
668105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            int oldSoftInputMode = mWindowAttributes.softInputMode;
6695a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            // preserve compatible window flag if exists.
6705a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            int compatibleWindowFlag =
6715a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima                mWindowAttributes.flags & WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
672f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy            mWindowAttributesChangesFlag = mWindowAttributes.copyFrom(attrs);
6735a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            mWindowAttributes.flags |= compatibleWindowFlag;
6745a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newView) {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSoftInputMode = attrs.softInputMode;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout();
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
679105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            // Don't lose the mode we last auto-computed.
680105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if ((attrs.softInputMode&WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
681105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED) {
682105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mWindowAttributes.softInputMode = (mWindowAttributes.softInputMode
683105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        & ~WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
684105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        | (oldSoftInputMode
685105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                & WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST);
686105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = true;
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void handleAppVisibility(boolean visible) {
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAppVisible != visible) {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppVisible = visible;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void handleGetNewSurface() {
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNewSurfaceNeeded = true;
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullRedrawNeeded = true;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scheduleTraversals();
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestLayout() {
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutRequested = true;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scheduleTraversals();
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isLayoutRequested() {
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLayoutRequested;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void invalidateChild(View child, Rect dirty) {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
72364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (DEBUG_DRAW) Log.v(TAG, "Invalidate child: " + dirty);
72470d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase        if (dirty == null) {
72570d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase            // Fast invalidation for GL-enabled applications; GL must redraw everything
72670d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase            invalidate();
72770d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase            return;
72870d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase        }
72964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mCurScrollY != 0 || mTranslator != null) {
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTempRect.set(dirty);
7311e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            dirty = mTempRect;
7328169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            if (mCurScrollY != 0) {
7331e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy               dirty.offset(0, -mCurScrollY);
7348169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            }
73564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            if (mTranslator != null) {
7361e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy                mTranslator.translateRectInAppWindowToScreen(dirty);
7371e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            }
7381e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            if (mAttachInfo.mScalingRequired) {
7391e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy                dirty.inset(-1, -1);
7408169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            }
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
742daf98e941e140e8739458126640183b9f296a2abChet Haase        if (!mDirty.isEmpty() && !mDirty.contains(dirty)) {
74302ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy            mAttachInfo.mSetIgnoreDirtyState = true;
7447d695945801b8e6a051440731b500ff109e4b5abRomain Guy            mAttachInfo.mIgnoreDirtyState = true;
7457d695945801b8e6a051440731b500ff109e4b5abRomain Guy        }
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDirty.union(dirty);
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWillDrawSoon) {
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7510d9275e565551eed57297627188aa39f3897a50bRomain Guy
7520d9275e565551eed57297627188aa39f3897a50bRomain Guy    void invalidate() {
7530d9275e565551eed57297627188aa39f3897a50bRomain Guy        mDirty.set(0, 0, mWidth, mHeight);
7540d9275e565551eed57297627188aa39f3897a50bRomain Guy        scheduleTraversals();
7550d9275e565551eed57297627188aa39f3897a50bRomain Guy    }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
757ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    void setStopped(boolean stopped) {
758ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        if (mStopped != stopped) {
759ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            mStopped = stopped;
760ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (!stopped) {
761ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                scheduleTraversals();
762ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            }
763ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        }
764ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    }
765ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewParent getParent() {
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewParent invalidateChildInParent(final int[] location, final Rect dirty) {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidateChild(null, dirty);
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) {
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (child != mView) {
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("child is not mine, honest!");
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Note: don't apply scroll offset, because we want to know its
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // visibility in the virtual canvas being given to the view hierarchy.
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return r.intersect(0, 0, mWidth, mHeight);
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void bringChildToFront(View child) {
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void scheduleTraversals() {
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mTraversalScheduled) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTraversalScheduled = true;
7904e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
7911c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            //noinspection ConstantConditions
7924e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (ViewDebug.DEBUG_LATENCY && mLastTraversalFinishedTimeNanos != 0) {
7934e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                final long now = System.nanoTime();
7944e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                Log.d(TAG, "Latency: Scheduled traversal, it has been "
7954e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + ((now - mLastTraversalFinishedTimeNanos) * 0.000001f)
7964e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + "ms since the last traversal finished.");
7974e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
7984e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendEmptyMessage(DO_TRAVERSAL);
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unscheduleTraversals() {
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTraversalScheduled) {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTraversalScheduled = false;
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeMessages(DO_TRAVERSAL);
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int getHostVisibility() {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAppVisible ? mView.getVisibility() : View.GONE;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8138506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
8147d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    void disposeResizeBuffer() {
8157d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
8167d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            mResizeBuffer.destroy();
8177d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            mResizeBuffer = null;
8180f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
8190f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
8200f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
821cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    /**
822cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * Add LayoutTransition to the list of transitions to be started in the next traversal.
823cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * This list will be cleared after the transitions on the list are start()'ed. These
824cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * transitionsa re added by LayoutTransition itself when it sets up animations. The setup
825cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * happens during the layout phase of traversal, which we want to complete before any of the
826cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * animations are started (because those animations may side-effect properties that layout
827cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * depends upon, like the bounding rectangles of the affected views). So we add the transition
828cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * to the list and it is started just prior to starting the drawing phase of traversal.
829cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     *
830cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * @param transition The LayoutTransition to be started on the next traversal.
831cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     *
832cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * @hide
833cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     */
834cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    public void requestTransitionStart(LayoutTransition transition) {
835cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase        if (mPendingTransitions == null || !mPendingTransitions.contains(transition)) {
836cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            if (mPendingTransitions == null) {
837cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase                 mPendingTransitions = new ArrayList<LayoutTransition>();
838cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            }
839cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            mPendingTransitions.add(transition);
840cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase        }
841cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    }
842cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase
8431f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    private void processInputEvents(boolean outOfOrder) {
8441f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        while (mPendingInputEvents != null) {
8451f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            handleMessage(mPendingInputEvents.mMessage);
8461f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            InputEventMessage tmpMessage = mPendingInputEvents;
8471f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            mPendingInputEvents = mPendingInputEvents.mNext;
8481f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            tmpMessage.recycle();
8491f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            if (outOfOrder) {
8501f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                removeMessages(PROCESS_INPUT_EVENTS);
8511f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            }
8521f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        }
8531f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    }
8541f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void performTraversals() {
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // cache mView since it is used so much below...
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View host = mView;
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8591f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        processInputEvents(true);
8601f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) {
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("======================================");
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("performTraversals");
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.debug();
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (host == null || !mAdded)
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTraversalScheduled = false;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWillDrawSoon = true;
872711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn        boolean windowSizeMayChange = false;
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean fullRedrawNeeded = mFullRedrawNeeded;
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean newSurface = false;
875dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        boolean surfaceChanged = false;
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManager.LayoutParams lp = mWindowAttributes;
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int desiredWindowWidth;
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int desiredWindowHeight;
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int childWidthMeasureSpec;
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int childHeightMeasureSpec;
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View.AttachInfo attachInfo = mAttachInfo;
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int viewVisibility = getHostVisibility();
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean viewVisibilityChanged = mViewVisibility != viewVisibility
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || mNewSurfaceNeeded;
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManager.LayoutParams params = null;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindowAttributesChanged) {
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = false;
892dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            surfaceChanged = true;
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            params = lp;
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8955fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatibilityInfo compatibilityInfo = mCompatibilityInfo.get();
8965fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (compatibilityInfo.supportsScreen() == mLastInCompatMode) {
8975fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            params = lp;
8985fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            fullRedrawNeeded = true;
8995fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            mLayoutRequested = true;
9005fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            if (mLastInCompatMode) {
9015fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                params.flags &= ~WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
9025fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                mLastInCompatMode = false;
9035fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            } else {
9045fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                params.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
9055fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                mLastInCompatMode = true;
9065fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            }
9075fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
908f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy
909f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy        mWindowAttributesChangesFlag = 0;
910f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy
91164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        Rect frame = mWinFrame;
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst) {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fullRedrawNeeded = true;
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutRequested = true;
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
916a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            if (lp.type == WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL) {
917a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                // NOTE -- system code, won't try to do compat mode.
918a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                Display disp = WindowManagerImpl.getDefault().getDefaultDisplay();
919bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                Point size = new Point();
920bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                disp.getRealSize(size);
921bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                desiredWindowWidth = size.x;
922bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                desiredWindowHeight = size.y;
923a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            } else {
924a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                DisplayMetrics packageMetrics =
925a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    mView.getContext().getResources().getDisplayMetrics();
926a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                desiredWindowWidth = packageMetrics.widthPixels;
927a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                desiredWindowHeight = packageMetrics.heightPixels;
928a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            }
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // For the very first time, tell the view hierarchy that it
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // is attached to the window.  Note that at this point the surface
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // object is not initialized to its backing store, but soon it
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // will be (assuming the window is visible).
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mSurface = mSurface;
935c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // We used to use the following condition to choose 32 bits drawing caches:
936c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // PixelFormat.hasAlpha(lp.format) || lp.format == PixelFormat.RGBX_8888
937c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // However, windows are now always 32 bits by default, so choose 32 bits
938c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            attachInfo.mUse32BitDrawingCache = true;
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mHasWindowFocus = false;
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowVisibility = viewVisibility;
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mRecomputeGlobalAttributes = false;
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mKeepScreenOn = false;
943664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            attachInfo.mSystemUiVisibility = 0;
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            viewVisibilityChanged = false;
945694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            mLastConfiguration.setTo(host.getResources().getConfiguration());
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.dispatchAttachedToWindow(attachInfo, 0);
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Screen on initialized: " + attachInfo.mKeepScreenOn);
94875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
949fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn            host.fitSystemWindows(mAttachInfo.mContentInsets);
950fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
95264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            desiredWindowWidth = frame.width();
95364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            desiredWindowHeight = frame.height();
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (desiredWindowWidth != mWidth || desiredWindowHeight != mHeight) {
955c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                if (DEBUG_ORIENTATION) Log.v(TAG,
95664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        "View " + host + " resized to: " + frame);
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fullRedrawNeeded = true;
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutRequested = true;
959711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                windowSizeMayChange = true;
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (viewVisibilityChanged) {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowVisibility = viewVisibility;
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.dispatchWindowVisibilityChanged(viewVisibility);
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility != View.VISIBLE || mNewSurfaceNeeded) {
96765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                destroyHardwareResources();
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.GONE) {
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // After making a window gone, we will count it as being
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // shown for the first time the next time it gets focus.
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHasHadWindowFocus = false;
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean insetsChanged = false;
9778506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
978ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        if (mLayoutRequested && !mStopped) {
97915df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy            // Execute enqueued actions on every layout in case a view that was detached
98015df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy            // enqueued an action after being detached
98115df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy            getRunQueue().executeActions(attachInfo.mHandler);
98215df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy
983711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            final Resources res = mView.getContext().getResources();
984711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFirst) {
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // make sure touch mode code executes by setting cached value
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to opposite of the added touch mode.
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mInTouchMode = !mAddedTouchMode;
9892d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy                ensureTouchModeLocally(mAddedTouchMode);
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
991fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                if (!mPendingContentInsets.equals(mAttachInfo.mContentInsets)) {
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    insetsChanged = true;
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
994fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                if (!mPendingVisibleInsets.equals(mAttachInfo.mVisibleInsets)) {
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets);
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Visible insets changing to: "
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mVisibleInsets);
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) {
1001711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    windowSizeMayChange = true;
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1003a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    if (lp.type == WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL) {
1004a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        // NOTE -- system code, won't try to do compat mode.
1005a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        Display disp = WindowManagerImpl.getDefault().getDefaultDisplay();
1006bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        Point size = new Point();
1007bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        disp.getRealSize(size);
1008bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        desiredWindowWidth = size.x;
1009bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        desiredWindowHeight = size.y;
1010a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    } else {
1011a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        DisplayMetrics packageMetrics = res.getDisplayMetrics();
1012a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        desiredWindowWidth = packageMetrics.widthPixels;
1013a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        desiredWindowHeight = packageMetrics.heightPixels;
1014a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    }
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ask host how big it wants to be
1019c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            if (DEBUG_ORIENTATION || DEBUG_LAYOUT) Log.v(TAG,
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Measuring " + host + " in display " + desiredWindowWidth
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + "x" + desiredWindowHeight + "...");
1022711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
1023711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            boolean goodMeasure = false;
1024a3e3c533ee4af6d9dba43b70ac421ba880992961Adam Powell            if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT) {
1025711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // On large screens, we don't want to allow dialogs to just
1026711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // stretch to fill the entire width of the screen to display
1027711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // one line of text.  First try doing the layout at a smaller
1028711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // size to see if it will fit.
1029711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                final DisplayMetrics packageMetrics = res.getDisplayMetrics();
1030711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                res.getValue(com.android.internal.R.dimen.config_prefDialogWidth, mTmpValue, true);
1031711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                int baseSize = 0;
1032711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                if (mTmpValue.type == TypedValue.TYPE_DIMENSION) {
1033711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    baseSize = (int)mTmpValue.getDimension(packageMetrics);
1034711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                }
1035711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": baseSize=" + baseSize);
10367d3a5bcf300aea7bffb1d46f28e244ca807f5e82Dianne Hackborn                if (baseSize != 0 && desiredWindowWidth > baseSize) {
1037711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width);
1038711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height);
1039711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1040711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured ("
1041189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                            + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")");
1042189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                    if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) {
1043711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        goodMeasure = true;
1044711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    } else {
1045711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        // Didn't fit in that size... try expanding a bit.
1046711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        baseSize = (baseSize+desiredWindowWidth)/2;
1047711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": next baseSize="
1048711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                                + baseSize);
1049189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                        childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width);
1050711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1051711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured ("
1052189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                                + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")");
1053189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                        if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) {
1054711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                            if (DEBUG_DIALOG) Log.v(TAG, "Good!");
1055711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                            goodMeasure = true;
1056711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        }
1057711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    }
1058711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                }
1059711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            }
1060711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
1061711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            if (!goodMeasure) {
1062711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width);
1063711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height);
1064711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1065aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell                if (mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight()) {
1066aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell                    windowSizeMayChange = true;
1067aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell                }
1068711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            }
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) {
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("======================================");
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("performTraversals -- after measure");
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.debug();
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10776e81e57b526a3e23038e365414acbb9688f8e44aRomain Guy        if (attachInfo.mRecomputeGlobalAttributes && host.mAttachInfo != null) {
1078664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            //Log.i(TAG, "Computing view hierarchy attributes!");
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mRecomputeGlobalAttributes = false;
1080664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            boolean oldScreenOn = attachInfo.mKeepScreenOn;
1081664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            int oldVis = attachInfo.mSystemUiVisibility;
10829a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            boolean oldHasSystemUiListeners = attachInfo.mHasSystemUiListeners;
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
10899a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                    || attachInfo.mHasSystemUiListeners != oldHasSystemUiListeners) {
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                params = lp;
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10939a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        if (attachInfo.mForceReportNewAttributes) {
10949a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            attachInfo.mForceReportNewAttributes = false;
10959a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            params = lp;
10969a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        }
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst || attachInfo.mViewVisibilityChanged) {
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mViewVisibilityChanged = false;
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resizeMode = mSoftInputMode &
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST;
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are in auto resize mode, then we need to determine
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // what mode to use now.
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (resizeMode == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED) {
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = attachInfo.mScrollContainers.size();
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (attachInfo.mScrollContainers.get(i).isShown()) {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resizeMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (resizeMode == 0) {
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resizeMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN;
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((lp.softInputMode &
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST) != resizeMode) {
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lp.softInputMode = (lp.softInputMode &
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ~WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST) |
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            resizeMode;
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    params = lp;
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11238506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (params != null && (host.mPrivateFlags & View.REQUEST_TRANSPARENT_REGIONS) != 0) {
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!PixelFormat.formatHasAlpha(params.format)) {
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                params.format = PixelFormat.TRANSLUCENT;
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1130711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn        boolean windowShouldResize = mLayoutRequested && windowSizeMayChange
1131189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn            && ((mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight())
11322e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                || (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT &&
11332e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                        frame.width() < desiredWindowWidth && frame.width() != mWidth)
11342e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                || (lp.height == ViewGroup.LayoutParams.WRAP_CONTENT &&
11352e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                        frame.height() < desiredWindowHeight && frame.height() != mHeight));
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean computesInternalInsets =
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attachInfo.mTreeObserver.hasComputeInternalInsetsListeners();
1139812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean insetsPending = false;
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int relayoutResult = 0;
1142812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
1143812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy        if (mFirst || windowShouldResize || insetsChanged ||
1144812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                viewVisibilityChanged || params != null) {
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.VISIBLE) {
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this window is giving internal insets to the window
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // manager, and it is being added or changing its visibility,
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // then we want to first give the window manager "fake"
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // insets to cause it to effectively ignore the content of
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the window during layout.  This avoids it briefly causing
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // other windows to resize/move based on the raw frame of the
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, waiting until we can finish laying out this window
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // and get back to the window manager with the ultimately
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // computed insets.
1156812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                insetsPending = computesInternalInsets && (mFirst || viewVisibilityChanged);
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            if (mSurfaceHolder != null) {
1160dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mSurfaceHolder.mSurfaceLock.lock();
1161dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mDrawingAllowed = true;
1162dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            }
1163812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
1164c361da845a205ac35e724c0ca436744d483de7aaRomain Guy            boolean hwInitialized = false;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean contentInsetsChanged = false;
116613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            boolean visibleInsetsChanged;
1167dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            boolean hadSurface = mSurface.isValid();
1168812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int fl = 0;
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (params != null) {
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fl = params.flags;
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (attachInfo.mKeepScreenOn) {
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
117614782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato                    params.subtreeSystemUiVisibility = attachInfo.mSystemUiVisibility;
11779a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                    params.hasSystemUiListeners = attachInfo.mHasSystemUiListeners;
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11798169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                if (DEBUG_LAYOUT) {
1180189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                    Log.i(TAG, "host=w:" + host.getMeasuredWidth() + ", h:" +
1181189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                            host.getMeasuredHeight() + ", params=" + params);
11828169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                }
11832a83f001fdb189f945e82e81e717ba204824b112Romain Guy
11842a83f001fdb189f945e82e81e717ba204824b112Romain Guy                final int surfaceGenerationId = mSurface.getGenerationId();
11858169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                relayoutResult = relayoutWindow(params, viewVisibility, insetsPending);
11868169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (params != null) {
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    params.flags = fl;
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_LAYOUT) Log.v(TAG, "relayout: frame=" + frame.toShortString()
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " content=" + mPendingContentInsets.toShortString()
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " visible=" + mPendingVisibleInsets.toShortString()
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " surface=" + mSurface);
11958506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1196694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                if (mPendingConfiguration.seq != 0) {
1197694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (DEBUG_CONFIGURATION) Log.v(TAG, "Visible with new config: "
1198694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            + mPendingConfiguration);
1199694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    updateConfiguration(mPendingConfiguration, !mFirst);
1200694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    mPendingConfiguration.seq = 0;
1201694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                }
1202694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                contentInsetsChanged = !mPendingContentInsets.equals(
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAttachInfo.mContentInsets);
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                visibleInsetsChanged = !mPendingVisibleInsets.equals(
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAttachInfo.mVisibleInsets);
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (contentInsetsChanged) {
1208fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                    if (mWidth > 0 && mHeight > 0 &&
1209fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mSurface != null && mSurface.isValid() &&
1210fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            !mAttachInfo.mTurnOffWindowResizeAnim &&
1211fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mAttachInfo.mHardwareRenderer != null &&
1212fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mAttachInfo.mHardwareRenderer.isEnabled() &&
1213fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mAttachInfo.mHardwareRenderer.validate() &&
1214fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            lp != null && !PixelFormat.formatHasAlpha(lp.format)) {
1215fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
1216fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        disposeResizeBuffer();
1217fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
1218fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        boolean completed = false;
121908837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                        HardwareCanvas hwRendererCanvas = mAttachInfo.mHardwareRenderer.getCanvas();
122008837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                        HardwareCanvas layerCanvas = null;
1221fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        try {
1222fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (mResizeBuffer == null) {
1223fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                mResizeBuffer = mAttachInfo.mHardwareRenderer.createHardwareLayer(
1224fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                        mWidth, mHeight, false);
1225fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            } else if (mResizeBuffer.getWidth() != mWidth ||
1226fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    mResizeBuffer.getHeight() != mHeight) {
1227fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                mResizeBuffer.resize(mWidth, mHeight);
1228fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
122908837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas = mResizeBuffer.start(hwRendererCanvas);
123008837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.setViewport(mWidth, mHeight);
123108837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.onPreDraw(null);
123208837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            final int restoreCount = layerCanvas.save();
1233fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
123408837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.drawColor(0xff000000, PorterDuff.Mode.SRC);
1235fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
1236fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            int yoff;
1237fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            final boolean scrolling = mScroller != null
1238fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    && mScroller.computeScrollOffset();
1239fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (scrolling) {
1240fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                yoff = mScroller.getCurrY();
1241fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                mScroller.abortAnimation();
1242fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            } else {
1243fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                yoff = mScrollY;
1244fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1245fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
124608837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.translate(0, -yoff);
1247fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (mTranslator != null) {
124808837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                                mTranslator.translateCanvas(layerCanvas);
1249fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1250fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
125108837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            mView.draw(layerCanvas);
1252fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
1253fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mResizeBufferStartTime = SystemClock.uptimeMillis();
1254fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mResizeBufferDuration = mView.getResources().getInteger(
1255fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    com.android.internal.R.integer.config_mediumAnimTime);
1256fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            completed = true;
1257fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
125808837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.restoreToCount(restoreCount);
1259fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        } catch (OutOfMemoryError e) {
1260fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            Log.w(TAG, "Not enough memory for content change anim buffer", e);
1261fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        } finally {
126208837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            if (layerCanvas != null) {
126308837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                                layerCanvas.onPostDraw();
1264fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1265fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (mResizeBuffer != null) {
126608837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                                mResizeBuffer.end(hwRendererCanvas);
1267fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                if (!completed) {
1268fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    mResizeBuffer.destroy();
1269fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    mResizeBuffer = null;
1270fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                }
1271fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1272fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        }
1273fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                    }
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mContentInsets.set(mPendingContentInsets);
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    host.fitSystemWindows(mAttachInfo.mContentInsets);
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Content insets changing to: "
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mContentInsets);
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visibleInsetsChanged) {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets);
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Visible insets changing to: "
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mVisibleInsets);
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!hadSurface) {
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mSurface.isValid()) {
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are creating a new surface, then we need to
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // completely redraw it.  Also, when we get to the
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // point of drawing it we will hold off and schedule
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // a new traversal instead.  This is so we can tell the
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // window manager about all of the windows being displayed
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // before actually drawing them, so it can display then
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // all at once.
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newSurface = true;
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fullRedrawNeeded = true;
129661a6e689188cd8743905e4f7b10440c7e50823f3Jack Palevich                        mPreviousTransparentRegion.setEmpty();
12978506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        if (mAttachInfo.mHardwareRenderer != null) {
1299648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            try {
1300648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                hwInitialized = mAttachInfo.mHardwareRenderer.initialize(mHolder);
1301648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            } catch (Surface.OutOfResourcesException e) {
1302648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Log.e(TAG, "OutOfResourcesException initializing HW surface", e);
1303648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                try {
1304648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    if (!sWindowSession.outOfMemory(mWindow)) {
1305648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                        Slog.w(TAG, "No processes killed for memory; killing self");
1306648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                        Process.killProcess(Process.myPid());
1307648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    }
1308648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                } catch (RemoteException ex) {
1309648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                }
1310648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                mLayoutRequested = true;    // ask wm for a new surface next time.
1311648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                return;
1312648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (!mSurface.isValid()) {
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If the surface has been removed, then reset the scroll
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // positions.
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastScrolledFocus = null;
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mScrollY = mCurScrollY = 0;
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mScroller != null) {
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mScroller.abortAnimation();
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13237d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                    disposeResizeBuffer();
13241d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    // Our surface is gone
13251d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    if (mAttachInfo.mHardwareRenderer != null &&
13261d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                            mAttachInfo.mHardwareRenderer.isEnabled()) {
13271d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                        mAttachInfo.mHardwareRenderer.destroy(true);
13281d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    }
13292a83f001fdb189f945e82e81e717ba204824b112Romain Guy                } else if (surfaceGenerationId != mSurface.getGenerationId() &&
13302a83f001fdb189f945e82e81e717ba204824b112Romain Guy                        mSurfaceHolder == null && mAttachInfo.mHardwareRenderer != null) {
13317d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                    fullRedrawNeeded = true;
1332648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    try {
1333648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        mAttachInfo.mHardwareRenderer.updateSurface(mHolder);
1334648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    } catch (Surface.OutOfResourcesException e) {
1335648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        Log.e(TAG, "OutOfResourcesException updating HW surface", e);
1336648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        try {
1337648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            if (!sWindowSession.outOfMemory(mWindow)) {
1338648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Slog.w(TAG, "No processes killed for memory; killing self");
1339648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Process.killProcess(Process.myPid());
1340648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
1341648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        } catch (RemoteException ex) {
1342648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        }
1343648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        mLayoutRequested = true;    // ask wm for a new surface next time.
1344648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        return;
1345648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    }
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13491d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_ORIENTATION) Log.v(
1351c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    TAG, "Relayout returned: frame=" + frame + ", surface=" + mSurface);
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowLeft = frame.left;
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowTop = frame.top;
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // !!FIXME!! This next section handles the case where we did not get the
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // window size we asked for. We should avoid this by getting a maximum size from
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the window session beforehand.
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWidth = frame.width();
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHeight = frame.height();
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1362dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            if (mSurfaceHolder != null) {
1363dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                // The app owns the surface; tell it about what is going on.
1364dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (mSurface.isValid()) {
1365dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    // XXX .copyFrom() doesn't work!
1366dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    //mSurfaceHolder.mSurface.copyFrom(mSurface);
1367dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.mSurface = mSurface;
1368dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
136930bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown                mSurfaceHolder.setSurfaceFrameSize(mWidth, mHeight);
1370dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mSurfaceHolder.mSurfaceLock.unlock();
1371dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (mSurface.isValid()) {
1372dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (!hadSurface) {
1373dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolder.ungetCallbacks();
1374dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
1375dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mIsCreating = true;
1376dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolderCallback.surfaceCreated(mSurfaceHolder);
1377dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1378dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        if (callbacks != null) {
1379dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            for (SurfaceHolder.Callback c : callbacks) {
1380dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                c.surfaceCreated(mSurfaceHolder);
1381dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            }
1382dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1383dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        surfaceChanged = true;
1384dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1385dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (surfaceChanged) {
1386dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolderCallback.surfaceChanged(mSurfaceHolder,
1387dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                lp.format, mWidth, mHeight);
1388dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1389dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        if (callbacks != null) {
1390dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            for (SurfaceHolder.Callback c : callbacks) {
1391dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                c.surfaceChanged(mSurfaceHolder, lp.format,
1392dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                        mWidth, mHeight);
1393dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            }
1394dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1395dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1396dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mIsCreating = false;
1397dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                } else if (hadSurface) {
1398dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.ungetCallbacks();
1399dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1400dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolderCallback.surfaceDestroyed(mSurfaceHolder);
1401dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (callbacks != null) {
1402dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        for (SurfaceHolder.Callback c : callbacks) {
1403dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            c.surfaceDestroyed(mSurfaceHolder);
1404dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1405dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1406dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.mSurfaceLock.lock();
140793c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    try {
140893c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                        mSurfaceHolder.mSurface = new Surface();
140993c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    } finally {
141093c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                        mSurfaceHolder.mSurfaceLock.unlock();
141193c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    }
1412dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
1413dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            }
141453389bdcdf6ffaaec533b73bc1d0abc5807ec7f6Romain Guy
141540e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase            if (mAttachInfo.mHardwareRenderer != null &&
141640e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    mAttachInfo.mHardwareRenderer.isEnabled()) {
141740e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                if (hwInitialized || windowShouldResize ||
141840e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                        mWidth != mAttachInfo.mHardwareRenderer.getWidth() ||
141940e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                        mHeight != mAttachInfo.mHardwareRenderer.getHeight()) {
142040e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    mAttachInfo.mHardwareRenderer.setup(mWidth, mHeight);
142140e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    if (!hwInitialized) {
142240e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                        mAttachInfo.mHardwareRenderer.invalidate(mHolder);
142340e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    }
14247e1160e8664a9c5c79367f4ba3c2266a39bbcef5Romain Guy                }
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1427ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (!mStopped) {
1428ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                boolean focusChangedDueToTouchMode = ensureTouchModeLocally(
14296d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        (relayoutResult&WindowManagerImpl.RELAYOUT_RES_IN_TOUCH_MODE) != 0);
1430ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                if (focusChangedDueToTouchMode || mWidth != host.getMeasuredWidth()
1431ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        || mHeight != host.getMeasuredHeight() || contentInsetsChanged) {
1432ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width);
1433ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height);
1434ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1435ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (DEBUG_LAYOUT) Log.v(TAG, "Ooops, something changed!  mWidth="
1436ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + mWidth + " measuredWidth=" + host.getMeasuredWidth()
1437ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " mHeight=" + mHeight
1438ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " measuredHeight=" + host.getMeasuredHeight()
1439ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " coveredInsetsChanged=" + contentInsetsChanged);
1440ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1441ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                     // Ask host how big it wants to be
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1443ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1444ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // Implementation of weights from WindowManager.LayoutParams
1445ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // We just grow the dimensions as needed and re-measure if
1446ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // needs be
1447ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    int width = host.getMeasuredWidth();
1448ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    int height = host.getMeasuredHeight();
1449ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    boolean measureAgain = false;
1450ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1451ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (lp.horizontalWeight > 0.0f) {
1452ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        width += (int) ((mWidth - width) * lp.horizontalWeight);
1453ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width,
1454ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                MeasureSpec.EXACTLY);
1455ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        measureAgain = true;
1456ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1457ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (lp.verticalWeight > 0.0f) {
1458ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        height += (int) ((mHeight - height) * lp.verticalWeight);
1459ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height,
1460ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                MeasureSpec.EXACTLY);
1461ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        measureAgain = true;
1462ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1463ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1464ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (measureAgain) {
1465ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        if (DEBUG_LAYOUT) Log.v(TAG,
1466ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                "And hey let's measure once more: width=" + width
1467ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                + " height=" + height);
1468ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1469ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1470ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1471ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    mLayoutRequested = true;
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1476ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        final boolean didLayout = mLayoutRequested && !mStopped;
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean triggerGlobalLayoutListener = didLayout
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || attachInfo.mRecomputeGlobalAttributes;
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (didLayout) {
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutRequested = false;
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrollMayChange = true;
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_ORIENTATION || DEBUG_LAYOUT) Log.v(
1483c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                TAG, "Laying out " + host + " to (" +
1484189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                host.getMeasuredWidth() + ", " + host.getMeasuredHeight() + ")");
148513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            long startTime = 0L;
14865429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy            if (ViewDebug.DEBUG_PROFILE_LAYOUT) {
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                startTime = SystemClock.elapsedRealtime();
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1489189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn            host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
149143a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato            if (false && ViewDebug.consistencyCheckEnabled) {
149213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                if (!host.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_LAYOUT)) {
149313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                    throw new IllegalStateException("The view hierarchy is an inconsistent state,"
149413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                            + "please refer to the logs with the tag "
149513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                            + ViewDebug.CONSISTENCY_LOG_TAG + " for more infomation.");
149613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                }
149713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            }
149813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy
14995429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy            if (ViewDebug.DEBUG_PROFILE_LAYOUT) {
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(60001, SystemClock.elapsedRealtime() - startTime);
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // By this point all views have been sized and positionned
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We can compute the transparent area
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((host.mPrivateFlags & View.REQUEST_TRANSPARENT_REGIONS) != 0) {
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // start out transparent
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // TODO: AVOID THAT CALL BY CACHING THE RESULT?
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.getLocationInWindow(mTmpLocation);
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTransparentRegion.set(mTmpLocation[0], mTmpLocation[1],
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTmpLocation[0] + host.mRight - host.mLeft,
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTmpLocation[1] + host.mBottom - host.mTop);
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.gatherTransparentRegion(mTransparentRegion);
151564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (mTranslator != null) {
151664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateRegionInWindowToScreen(mTransparentRegion);
151764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                }
151864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mTransparentRegion.equals(mPreviousTransparentRegion)) {
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mPreviousTransparentRegion.set(mTransparentRegion);
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // reconfigure window manager
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sWindowSession.setTransparentRegion(mWindow, mTransparentRegion);
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException e) {
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) {
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("======================================");
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("performTraversals -- after setFrame");
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.debug();
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (triggerGlobalLayoutListener) {
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mRecomputeGlobalAttributes = false;
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mTreeObserver.dispatchOnGlobalLayout();
1539eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
1540eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            if (AccessibilityManager.getInstance(host.mContext).isEnabled()) {
1541eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                postSendWindowContentChangedCallback();
1542eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            }
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (computesInternalInsets) {
1546fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Clear the original insets.
1547fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            final ViewTreeObserver.InternalInsetsInfo insets = attachInfo.mGivenInternalInsets;
1548fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            insets.reset();
1549fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1550fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Compute new insets in place.
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mTreeObserver.dispatchOnComputeInternalInsets(insets);
1552fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1553fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Tell the window manager.
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (insetsPending || !mLastGivenInsets.equals(insets)) {
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastGivenInsets.set(insets);
1556fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1557fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                // Translate insets to screen coordinates if needed.
1558fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Rect contentInsets;
1559fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Rect visibleInsets;
1560fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Region touchableRegion;
1561fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                if (mTranslator != null) {
1562fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    contentInsets = mTranslator.getTranslatedContentInsets(insets.contentInsets);
1563fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    visibleInsets = mTranslator.getTranslatedVisibleInsets(insets.visibleInsets);
1564fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    touchableRegion = mTranslator.getTranslatedTouchableArea(insets.touchableRegion);
1565fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                } else {
1566fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    contentInsets = insets.contentInsets;
1567fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    visibleInsets = insets.visibleInsets;
1568fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    touchableRegion = insets.touchableRegion;
1569fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                }
1570fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sWindowSession.setInsets(mWindow, insets.mTouchableInsets,
1573fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                            contentInsets, visibleInsets, touchableRegion);
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15788506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst) {
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // handle first focus request
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: mView.hasFocus()="
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mView.hasFocus());
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView != null) {
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mView.hasFocus()) {
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView.requestFocus(View.FOCUS_FORWARD);
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFocusedView = mRealFocusedView = mView.findFocus();
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: requested focused view="
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mFocusedView);
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRealFocusedView = mView.findFocus();
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: existing focused view="
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mRealFocusedView);
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = false;
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWillDrawSoon = false;
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNewSurfaceNeeded = false;
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewVisibility = viewVisibility;
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mHasWindowFocus) {
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean imTarget = WindowManager.LayoutParams
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .mayUseInputMethod(mWindowAttributes.flags);
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imTarget != mLastWasImTarget) {
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWasImTarget = imTarget;
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InputMethodManager imm = InputMethodManager.peekInstance();
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (imm != null && imTarget) {
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imm.startGettingWindowFocus(mView);
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imm.onWindowFocus(mView, mView.findFocus(),
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mWindowAttributes.softInputMode,
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !mHasHadWindowFocus, mWindowAttributes.flags);
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16168506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1617ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy        boolean cancelDraw = attachInfo.mTreeObserver.dispatchOnPreDraw() ||
1618ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy                viewVisibility != View.VISIBLE;
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
162061158c621d0834d6d4e1e0310596d9b7a1071178Chet Haase        if (!cancelDraw && !newSurface) {
1621d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            if (mPendingTransitions != null && mPendingTransitions.size() > 0) {
1622d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                for (int i = 0; i < mPendingTransitions.size(); ++i) {
1623d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                    mPendingTransitions.get(i).startChangingAnimations();
1624d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                }
1625d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                mPendingTransitions.clear();
1626d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            }
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFullRedrawNeeded = false;
16284e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
16294e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            final long drawStartTime;
16304e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (ViewDebug.DEBUG_LATENCY) {
16314e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                drawStartTime = System.nanoTime();
16324e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
16334e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            draw(fullRedrawNeeded);
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16364e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (ViewDebug.DEBUG_LATENCY) {
16374e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                mLastDrawDurationNanos = System.nanoTime() - drawStartTime;
16384e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
16394e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
16406d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn            if ((relayoutResult&WindowManagerImpl.RELAYOUT_RES_FIRST_TIME) != 0
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    || mReportNextDraw) {
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_LOGV) {
1643c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    Log.v(TAG, "FINISHED DRAWING: " + mWindowAttributes.getTitle());
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReportNextDraw = false;
1646d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                if (mSurfaceHolder != null && mSurface.isValid()) {
1647d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    mSurfaceHolderCallback.surfaceRedrawNeeded(mSurfaceHolder);
1648d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1649d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    if (callbacks != null) {
1650d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        for (SurfaceHolder.Callback c : callbacks) {
1651d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            if (c instanceof SurfaceHolder.Callback2) {
1652d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                                ((SurfaceHolder.Callback2)c).surfaceRedrawNeeded(
1653d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                                        mSurfaceHolder);
1654d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                            }
1655d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                        }
1656d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                    }
1657d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn                }
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sWindowSession.finishDrawing(mWindow);
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1664d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            // End any pending transitions on this non-visible window
1665d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            if (mPendingTransitions != null && mPendingTransitions.size() > 0) {
1666d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                for (int i = 0; i < mPendingTransitions.size(); ++i) {
1667d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                    mPendingTransitions.get(i).endChangingAnimations();
1668d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                }
1669d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                mPendingTransitions.clear();
1670d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            }
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We were supposed to report when we are done drawing. Since we canceled the
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // draw, remember it here.
16736d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn            if ((relayoutResult&WindowManagerImpl.RELAYOUT_RES_FIRST_TIME) != 0) {
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReportNextDraw = true;
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (fullRedrawNeeded) {
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFullRedrawNeeded = true;
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
167961158c621d0834d6d4e1e0310596d9b7a1071178Chet Haase
1680ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy            if (viewVisibility == View.VISIBLE) {
1681ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy                // Try again
1682ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy                scheduleTraversals();
1683ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy            }
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestTransparentRegion(View child) {
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the test below should not fail unless someone is messing with us
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == child) {
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mView.mPrivateFlags |= View.REQUEST_TRANSPARENT_REGIONS;
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Need to make sure we re-evaluate the window attributes next
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // time around, to ensure the window has the correct format.
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = true;
1695f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy            mWindowAttributesChangesFlag = 0;
16961bd80ad7fdf71e437fa650f02366664c27b66b46Mathias Agopian            requestLayout();
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Figures out the measure spec for the root view in a window based on it's
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layout params.
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param windowSize
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            The available width or height of the window
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rootDimension
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            The layout params for one dimension (width or height) of the
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            window.
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The measure spec to use to measure the root view.
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int getRootMeasureSpec(int windowSize, int rootDimension) {
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int measureSpec;
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (rootDimension) {
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1717980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy        case ViewGroup.LayoutParams.MATCH_PARENT:
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window can't resize. Force root view to be windowSize.
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY);
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case ViewGroup.LayoutParams.WRAP_CONTENT:
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window can resize. Set max size for root view.
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST);
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window wants to be an exact size. Force root view to be that size.
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY);
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return measureSpec;
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17330f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    int mHardwareYOffset;
17340f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    int mResizeAlpha;
17350f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    final Paint mResizePaint = new Paint();
17360f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
17377d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    public void onHardwarePreDraw(HardwareCanvas canvas) {
17380f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        canvas.translate(0, -mHardwareYOffset);
17390f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
17400f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
17417d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    public void onHardwarePostDraw(HardwareCanvas canvas) {
17427d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
17430f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            mResizePaint.setAlpha(mResizeAlpha);
17447d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            canvas.drawHardwareLayer(mResizeBuffer, 0.0f, mHardwareYOffset, mResizePaint);
17450f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
17460f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
17470f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
1748ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    /**
1749ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     * @hide
1750ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     */
1751ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    void outputDisplayList(View view) {
1752ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        if (mAttachInfo != null && mAttachInfo.mHardwareCanvas != null) {
1753ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            DisplayList displayList = view.getDisplayList();
1754ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            if (displayList != null) {
175559a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mAttachInfo.mHardwareCanvas.outputDisplayList(displayList);
175659a12cae208790dd202656f50a40a53ef49baeebRomain Guy            }
175759a12cae208790dd202656f50a40a53ef49baeebRomain Guy        }
175859a12cae208790dd202656f50a40a53ef49baeebRomain Guy    }
175959a12cae208790dd202656f50a40a53ef49baeebRomain Guy
176059a12cae208790dd202656f50a40a53ef49baeebRomain Guy    /**
176159a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * @see #PROPERTY_PROFILE_RENDERING
176259a12cae208790dd202656f50a40a53ef49baeebRomain Guy     */
176359a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private void profileRendering(boolean enabled) {
176459a12cae208790dd202656f50a40a53ef49baeebRomain Guy        if (mProfileRendering) {
176559a12cae208790dd202656f50a40a53ef49baeebRomain Guy            mRenderProfilingEnabled = enabled;
176659a12cae208790dd202656f50a40a53ef49baeebRomain Guy            if (mRenderProfiler == null) {
176759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler = new Thread(new Runnable() {
176859a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    @Override
176959a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    public void run() {
177059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        Log.d(TAG, "Starting profiling thread");
177159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        while (mRenderProfilingEnabled) {
177259a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            mAttachInfo.mHandler.post(new Runnable() {
177359a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                @Override
177459a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                public void run() {
177559a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                    mDirty.set(0, 0, mWidth, mHeight);
177659a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                    scheduleTraversals();
177759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                }
177859a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            });
177959a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            try {
178059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                // TODO: This should use vsync when we get an API
178159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                Thread.sleep(15);
178259a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            } catch (InterruptedException e) {
178359a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                Log.d(TAG, "Exiting profiling thread");
178459a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            }
178559a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        }
178659a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    }
178759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                }, "Rendering Profiler");
178859a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler.start();
178959a12cae208790dd202656f50a40a53ef49baeebRomain Guy            } else {
179059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler.interrupt();
179159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler = null;
1792ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
1793ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
1794ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
1795ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
17962f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    /**
17972f2022afa1eb85018368398bd150e9575fc099c9Chet Haase     * Called from draw() when DEBUG_FPS is enabled
17982f2022afa1eb85018368398bd150e9575fc099c9Chet Haase     */
17992f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private void trackFPS() {
18002f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        // Tracks frames per second drawn. First value in a series of draws may be bogus
18012f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        // because it down not account for the intervening idle time
18022f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        long nowTime = System.currentTimeMillis();
18032f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        if (mFpsStartTime < 0) {
18042f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            mFpsStartTime = mFpsPrevTime = nowTime;
18052f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            mFpsNumFrames = 0;
18062f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        } else {
18072f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            ++mFpsNumFrames;
18082f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            String thisHash = Integer.toHexString(System.identityHashCode(this));
18092f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            long frameTime = nowTime - mFpsPrevTime;
18102f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            long totalTime = nowTime - mFpsStartTime;
18112f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            Log.v(TAG, "0x" + thisHash + "\tFrame time:\t" + frameTime);
18122f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            mFpsPrevTime = nowTime;
18132f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            if (totalTime > 1000) {
18142f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                float fps = (float) mFpsNumFrames * 1000 / totalTime;
18152f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                Log.v(TAG, "0x" + thisHash + "\tFPS:\t" + fps);
18162f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                mFpsStartTime = nowTime;
18172f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                mFpsNumFrames = 0;
18182f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            }
18192f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        }
18202f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    }
18212f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void draw(boolean fullRedrawNeeded) {
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface surface = mSurface;
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (surface == null || !surface.isValid()) {
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18282f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        if (DEBUG_FPS) {
18292f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            trackFPS();
18302f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        }
18312f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
18322a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        if (!sFirstDrawComplete) {
18332a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            synchronized (sFirstDrawHandlers) {
18342a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                sFirstDrawComplete = true;
1835812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                final int count = sFirstDrawHandlers.size();
1836812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                for (int i = 0; i< count; i++) {
18372a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                    post(sFirstDrawHandlers.get(i));
18382a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                }
18392a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            }
18402a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        }
184159a12cae208790dd202656f50a40a53ef49baeebRomain Guy
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scrollToRectOrFocus(null, false);
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mViewScrollChanged) {
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mViewScrollChanged = false;
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mTreeObserver.dispatchOnScrollChanged();
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18488506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int yoff;
18500f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        boolean animating = mScroller != null && mScroller.computeScrollOffset();
18510f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        if (animating) {
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            yoff = mScroller.getCurrY();
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            yoff = mScrollY;
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurScrollY != yoff) {
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurScrollY = yoff;
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fullRedrawNeeded = true;
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
186064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        float appScale = mAttachInfo.mApplicationScale;
186164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        boolean scalingRequired = mAttachInfo.mScalingRequired;
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18630f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        int resizeAlpha = 0;
18647d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
18657d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            long deltaTime = SystemClock.uptimeMillis() - mResizeBufferStartTime;
18667d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            if (deltaTime < mResizeBufferDuration) {
18677d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                float amt = deltaTime/(float) mResizeBufferDuration;
18680f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                amt = mResizeInterpolator.getInterpolation(amt);
18690f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                animating = true;
18700f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                resizeAlpha = 255 - (int)(amt*255);
18710f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            } else {
18727d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                disposeResizeBuffer();
18730f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            }
18740f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
18750f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Rect dirty = mDirty;
1877dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        if (mSurfaceHolder != null) {
1878dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // The app owns the surface, we won't draw.
1879dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            dirty.setEmpty();
18800f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            if (animating) {
18810f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                if (mScroller != null) {
18820f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    mScroller.abortAnimation();
18830f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                }
18847d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                disposeResizeBuffer();
18850f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            }
1886dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return;
1887dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
188858ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy
188958ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy        if (fullRedrawNeeded) {
189058ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy            mAttachInfo.mIgnoreDirtyState = true;
1891c3166e15f8898a2ba66fb177efbddb1d0edf6140Romain Guy            dirty.set(0, 0, (int) (mWidth * appScale + 0.5f), (int) (mHeight * appScale + 0.5f));
189258ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy        }
1893ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase
1894b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
1895fd5072606b85948cbe7c026b6d251774a9facb97Romain Guy            if (!dirty.isEmpty() || mIsAnimating) {
1896101e2ae00c478e13f34c81db05a9a921ad637571Romain Guy                mIsAnimating = false;
18970f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                mHardwareYOffset = yoff;
18980f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                mResizeAlpha = resizeAlpha;
18997d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
19007d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                mCurrentDirty.set(dirty);
19017d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                mCurrentDirty.union(mPreviousDirty);
19027d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                mPreviousDirty.set(dirty);
19037d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                dirty.setEmpty();
19047d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy
1905f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy                Rect currentDirty = mCurrentDirty;
1906f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy                if (animating) {
1907f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy                    currentDirty = null;
1908f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy                }
1909f90f8171e6acb56f9f87093c01fd586f2140697aRomain Guy
191050d133e290468fd149b5c03e46549afca2ee05f8Romain Guy                if (mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this, currentDirty)) {
191150d133e290468fd149b5c03e46549afca2ee05f8Romain Guy                    mPreviousDirty.set(0, 0, mWidth, mHeight);
191250d133e290468fd149b5c03e46549afca2ee05f8Romain Guy                }
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1914812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
19150f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            if (animating) {
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFullRedrawNeeded = true;
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduleTraversals();
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1919812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_ORIENTATION || DEBUG_DRAW) {
1924c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            Log.v(TAG, "Draw " + mView + "/"
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mWindowAttributes.getTitle()
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": dirty={" + dirty.left + "," + dirty.top
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + "," + dirty.right + "," + dirty.bottom + "} surface="
19289189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                    + surface + " surface.isValid()=" + surface.isValid() + ", appScale:" +
19299189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                    appScale + ", width=" + mWidth + ", height=" + mHeight);
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1932a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian        if (!dirty.isEmpty() || mIsAnimating) {
1933a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            Canvas canvas;
1934a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            try {
1935a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                int left = dirty.left;
1936a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                int top = dirty.top;
1937a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                int right = dirty.right;
1938a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                int bottom = dirty.bottom;
1939fea12b87f2988f20ea87314c4a1b47e1a0f4d95eRomain Guy
19404e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                final long lockCanvasStartTime;
19414e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                if (ViewDebug.DEBUG_LATENCY) {
19424e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                    lockCanvasStartTime = System.nanoTime();
19434e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                }
19444e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
1945a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                canvas = surface.lockCanvas(dirty);
1946a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian
19474e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                if (ViewDebug.DEBUG_LATENCY) {
19484e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                    long now = System.nanoTime();
19494e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                    Log.d(TAG, "Latency: Spent "
19504e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                            + ((now - lockCanvasStartTime) * 0.000001f)
19514e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                            + "ms waiting for surface.lockCanvas()");
19524e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                }
19534e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
1954a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                if (left != dirty.left || top != dirty.top || right != dirty.right ||
1955a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        bottom != dirty.bottom) {
1956a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    mAttachInfo.mIgnoreDirtyState = true;
1957a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                }
1958a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian
1959a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                // TODO: Do this in native
1960a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                canvas.setDensity(mDensity);
1961a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            } catch (Surface.OutOfResourcesException e) {
1962c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                Log.e(TAG, "OutOfResourcesException locking surface", e);
1963648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                try {
1964648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    if (!sWindowSession.outOfMemory(mWindow)) {
1965648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        Slog.w(TAG, "No processes killed for memory; killing self");
1966648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        Process.killProcess(Process.myPid());
1967648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    }
1968648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                } catch (RemoteException ex) {
1969648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                }
197083a6f450bde23e1bfd07ee1c218dab35053dec76Dianne Hackborn                mLayoutRequested = true;    // ask wm for a new surface next time.
1971a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                return;
1972a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            } catch (IllegalArgumentException e) {
1973c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                Log.e(TAG, "IllegalArgumentException locking surface", e);
1974db773c557226e8008a1fff7596321a69289c80baDianne Hackborn                // Don't assume this is due to out of memory, it could be
1975db773c557226e8008a1fff7596321a69289c80baDianne Hackborn                // something else, and if it is something else then we could
1976db773c557226e8008a1fff7596321a69289c80baDianne Hackborn                // kill stuff (or ourself) for no reason.
197783a6f450bde23e1bfd07ee1c218dab35053dec76Dianne Hackborn                mLayoutRequested = true;    // ask wm for a new surface next time.
1978a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                return;
19795bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy            }
19805bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy
1981a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            try {
1982a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                if (!dirty.isEmpty() || mIsAnimating) {
1983a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    long startTime = 0L;
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1985a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    if (DEBUG_ORIENTATION || DEBUG_DRAW) {
1986c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                        Log.v(TAG, "Surface " + surface + " drawing to bitmap w="
1987a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                + canvas.getWidth() + ", h=" + canvas.getHeight());
1988a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        //canvas.drawARGB(255, 255, 0, 0);
1989a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19915429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy                    if (ViewDebug.DEBUG_PROFILE_DRAWING) {
1992a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        startTime = SystemClock.elapsedRealtime();
1993a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1995a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // If this bitmap's format includes an alpha channel, we
1996a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // need to clear it before drawing so that the child will
1997a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // properly re-composite its drawing on a transparent
1998a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // background. This automatically respects the clip/dirty region
1999a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // or
2000a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // If we are applying an offset, we need to clear the area
2001a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // where the offset doesn't appear to avoid having garbage
2002a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // left in the blank areas.
2003a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    if (!canvas.isOpaque() || yoff != 0) {
2004a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        canvas.drawColor(0, PorterDuff.Mode.CLEAR);
2005a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2007a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    dirty.setEmpty();
2008a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    mIsAnimating = false;
2009a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    mAttachInfo.mDrawingTime = SystemClock.uptimeMillis();
2010a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    mView.mPrivateFlags |= View.DRAWN;
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2012a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    if (DEBUG_DRAW) {
2013a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        Context cxt = mView.getContext();
2014a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        Log.i(TAG, "Drawing: package:" + cxt.getPackageName() +
2015a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                ", metrics=" + cxt.getResources().getDisplayMetrics() +
2016a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                ", compatibilityInfo=" + cxt.getResources().getCompatibilityInfo());
2017a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
2018a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    try {
2019a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        canvas.translate(0, -yoff);
2020a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        if (mTranslator != null) {
2021a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                            mTranslator.translateCanvas(canvas);
2022a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        }
2023a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        canvas.setScreenDensity(scalingRequired
2024a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                ? DisplayMetrics.DENSITY_DEVICE : 0);
202502ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy                        mAttachInfo.mSetIgnoreDirtyState = false;
2026a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        mView.draw(canvas);
2027a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    } finally {
202802ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy                        if (!mAttachInfo.mSetIgnoreDirtyState) {
2029ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                            // Only clear the flag if it was not set during the mView.draw() call
2030ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                            mAttachInfo.mIgnoreDirtyState = false;
2031ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                        }
2032a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
20338169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
203443a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato                    if (false && ViewDebug.consistencyCheckEnabled) {
2035a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        mView.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_DRAWING);
20368169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                    }
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20385429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy                    if (ViewDebug.DEBUG_PROFILE_DRAWING) {
2039a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        EventLog.writeEvent(60000, SystemClock.elapsedRealtime() - startTime);
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2043a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian            } finally {
2044a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                surface.unlockCanvasAndPost(canvas);
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_LOGV) {
2049c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            Log.v(TAG, "Surface " + surface + " unlockCanvasAndPost");
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20518506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
20520f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        if (animating) {
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFullRedrawNeeded = true;
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean scrollToRectOrFocus(Rect rectangle, boolean immediate) {
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View.AttachInfo attachInfo = mAttachInfo;
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect ci = attachInfo.mContentInsets;
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect vi = attachInfo.mVisibleInsets;
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int scrollY = 0;
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean handled = false;
20648506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (vi.left > ci.left || vi.top > ci.top
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || vi.right > ci.right || vi.bottom > ci.bottom) {
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We'll assume that we aren't going to change the scroll
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // offset, since we want to avoid that unless it is actually
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // going to make the focus visible...  otherwise we scroll
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // all over the place.
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrollY = mScrollY;
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We can be called for two different situations: during a draw,
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // to update the scroll position if the focus has changed (in which
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // case 'rectangle' is null), or in response to a
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // requestChildRectangleOnScreen() call (in which case 'rectangle'
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // is non-null and we just want to scroll to whatever that
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // rectangle is).
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View focus = mRealFocusedView;
2079e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy
2080e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            // When in touch mode, focus points to the previously focused view,
2081e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            // which may have been removed from the view hierarchy. The following
2082b71193bffc1d2ec60efd987300e2e85e678aa6f0Joe Onorato            // line checks whether the view is still in our hierarchy.
2083b71193bffc1d2ec60efd987300e2e85e678aa6f0Joe Onorato            if (focus == null || focus.mAttachInfo != mAttachInfo) {
2084e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy                mRealFocusedView = null;
2085e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy                return false;
2086e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            }
2087e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focus != mLastScrolledFocus) {
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If the focus has changed, then ignore any requests to scroll
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to a rectangle; first we want to make sure the entire focus
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // view is visible.
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rectangle = null;
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Eval scroll: focus=" + focus
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " rectangle=" + rectangle + " ci=" + ci
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " vi=" + vi);
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focus == mLastScrolledFocus && !mScrollMayChange
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && rectangle == null) {
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Optimization: if the focus hasn't changed since last
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // time, and no layout has happened, then just leave things
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // as they are.
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Keeping scroll y="
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + mScrollY + " vi=" + vi.toShortString());
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (focus != null) {
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We need to determine if the currently focused view is
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // within the visible part of the window and, if not, apply
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // a pan so it can be seen.
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastScrolledFocus = focus;
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScrollMayChange = false;
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Need to scroll?");
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Try to find the rectangle from the focus view.
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (focus.getGlobalVisibleRect(mVisRect, null)) {
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Root w="
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mView.getWidth() + " h=" + mView.getHeight()
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " ci=" + ci.toShortString()
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " vi=" + vi.toShortString());
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (rectangle == null) {
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        focus.getFocusedRect(mTempRect);
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Focus " + focus
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": focusRect=" + mTempRect.toShortString());
21211c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                        if (mView instanceof ViewGroup) {
21221c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                            ((ViewGroup) mView).offsetDescendantRectToMyCoords(
21231c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                                    focus, mTempRect);
21241c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                        }
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Focus in window: focusRect="
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString()
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visRect=" + mVisRect.toShortString());
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTempRect.set(rectangle);
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Request scroll to rect: "
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString()
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visRect=" + mVisRect.toShortString());
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mTempRect.intersect(mVisRect)) {
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Focus window visible rect: "
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString());
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mTempRect.height() >
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                (mView.getHeight()-vi.top-vi.bottom)) {
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If the focus simply is not going to fit, then
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // best is probably just to leave things as-is.
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Too tall; leaving scrollY=" + scrollY);
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if ((mTempRect.top-scrollY) < vi.top) {
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            scrollY -= vi.top - (mTempRect.top-scrollY);
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Top covered; scrollY=" + scrollY);
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if ((mTempRect.bottom-scrollY)
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                > (mView.getHeight()-vi.bottom)) {
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            scrollY += (mTempRect.bottom-scrollY)
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    - (mView.getHeight()-vi.bottom);
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Bottom covered; scrollY=" + scrollY);
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        handled = true;
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21628506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scrollY != mScrollY) {
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Pan scroll changed: old="
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mScrollY + " , new=" + scrollY);
21667d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            if (!immediate && mResizeBuffer == null) {
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mScroller == null) {
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mScroller = new Scroller(mView.getContext());
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScroller.startScroll(0, mScrollY, 0, scrollY-mScrollY);
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (mScroller != null) {
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScroller.abortAnimation();
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrollY = scrollY;
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21768506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return handled;
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21798506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestChildFocus(View child, View focused) {
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFocusedView != focused) {
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(mFocusedView, focused);
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFocusedView = mRealFocusedView = focused;
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Request child focus: focus now "
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + mFocusedView);
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearChildFocus(View child) {
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View oldFocus = mFocusedView;
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Clearing child focus");
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFocusedView = mRealFocusedView = null;
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null && !mView.hasFocus()) {
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If a view gets the focus, the listener will be invoked from requestChildFocus()
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mView.requestFocus(View.FOCUS_FORWARD)) {
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(oldFocus, null);
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (oldFocus != null) {
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(oldFocus, null);
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void focusableViewAvailable(View v) {
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22121c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy        if (mView != null) {
22131c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            if (!mView.hasFocus()) {
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                v.requestFocus();
22151c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            } else {
22161c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // the one case where will transfer focus away from the current one
22171c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // is if the current view is a view group that prefers to give focus
22181c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // to its children first AND the view is a descendant of it.
22191c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                mFocusedView = mView.findFocus();
22201c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                boolean descendantsHaveDibsOnFocus =
22211c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                        (mFocusedView instanceof ViewGroup) &&
22221c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                            (((ViewGroup) mFocusedView).getDescendantFocusability() ==
22231c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                                    ViewGroup.FOCUS_AFTER_DESCENDANTS);
22241c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                if (descendantsHaveDibsOnFocus && isViewDescendantOf(v, mFocusedView)) {
22251c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                    // If a view gets the focus, the listener will be invoked from requestChildFocus()
22261c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                    v.requestFocus();
22271c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                }
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void recomputeViewAttributes(View child) {
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == child) {
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mRecomputeGlobalAttributes = true;
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mWillDrawSoon) {
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduleTraversals();
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchDetachedFromWindow() {
224390fc03bc493fc2c984599b198b9d50bc387134f2Romain Guy        if (mView != null && mView.mAttachInfo != null) {
224416260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            if (mAttachInfo.mHardwareRenderer != null &&
224516260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy                    mAttachInfo.mHardwareRenderer.isEnabled()) {
224616260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy                mAttachInfo.mHardwareRenderer.validate();
224716260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            }
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mView.dispatchDetachedFromWindow();
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityInteractionConnectionManager.ensureNoConnection();
22528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager.removeAccessibilityStateChangeListener(
22538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAccessibilityInteractionConnectionManager);
2254eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        removeSendWindowContentChangedCallback();
22558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView = null;
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mRootView = null;
22585583dc630f861dd9a3006390db227f9296007e00Mathias Agopian        mAttachInfo.mSurface = null;
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
226029d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy        destroyHardwareRenderer();
22614caa4ed120a86e855d4d3b6b455c6fb9ca22e365Romain Guy
22620586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        mSurface.release();
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2264cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (mInputQueueCallback != null && mInputQueue != null) {
2265cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mInputQueueCallback.onInputQueueDestroyed(mInputQueue);
2266cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mInputQueueCallback = null;
2267cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mInputQueue = null;
2268cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        } else if (mInputChannel != null) {
2269cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            InputQueue.unregisterInputChannel(mInputChannel);
227046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sWindowSession.remove(mWindow);
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2275349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
227600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // Dispose the input channel after removing the window so the Window Manager
227700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // doesn't interpret the input channel being closed as an abnormal termination.
227800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (mInputChannel != null) {
227900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputChannel.dispose();
228000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputChannel = null;
2281349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        }
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22838506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2284694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    void updateConfiguration(Configuration config, boolean force) {
2285694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        if (DEBUG_CONFIGURATION) Log.v(TAG,
2286694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                "Applying new config to window "
2287694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                + mWindowAttributes.getTitle()
2288694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                + ": " + config);
22895fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
22905fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatibilityInfo ci = mCompatibilityInfo.getIfNeeded();
22915fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (ci != null) {
22925fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            config = new Configuration(config);
22935fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            ci.applyToConfiguration(config);
22945fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
22955fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
2296694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        synchronized (sConfigCallbacks) {
2297694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            for (int i=sConfigCallbacks.size()-1; i>=0; i--) {
2298694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                sConfigCallbacks.get(i).onConfigurationChanged(config);
2299694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            }
2300694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        }
2301694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        if (mView != null) {
2302694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // At this point the resources have been updated to
2303694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // have the most recent config, whatever that is.  Use
2304694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // the on in them which may be newer.
23051c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            config = mView.getResources().getConfiguration();
2306694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            if (force || mLastConfiguration.diff(config) != 0) {
2307694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mLastConfiguration.setTo(config);
2308694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mView.dispatchConfigurationChanged(config);
2309694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            }
2310694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        }
2311694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    }
2312694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return true if child is an ancestor of parent, (or equal to the parent).
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean isViewDescendantOf(View child, View parent) {
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (child == parent) {
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ViewParent theParent = child.getParent();
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (theParent instanceof ViewGroup) && isViewDescendantOf((View) theParent, parent);
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2325cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy    private static void forceLayout(View view) {
2326cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        view.forceLayout();
2327cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        if (view instanceof ViewGroup) {
2328cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            ViewGroup group = (ViewGroup) view;
2329cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            final int count = group.getChildCount();
2330cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            for (int i = 0; i < count; i++) {
2331cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                forceLayout(group.getChildAt(i));
2332cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            }
2333cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        }
2334cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy    }
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DO_TRAVERSAL = 1000;
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DIE = 1001;
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int RESIZED = 1002;
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int RESIZED_REPORT = 1003;
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int WINDOW_FOCUS_CHANGED = 1004;
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_KEY = 1005;
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_POINTER = 1006;
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_TRACKBALL = 1007;
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_APP_VISIBILITY = 1008;
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_GET_NEW_SURFACE = 1009;
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int FINISHED_EVENT = 1010;
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int DISPATCH_KEY_FROM_IME = 1011;
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int FINISH_INPUT_CONNECTION = 1012;
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int CHECK_FOCUS = 1013;
2350ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    public final static int CLOSE_SYSTEM_DIALOGS = 1014;
2351a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    public final static int DISPATCH_DRAG_EVENT = 1015;
235291e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate    public final static int DISPATCH_DRAG_LOCATION_EVENT = 1016;
2353664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    public final static int DISPATCH_SYSTEM_UI_VISIBILITY = 1017;
235410f4126a367071a49f208f10ceb1ed0e1151d48cJoe Onorato    public final static int DISPATCH_GENERIC_MOTION = 1018;
23555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public final static int UPDATE_CONFIGURATION = 1019;
2356f741e679c496f7345304a6543f01d7048e31d1a7Dianne Hackborn    public final static int DO_PERFORM_ACCESSIBILITY_ACTION = 1020;
2357f741e679c496f7345304a6543f01d7048e31d1a7Dianne Hackborn    public final static int DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID = 1021;
2358f741e679c496f7345304a6543f01d7048e31d1a7Dianne Hackborn    public final static int DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID = 1022;
2359f741e679c496f7345304a6543f01d7048e31d1a7Dianne Hackborn    public final static int DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT = 1023;
23601f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    public final static int PROCESS_INPUT_EVENTS = 1024;
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2363f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy    public String getMessageName(Message message) {
2364f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy        switch (message.what) {
2365f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DO_TRAVERSAL:
2366f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DO_TRAVERSAL";
2367f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DIE:
2368f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DIE";
2369f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case RESIZED:
2370f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "RESIZED";
2371f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case RESIZED_REPORT:
2372f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "RESIZED_REPORT";
2373f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case WINDOW_FOCUS_CHANGED:
2374f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "WINDOW_FOCUS_CHANGED";
2375f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_KEY:
2376f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_KEY";
2377f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_POINTER:
2378f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_POINTER";
2379f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_TRACKBALL:
2380f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_TRACKBALL";
2381f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_APP_VISIBILITY:
2382f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_APP_VISIBILITY";
2383f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_GET_NEW_SURFACE:
2384f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_GET_NEW_SURFACE";
2385f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case FINISHED_EVENT:
2386f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "FINISHED_EVENT";
2387f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_KEY_FROM_IME:
2388f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_KEY_FROM_IME";
2389f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case FINISH_INPUT_CONNECTION:
2390f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "FINISH_INPUT_CONNECTION";
2391f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case CHECK_FOCUS:
2392f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "CHECK_FOCUS";
2393f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case CLOSE_SYSTEM_DIALOGS:
2394f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "CLOSE_SYSTEM_DIALOGS";
2395f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_DRAG_EVENT:
2396f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_DRAG_EVENT";
2397f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_DRAG_LOCATION_EVENT:
2398f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_DRAG_LOCATION_EVENT";
2399f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_SYSTEM_UI_VISIBILITY:
2400f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_SYSTEM_UI_VISIBILITY";
2401f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DISPATCH_GENERIC_MOTION:
2402f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DISPATCH_GENERIC_MOTION";
2403f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case UPDATE_CONFIGURATION:
2404f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "UPDATE_CONFIGURATION";
2405f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DO_PERFORM_ACCESSIBILITY_ACTION:
2406f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DO_PERFORM_ACCESSIBILITY_ACTION";
2407f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID:
2408f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID";
2409f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID:
2410f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID";
2411f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy            case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT:
2412f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy                return "DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT";
24131f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            case PROCESS_INPUT_EVENTS:
24141f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                return "PROCESS_INPUT_EVENTS";
24151f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
2416f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy        }
2417f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy        return super.getMessageName(message);
2418f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy    }
2419f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy
2420f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy    @Override
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void handleMessage(Message msg) {
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (msg.what) {
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case View.AttachInfo.INVALIDATE_MSG:
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ((View) msg.obj).invalidate();
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case View.AttachInfo.INVALIDATE_RECT_MSG:
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View.AttachInfo.InvalidateInfo info = (View.AttachInfo.InvalidateInfo) msg.obj;
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info.target.invalidate(info.left, info.top, info.right, info.bottom);
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info.release();
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DO_TRAVERSAL:
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mProfile) {
2433c6cc0f8c19d9eccf408a443fa2bf668af261dcd0Joe Onorato                Debug.startMethodTracing("ViewAncestor");
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24364e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            final long traversalStartTime;
24374e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (ViewDebug.DEBUG_LATENCY) {
24384e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                traversalStartTime = System.nanoTime();
24394e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                mLastDrawDurationNanos = 0;
24404e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
24414e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performTraversals();
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24444e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (ViewDebug.DEBUG_LATENCY) {
24454e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                long now = System.nanoTime();
24464e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                Log.d(TAG, "Latency: Spent "
24474e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + ((now - traversalStartTime) * 0.000001f)
24484e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + "ms in performTraversals(), with "
24494e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + (mLastDrawDurationNanos * 0.000001f)
24504e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                        + "ms of that time in draw()");
24514e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                mLastTraversalFinishedTimeNanos = now;
24524e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
24534e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mProfile) {
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Debug.stopMethodTracing();
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProfile = false;
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case FINISHED_EVENT:
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handleFinishedEvent(msg.arg1, msg.arg2 != 0);
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DISPATCH_KEY:
246392ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown            deliverKeyEvent((KeyEvent)msg.obj, msg.arg1 != 0);
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
24653915bb845b032dc184dba5e60970b803390ca3edJeff Brown        case DISPATCH_POINTER:
24663915bb845b032dc184dba5e60970b803390ca3edJeff Brown            deliverPointerEvent((MotionEvent) msg.obj, msg.arg1 != 0);
24673915bb845b032dc184dba5e60970b803390ca3edJeff Brown            break;
24683915bb845b032dc184dba5e60970b803390ca3edJeff Brown        case DISPATCH_TRACKBALL:
24693915bb845b032dc184dba5e60970b803390ca3edJeff Brown            deliverTrackballEvent((MotionEvent) msg.obj, msg.arg1 != 0);
24703915bb845b032dc184dba5e60970b803390ca3edJeff Brown            break;
2471cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        case DISPATCH_GENERIC_MOTION:
2472cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            deliverGenericMotionEvent((MotionEvent) msg.obj, msg.arg1 != 0);
2473cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            break;
24741f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        case PROCESS_INPUT_EVENTS:
24751f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            processInputEvents(false);
24761f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            break;
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DISPATCH_APP_VISIBILITY:
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handleAppVisibility(msg.arg1 != 0);
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DISPATCH_GET_NEW_SURFACE:
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handleGetNewSurface();
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case RESIZED:
2484e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            ResizedInfo ri = (ResizedInfo)msg.obj;
248564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mWinFrame.width() == msg.arg1 && mWinFrame.height() == msg.arg2
2487e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                    && mPendingContentInsets.equals(ri.coveredInsets)
2488d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn                    && mPendingVisibleInsets.equals(ri.visibleInsets)
2489d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn                    && ((ResizedInfo)msg.obj).newConfig == null) {
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // fall through...
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case RESIZED_REPORT:
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAdded) {
2495e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                Configuration config = ((ResizedInfo)msg.obj).newConfig;
2496e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                if (config != null) {
2497694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    updateConfiguration(config, false);
2498e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                }
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWinFrame.left = 0;
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWinFrame.right = msg.arg1;
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWinFrame.top = 0;
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWinFrame.bottom = msg.arg2;
2503e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                mPendingContentInsets.set(((ResizedInfo)msg.obj).coveredInsets);
2504e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn                mPendingVisibleInsets.set(((ResizedInfo)msg.obj).visibleInsets);
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (msg.what == RESIZED_REPORT) {
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mReportNextDraw = true;
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2508cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy
2509cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                if (mView != null) {
2510cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                    forceLayout(mView);
2511cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                }
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout();
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case WINDOW_FOCUS_CHANGED: {
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAdded) {
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean hasWindowFocus = msg.arg1 != 0;
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mHasWindowFocus = hasWindowFocus;
251959a12cae208790dd202656f50a40a53ef49baeebRomain Guy
252059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                profileRendering(hasWindowFocus);
252159a12cae208790dd202656f50a40a53ef49baeebRomain Guy
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (hasWindowFocus) {
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean inTouchMode = msg.arg2 != 0;
25242d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy                    ensureTouchModeLocally(inTouchMode);
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2526c361da845a205ac35e724c0ca436744d483de7aaRomain Guy                    if (mAttachInfo.mHardwareRenderer != null &&
2527c361da845a205ac35e724c0ca436744d483de7aaRomain Guy                            mSurface != null && mSurface.isValid()) {
25287d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy                        mFullRedrawNeeded = true;
2529648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        try {
2530648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            mAttachInfo.mHardwareRenderer.initializeIfNeeded(mWidth, mHeight,
2531648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    mAttachInfo, mHolder);
2532648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        } catch (Surface.OutOfResourcesException e) {
2533648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            Log.e(TAG, "OutOfResourcesException locking surface", e);
2534648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            try {
2535648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                if (!sWindowSession.outOfMemory(mWindow)) {
2536648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    Slog.w(TAG, "No processes killed for memory; killing self");
2537648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    Process.killProcess(Process.myPid());
2538648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                }
2539648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            } catch (RemoteException ex) {
2540648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
2541648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            // Retry in a bit.
2542648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            sendMessageDelayed(obtainMessage(msg.what, msg.arg1, msg.arg2), 500);
2543648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            return;
2544648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        }
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25478506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWasImTarget = WindowManager.LayoutParams
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .mayUseInputMethod(mWindowAttributes.flags);
25508506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InputMethodManager imm = InputMethodManager.peekInstance();
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mView != null) {
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (hasWindowFocus && imm != null && mLastWasImTarget) {
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        imm.startGettingWindowFocus(mView);
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
255683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    mAttachInfo.mKeyDispatchState.reset();
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView.dispatchWindowFocusChanged(hasWindowFocus);
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
255975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Note: must be done after the focus change callbacks,
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // so all of the view state is set up correctly.
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (hasWindowFocus) {
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (imm != null && mLastWasImTarget) {
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        imm.onWindowFocus(mView, mView.findFocus(),
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mWindowAttributes.softInputMode,
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                !mHasHadWindowFocus, mWindowAttributes.flags);
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Clear the forward bit.  We can just do this directly, since
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // the window manager doesn't care about it.
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWindowAttributes.softInputMode &=
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ((WindowManager.LayoutParams)mView.getLayoutParams())
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .softInputMode &=
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHasHadWindowFocus = true;
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
257775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
257875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                if (hasWindowFocus && mView != null) {
257975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                    sendAccessibilityEvents();
258075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                }
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case DIE:
258494d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn            doDie();
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2586105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        case DISPATCH_KEY_FROM_IME: {
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_LOGV) Log.v(
2588c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                TAG, "Dispatching key "
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + msg.obj + " from IME to " + mView);
2590105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            KeyEvent event = (KeyEvent)msg.obj;
2591105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if ((event.getFlags()&KeyEvent.FLAG_FROM_SYSTEM) != 0) {
2592105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                // The IME is trying to say this event is from the
2593105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                // system!  Bad bad bad!
25941c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                //noinspection UnusedAssignment
2595812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                event = KeyEvent.changeFlags(event, event.getFlags() & ~KeyEvent.FLAG_FROM_SYSTEM);
2596105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
25973915bb845b032dc184dba5e60970b803390ca3edJeff Brown            deliverKeyEventPostIme((KeyEvent)msg.obj, false);
2598105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        } break;
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case FINISH_INPUT_CONNECTION: {
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputMethodManager imm = InputMethodManager.peekInstance();
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imm != null) {
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imm.reportFinishInputConnection((InputConnection)msg.obj);
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case CHECK_FOCUS: {
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputMethodManager imm = InputMethodManager.peekInstance();
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imm != null) {
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imm.checkFocus();
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2611ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        case CLOSE_SYSTEM_DIALOGS: {
2612ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            if (mView != null) {
2613ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                mView.onCloseSystemDialogs((String)msg.obj);
2614ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            }
2615ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        } break;
261691e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        case DISPATCH_DRAG_EVENT:
261791e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        case DISPATCH_DRAG_LOCATION_EVENT: {
26187fb8b565f9cd2ec6a63ff4d8a89f98f68a1a138cChristopher Tate            DragEvent event = (DragEvent)msg.obj;
26197fb8b565f9cd2ec6a63ff4d8a89f98f68a1a138cChristopher Tate            event.mLocalState = mLocalDragState;    // only present when this app called startDrag()
26207fb8b565f9cd2ec6a63ff4d8a89f98f68a1a138cChristopher Tate            handleDragEvent(event);
2621a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        } break;
2622664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        case DISPATCH_SYSTEM_UI_VISIBILITY: {
26239a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            handleDispatchSystemUiVisibilityChanged((SystemUiVisibilityInfo)msg.obj);
2624664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        } break;
26255fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        case UPDATE_CONFIGURATION: {
26265fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            Configuration config = (Configuration)msg.obj;
26275fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            if (config.isOtherSeqNewer(mLastConfiguration)) {
26285fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                config = mLastConfiguration;
26295fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            }
26305fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            updateConfiguration(config, false);
26315fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        } break;
26328643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID: {
2633601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mView != null) {
2634601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
2635601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .findAccessibilityNodeInfoByAccessibilityIdUiThread(msg);
2636601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
26378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        } break;
26388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        case DO_PERFORM_ACCESSIBILITY_ACTION: {
2639601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mView != null) {
2640601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
2641601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .perfromAccessibilityActionUiThread(msg);
2642601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
26438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        } break;
26448643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID: {
2645601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mView != null) {
2646601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
2647601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .findAccessibilityNodeInfoByViewIdUiThread(msg);
2648601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
26498643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        } break;
26508643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT: {
2651601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            if (mView != null) {
2652601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                getAccessibilityInteractionController()
2653601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .findAccessibilityNodeInfosByViewTextUiThread(msg);
2654601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
26558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        } break;
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
26591c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy    private void startInputEvent(InputQueue.FinishedCallback finishedCallback) {
266093ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        if (mFinishedCallback != null) {
266193ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown            Slog.w(TAG, "Received a new input event from the input queue but there is "
266293ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown                    + "already an unfinished input event in progress.");
266393ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        }
266493ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown
26654e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
26664e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventReceiveTimeNanos = System.nanoTime();
26674e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverTimeNanos = 0;
26684e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverPostImeTimeNanos = 0;
26694e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
26704e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
267193ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        mFinishedCallback = finishedCallback;
267293ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown    }
267393ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown
26744e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    private void finishInputEvent(InputEvent event, boolean handled) {
267593ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        if (LOCAL_LOGV) Log.v(TAG, "Telling window manager input event is finished");
267692ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown
26774e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (mFinishedCallback == null) {
267893ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown            Slog.w(TAG, "Attempted to tell the input queue that the current input event "
267993ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown                    + "is finished but there is no input event actually in progress.");
26804e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            return;
26814e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
26824e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
26834e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
26844e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            final long now = System.nanoTime();
26854e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            final long eventTime = event.getEventTimeNano();
26864e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            final StringBuilder msg = new StringBuilder();
26874e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append("Latency: Spent ");
26884e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append((now - mInputEventReceiveTimeNanos) * 0.000001f);
26894e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append("ms processing ");
26904e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (event instanceof KeyEvent) {
26914e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                final KeyEvent  keyEvent = (KeyEvent)event;
26924e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append("key event, action=");
26934e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append(KeyEvent.actionToString(keyEvent.getAction()));
26944e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            } else {
26954e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                final MotionEvent motionEvent = (MotionEvent)event;
26964e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append("motion event, action=");
26974e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append(MotionEvent.actionToString(motionEvent.getAction()));
26984e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append(", historySize=");
26994e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append(motionEvent.getHistorySize());
27004e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
27014e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append(", handled=");
27024e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append(handled);
27034e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append(", received at +");
27044e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append((mInputEventReceiveTimeNanos - eventTime) * 0.000001f);
27054e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (mInputEventDeliverTimeNanos != 0) {
27064e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append("ms, delivered at +");
27074e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append((mInputEventDeliverTimeNanos - eventTime) * 0.000001f);
27084e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
27094e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            if (mInputEventDeliverPostImeTimeNanos != 0) {
27104e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append("ms, delivered post IME at +");
27114e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                msg.append((mInputEventDeliverPostImeTimeNanos - eventTime) * 0.000001f);
27124e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            }
27134e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append("ms, finished at +");
27144e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append((now - eventTime) * 0.000001f);
27154e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            msg.append("ms.");
27164e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            Log.d(TAG, msg.toString());
271746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
27184e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
27194e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        mFinishedCallback.finished(handled);
27204e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        mFinishedCallback = null;
272146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
272246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Something in the current window tells us we need to change the touch mode.  For
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * example, we are not in touch mode, and the user touches the screen.
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the touch mode has changed, tell the window manager, and handle it locally.
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inTouchMode Whether we want to be in touch mode.
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the touch mode changed and focus changed was changed as a result
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean ensureTouchMode(boolean inTouchMode) {
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) Log.d("touchmode", "ensureTouchMode(" + inTouchMode + "), current "
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "touch mode is " + mAttachInfo.mInTouchMode);
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mInTouchMode == inTouchMode) return false;
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // tell the window manager
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sWindowSession.setInTouchMode(inTouchMode);
27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(e);
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // handle the change
27452d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy        return ensureTouchModeLocally(inTouchMode);
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Ensure that the touch mode for this window is set, and if it is changing,
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * take the appropriate action.
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inTouchMode Whether we want to be in touch mode.
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the touch mode changed and focus changed was changed as a result
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27542d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy    private boolean ensureTouchModeLocally(boolean inTouchMode) {
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) Log.d("touchmode", "ensureTouchModeLocally(" + inTouchMode + "), current "
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "touch mode is " + mAttachInfo.mInTouchMode);
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mInTouchMode == inTouchMode) return false;
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mInTouchMode = inTouchMode;
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mTreeObserver.dispatchOnTouchModeChanged(inTouchMode);
27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27632d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy        return (inTouchMode) ? enterTouchMode() : leaveTouchMode();
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean enterTouchMode() {
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null) {
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView.hasFocus()) {
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // note: not relying on mFocusedView here because this could
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // be when the window is first being added, and mFocused isn't
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // set yet.
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final View focused = mView.findFocus();
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (focused != null && !focused.isFocusableInTouchMode()) {
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ViewGroup ancestorToTakeFocus =
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            findAncestorToTakeFocusInTouchMode(focused);
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ancestorToTakeFocus != null) {
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // there is an ancestor that wants focus after its descendants that
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // is focusable in touch mode.. give it focus
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return ancestorToTakeFocus.requestFocus();
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // nothing appropriate to have focus in touch mode, clear it out
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mView.unFocus();
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(focused, null);
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFocusedView = null;
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return true;
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Find an ancestor of focused that wants focus after its descendants and is
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focusable in touch mode.
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param focused The currently focused view.
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return An appropriate view, or null if no such view exists.
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ViewGroup findAncestorToTakeFocusInTouchMode(View focused) {
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewParent parent = focused.getParent();
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (parent instanceof ViewGroup) {
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ViewGroup vgParent = (ViewGroup) parent;
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (vgParent.getDescendantFocusability() == ViewGroup.FOCUS_AFTER_DESCENDANTS
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && vgParent.isFocusableInTouchMode()) {
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return vgParent;
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (vgParent.isRootNamespace()) {
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parent = vgParent.getParent();
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean leaveTouchMode() {
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null) {
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView.hasFocus()) {
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // i learned the hard way to not trust mFocusedView :)
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedView = mView.findFocus();
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!(mFocusedView instanceof ViewGroup)) {
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // some view has focus, let it keep it
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (((ViewGroup)mFocusedView).getDescendantFocusability() !=
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ViewGroup.FOCUS_AFTER_DESCENDANTS) {
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // some view group has focus, and doesn't prefer its children
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // over itself for focus, so let them keep it.
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // find the best view to give focus to in this brave new non-touch-mode
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // world
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View focused = focusSearch(null, View.FOCUS_DOWN);
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focused != null) {
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return focused.requestFocus(View.FOCUS_DOWN);
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28443915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private void deliverPointerEvent(MotionEvent event, boolean sendDone) {
28454e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
28464e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverTimeNanos = System.nanoTime();
28474e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
28484e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
28497564d62a773857b2f46405d22f296edb3530d88eJeff Brown        final boolean isTouchEvent = event.isTouchEvent();
285021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
28517564d62a773857b2f46405d22f296edb3530d88eJeff Brown            if (isTouchEvent) {
285221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                mInputEventConsistencyVerifier.onTouchEvent(event, 0);
285321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            } else {
285421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                mInputEventConsistencyVerifier.onGenericMotionEvent(event, 0);
285521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            }
285621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
285721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
28583915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If there is no view, then the event will not be handled.
28593915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
286033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, false);
28613915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
28623915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
28633915bb845b032dc184dba5e60970b803390ca3edJeff Brown
28643915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Translate the pointer event for compatibility, if needed.
286500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (mTranslator != null) {
286600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mTranslator.translateEventInScreenToAppWindow(event);
286700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28697564d62a773857b2f46405d22f296edb3530d88eJeff Brown        // Enter touch mode on down or scroll.
28707564d62a773857b2f46405d22f296edb3530d88eJeff Brown        final int action = event.getAction();
28717564d62a773857b2f46405d22f296edb3530d88eJeff Brown        if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_SCROLL) {
28723915bb845b032dc184dba5e60970b803390ca3edJeff Brown            ensureTouchMode(true);
28733915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
287400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
28753915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Offset the scroll position.
28763915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mCurScrollY != 0) {
28773915bb845b032dc184dba5e60970b803390ca3edJeff Brown            event.offsetLocation(0, mCurScrollY);
28783915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
28793915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (MEASURE_LATENCY) {
288033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            lt.sample("A Dispatching PointerEvents", System.nanoTime() - event.getEventTimeNano());
28813915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
28823915bb845b032dc184dba5e60970b803390ca3edJeff Brown
28833915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Remember the touch position for possible drag-initiation.
28847564d62a773857b2f46405d22f296edb3530d88eJeff Brown        if (isTouchEvent) {
28857564d62a773857b2f46405d22f296edb3530d88eJeff Brown            mLastTouchPoint.x = event.getRawX();
28867564d62a773857b2f46405d22f296edb3530d88eJeff Brown            mLastTouchPoint.y = event.getRawY();
28877564d62a773857b2f46405d22f296edb3530d88eJeff Brown        }
28883915bb845b032dc184dba5e60970b803390ca3edJeff Brown
28893915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Dispatch touch to view hierarchy.
289033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        boolean handled = mView.dispatchPointerEvent(event);
28913915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (MEASURE_LATENCY) {
289233bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            lt.sample("B Dispatched PointerEvents ", System.nanoTime() - event.getEventTimeNano());
28933915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
28943915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (handled) {
289533bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, true);
28963915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
28973915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
28983915bb845b032dc184dba5e60970b803390ca3edJeff Brown
28993915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Pointer event was unhandled.
290033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        finishMotionEvent(event, sendDone, false);
29013915bb845b032dc184dba5e60970b803390ca3edJeff Brown    }
29023915bb845b032dc184dba5e60970b803390ca3edJeff Brown
290333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown    private void finishMotionEvent(MotionEvent event, boolean sendDone, boolean handled) {
29043915bb845b032dc184dba5e60970b803390ca3edJeff Brown        event.recycle();
29053915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (sendDone) {
29064e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            finishInputEvent(event, handled);
29073915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
29081c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy        //noinspection ConstantConditions
290933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        if (LOCAL_LOGV || WATCH_POINTER) {
291033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
291133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown                Log.i(TAG, "Done dispatching!");
291233bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            }
291333bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        }
291400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown    }
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29163915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private void deliverTrackballEvent(MotionEvent event, boolean sendDone) {
29174e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
29184e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverTimeNanos = System.nanoTime();
29194e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
29204e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_TRACKBALL) Log.v(TAG, "Motion event:" + event);
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
292321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
292421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onTrackballEvent(event, 0);
292521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
292621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
29273915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If there is no view, then the event will not be handled.
29283915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
292933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, false);
29303915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29333915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Deliver the trackball event to the view.
29343915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView.dispatchTrackballEvent(event)) {
29353915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // If we reach this, we delivered a trackball event to mView and
29363915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // mView consumed it. Because we will not translate the trackball
29373915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // event into a key event, touch mode will not exit, so we exit
29383915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // touch mode here.
29393915bb845b032dc184dba5e60970b803390ca3edJeff Brown            ensureTouchMode(false);
29403915bb845b032dc184dba5e60970b803390ca3edJeff Brown
294133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, true);
29423915bb845b032dc184dba5e60970b803390ca3edJeff Brown            mLastTrackballTime = Integer.MIN_VALUE;
29433915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
29443915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
29453915bb845b032dc184dba5e60970b803390ca3edJeff Brown
29463915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Translate the trackball event into DPAD keys and try to deliver those.
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final TrackballAxis x = mTrackballAxisX;
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final TrackballAxis y = mTrackballAxisY;
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long curTime = SystemClock.uptimeMillis();
29513915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if ((mLastTrackballTime + MAX_TRACKBALL_DELAY) < curTime) {
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // It has been too long since the last movement,
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // so restart at the beginning.
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            x.reset(0);
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            y.reset(0);
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTrackballTime = curTime;
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
295900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final int action = event.getAction();
296049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        final int metaState = event.getMetaState();
296100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        switch (action) {
296200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case MotionEvent.ACTION_DOWN:
296300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
296400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
296500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                deliverKeyEvent(new KeyEvent(curTime, curTime,
296649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER, 0, metaState,
296749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
296849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        InputDevice.SOURCE_KEYBOARD), false);
296900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                break;
297000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case MotionEvent.ACTION_UP:
297100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
297200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
297300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                deliverKeyEvent(new KeyEvent(curTime, curTime,
297449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER, 0, metaState,
297549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
297649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        InputDevice.SOURCE_KEYBOARD), false);
297700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                break;
297800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
298000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (DEBUG_TRACKBALL) Log.v(TAG, "TB X=" + x.position + " step="
298100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + x.step + " dir=" + x.dir + " acc=" + x.acceleration
298200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " move=" + event.getX()
298300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " / Y=" + y.position + " step="
298400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + y.step + " dir=" + y.dir + " acc=" + y.acceleration
298500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " move=" + event.getY());
298600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final float xOff = x.collect(event.getX(), event.getEventTime(), "X");
298700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final float yOff = y.collect(event.getY(), event.getEventTime(), "Y");
298800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
298900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // Generate DPAD events based on the trackball movement.
299000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // We pick the axis that has moved the most as the direction of
299100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // the DPAD.  When we generate DPAD events for one axis, then the
299200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // other axis is reset -- we don't want to perform DPAD jumps due
299300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // to slight movements in the trackball when making major movements
299400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // along the other axis.
299500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        int keycode = 0;
299600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        int movement = 0;
299700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        float accel = 1;
299800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (xOff > yOff) {
299900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            movement = x.generate((2/event.getXPrecision()));
300000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement != 0) {
300100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                keycode = movement > 0 ? KeyEvent.KEYCODE_DPAD_RIGHT
300200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        : KeyEvent.KEYCODE_DPAD_LEFT;
300300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                accel = x.acceleration;
300400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
300500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
300600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        } else if (yOff > 0) {
300700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            movement = y.generate((2/event.getYPrecision()));
300800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement != 0) {
300900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                keycode = movement > 0 ? KeyEvent.KEYCODE_DPAD_DOWN
301000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        : KeyEvent.KEYCODE_DPAD_UP;
301100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                accel = y.acceleration;
301200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
301300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
301400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
301500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
301600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (keycode != 0) {
301700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement < 0) movement = -movement;
301800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            int accelMovement = (int)(movement * accel);
301900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (DEBUG_TRACKBALL) Log.v(TAG, "Move: movement=" + movement
302000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    + " accelMovement=" + accelMovement
302100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    + " accel=" + accel);
302200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (accelMovement > movement) {
302300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (DEBUG_TRACKBALL) Log.v("foo", "Delivering fake DPAD: "
302400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        + keycode);
302500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                movement--;
302649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                int repeatCount = accelMovement - movement;
302700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                deliverKeyEvent(new KeyEvent(curTime, curTime,
302849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_MULTIPLE, keycode, repeatCount, metaState,
302949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
303049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        InputDevice.SOURCE_KEYBOARD), false);
303100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
303200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            while (movement > 0) {
303300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (DEBUG_TRACKBALL) Log.v("foo", "Delivering fake DPAD: "
303400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        + keycode);
303500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                movement--;
303600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                curTime = SystemClock.uptimeMillis();
303700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                deliverKeyEvent(new KeyEvent(curTime, curTime,
303849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_DOWN, keycode, 0, metaState,
303949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
304049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        InputDevice.SOURCE_KEYBOARD), false);
304100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                deliverKeyEvent(new KeyEvent(curTime, curTime,
304249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_UP, keycode, 0, metaState,
304349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
304449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        InputDevice.SOURCE_KEYBOARD), false);
304549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                }
304600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mLastTrackballTime = curTime;
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30483915bb845b032dc184dba5e60970b803390ca3edJeff Brown
30493915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Unfortunately we can't tell whether the application consumed the keys, so
30503915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // we always consider the trackball event handled.
305133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        finishMotionEvent(event, sendDone, true);
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3054cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private void deliverGenericMotionEvent(MotionEvent event, boolean sendDone) {
30554e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
30564e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverTimeNanos = System.nanoTime();
30574e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
30584e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
305921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
306021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onGenericMotionEvent(event, 0);
306121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
306221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
3063cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int source = event.getSource();
3064cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final boolean isJoystick = (source & InputDevice.SOURCE_CLASS_JOYSTICK) != 0;
3065cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3066cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        // If there is no view, then the event will not be handled.
3067cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (mView == null || !mAdded) {
3068cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (isJoystick) {
3069cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                updateJoystickDirection(event, false);
3070cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
307133bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, false);
3072cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return;
3073cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3074cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3075cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        // Deliver the event to the view.
3076cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (mView.dispatchGenericMotionEvent(event)) {
3077cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (isJoystick) {
3078cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                updateJoystickDirection(event, false);
3079cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
308033bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, true);
3081cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return;
3082cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3083cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3084cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (isJoystick) {
3085cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            // Translate the joystick event into DPAD keys and try to deliver those.
3086cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            updateJoystickDirection(event, true);
308733bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, true);
3088cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else {
308933bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            finishMotionEvent(event, sendDone, false);
3090cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3091cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3092cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3093cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private void updateJoystickDirection(MotionEvent event, boolean synthesizeNewKeys) {
3094cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final long time = event.getEventTime();
3095cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int metaState = event.getMetaState();
3096cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int deviceId = event.getDeviceId();
3097cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int source = event.getSource();
30986f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
30996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        int xDirection = joystickAxisValueToDirection(event.getAxisValue(MotionEvent.AXIS_HAT_X));
31006f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        if (xDirection == 0) {
31016f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            xDirection = joystickAxisValueToDirection(event.getX());
31026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
31036f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
31046f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        int yDirection = joystickAxisValueToDirection(event.getAxisValue(MotionEvent.AXIS_HAT_Y));
31056f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        if (yDirection == 0) {
31066f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            yDirection = joystickAxisValueToDirection(event.getY());
31076f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
3108cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3109cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (xDirection != mLastJoystickXDirection) {
3110cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (mLastJoystickXKeyCode != 0) {
3111cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                deliverKeyEvent(new KeyEvent(time, time,
3112cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_UP, mLastJoystickXKeyCode, 0, metaState,
3113cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source), false);
3114cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickXKeyCode = 0;
3115cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3116cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3117cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            mLastJoystickXDirection = xDirection;
3118cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3119cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (xDirection != 0 && synthesizeNewKeys) {
3120cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickXKeyCode = xDirection > 0
3121cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        ? KeyEvent.KEYCODE_DPAD_RIGHT : KeyEvent.KEYCODE_DPAD_LEFT;
3122cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                deliverKeyEvent(new KeyEvent(time, time,
3123cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_DOWN, mLastJoystickXKeyCode, 0, metaState,
3124cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source), false);
3125cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3126cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3127cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3128cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (yDirection != mLastJoystickYDirection) {
3129cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (mLastJoystickYKeyCode != 0) {
3130cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                deliverKeyEvent(new KeyEvent(time, time,
3131cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_UP, mLastJoystickYKeyCode, 0, metaState,
3132cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source), false);
3133cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickYKeyCode = 0;
3134cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3135cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3136cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            mLastJoystickYDirection = yDirection;
3137cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3138cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (yDirection != 0 && synthesizeNewKeys) {
3139cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickYKeyCode = yDirection > 0
3140cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        ? KeyEvent.KEYCODE_DPAD_DOWN : KeyEvent.KEYCODE_DPAD_UP;
3141cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                deliverKeyEvent(new KeyEvent(time, time,
3142cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_DOWN, mLastJoystickYKeyCode, 0, metaState,
3143cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source), false);
3144cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3145cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3146cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3147cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3148cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private static int joystickAxisValueToDirection(float value) {
3149cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (value >= 0.5f) {
3150cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return 1;
3151cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else if (value <= -0.5f) {
3152cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return -1;
3153cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else {
3154cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return 0;
3155cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3156cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3157cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31594e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * Returns true if the key is used for keyboard navigation.
31604e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @param keyEvent The key event.
31614e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @return True if the key is used for keyboard navigation.
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31634e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown    private static boolean isNavigationKey(KeyEvent keyEvent) {
31644e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        switch (keyEvent.getKeyCode()) {
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_LEFT:
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_RIGHT:
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_UP:
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_DOWN:
31694e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_DPAD_CENTER:
31704e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_PAGE_UP:
31714e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_PAGE_DOWN:
31724e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_MOVE_HOME:
31734e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_MOVE_END:
31744e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_TAB:
31754e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_SPACE:
31764e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_ENTER:
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31834e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * Returns true if the key is used for typing.
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keyEvent The key event.
31854e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @return True if the key is used for typing.
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31874e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown    private static boolean isTypingKey(KeyEvent keyEvent) {
31884e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        return keyEvent.getUnicodeChar() > 0;
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31924e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * See if the key event means we should leave touch mode (and leave touch mode if so).
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event.
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether this key event should be consumed (meaning the act of
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   leaving touch mode alone is considered the event).
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean checkForLeavingTouchModeAndConsume(KeyEvent event) {
31984e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Only relevant in touch mode.
31994e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (!mAttachInfo.mInTouchMode) {
32004e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            return false;
32014e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        }
32024e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown
32034e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Only consider leaving touch mode on DOWN or MULTIPLE actions, never on UP.
320451a6bee6719820d09595f474264fcb833eff470aAdam Powell        final int action = event.getAction();
320551a6bee6719820d09595f474264fcb833eff470aAdam Powell        if (action != KeyEvent.ACTION_DOWN && action != KeyEvent.ACTION_MULTIPLE) {
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32084e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown
32094e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Don't leave touch mode if the IME told us not to.
32104e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if ((event.getFlags() & KeyEvent.FLAG_KEEP_TOUCH_MODE) != 0) {
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32144e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // If the key can be used for keyboard navigation then leave touch mode
32154e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // and select a focused view if needed (in ensureTouchMode).
32164e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // When a new focused view is selected, we consume the navigation key because
32174e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // navigation doesn't make much sense unless a view already has focus so
32184e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // the key's purpose is to set focus.
32194e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (isNavigationKey(event)) {
32204e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            return ensureTouchMode(false);
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32234e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // If the key can be used for typing then leave touch mode
32244e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // and select a focused view if needed (in ensureTouchMode).
32254e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Always allow the view to process the typing key.
32264e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (isTypingKey(event)) {
32274e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            ensureTouchMode(false);
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int enqueuePendingEvent(Object event, boolean sendDone) {
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int seq = mPendingEventSeq+1;
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (seq < 0) seq = 0;
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPendingEventSeq = seq;
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPendingEvents.put(seq, event);
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sendDone ? seq : -seq;
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Object retrievePendingEvent(int seq) {
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (seq < 0) seq = -seq;
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object event = mPendingEvents.get(seq);
32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (event != null) {
32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPendingEvents.remove(seq);
32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return event;
32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32508506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void deliverKeyEvent(KeyEvent event, boolean sendDone) {
32524e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
32534e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverTimeNanos = System.nanoTime();
32544e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
32554e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
325621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
325721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onKeyEvent(event, 0);
325821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
325921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
32603915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If there is no view, then the event will not be handled.
32613915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
32623915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, false);
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32653915bb845b032dc184dba5e60970b803390ca3edJeff Brown
32663915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (LOCAL_LOGV) Log.v(TAG, "Dispatching key " + event + " to " + mView);
32673915bb845b032dc184dba5e60970b803390ca3edJeff Brown
32683915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Perform predispatching before the IME.
32693915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView.dispatchKeyEventPreIme(event)) {
32703915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, true);
32713915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
32723915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
32733915bb845b032dc184dba5e60970b803390ca3edJeff Brown
32743915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Dispatch to the IME before propagating down the view hierarchy.
32753915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // The IME will eventually call back into handleFinishedEvent.
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mLastWasImTarget) {
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputMethodManager imm = InputMethodManager.peekInstance();
32783915bb845b032dc184dba5e60970b803390ca3edJeff Brown            if (imm != null) {
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seq = enqueuePendingEvent(event, sendDone);
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_IMF) Log.v(TAG, "Sending key event to IME: seq="
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + seq + " event=" + event);
32823915bb845b032dc184dba5e60970b803390ca3edJeff Brown                imm.dispatchKeyEvent(mView.getContext(), seq, event, mInputMethodCallback);
32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32863915bb845b032dc184dba5e60970b803390ca3edJeff Brown
32873915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Not dispatching to IME, continue with post IME actions.
32883915bb845b032dc184dba5e60970b803390ca3edJeff Brown        deliverKeyEventPostIme(event, sendDone);
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32913915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private void handleFinishedEvent(int seq, boolean handled) {
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final KeyEvent event = (KeyEvent)retrievePendingEvent(seq);
32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_IMF) Log.v(TAG, "IME finished event: seq=" + seq
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " handled=" + handled + " event=" + event);
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (event != null) {
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean sendDone = seq >= 0;
32973915bb845b032dc184dba5e60970b803390ca3edJeff Brown            if (handled) {
32983915bb845b032dc184dba5e60970b803390ca3edJeff Brown                finishKeyEvent(event, sendDone, true);
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
33003915bb845b032dc184dba5e60970b803390ca3edJeff Brown                deliverKeyEventPostIme(event, sendDone);
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33048506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
33053915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private void deliverKeyEventPostIme(KeyEvent event, boolean sendDone) {
33064e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
33074e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            mInputEventDeliverPostImeTimeNanos = System.nanoTime();
33084e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
33094e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
33103915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If the view went away, then the event will not be handled.
33113915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
33123915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, false);
33133915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
33143915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33163915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If the key's purpose is to exit touch mode then we consume it and consider it handled.
33173915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (checkForLeavingTouchModeAndConsume(event)) {
33183915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, true);
33193915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
33203915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
33218506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
33229065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        // Make sure the fallback event policy sees all keys that will be delivered to the
33239065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        // view hierarchy.
33249065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        mFallbackEventHandler.preDispatchKeyEvent(event);
33259065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
33263915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Deliver the key to the view hierarchy.
33273915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView.dispatchKeyEvent(event)) {
33283915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, true);
33293915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
33303915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
333186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato
3332c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown        // If the Control modifier is held, try to interpret the key as a shortcut.
33337bedf2449041a425899448cb672e91b0a5c97c62Jeff Brown        if (event.getAction() == KeyEvent.ACTION_DOWN
3334c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                && event.isCtrlPressed()
33357bedf2449041a425899448cb672e91b0a5c97c62Jeff Brown                && event.getRepeatCount() == 0
3336c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                && !KeyEvent.isModifierKey(event.getKeyCode())) {
3337c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            if (mView.dispatchKeyShortcutEvent(event)) {
3338c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                finishKeyEvent(event, sendDone, true);
3339c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                return;
3340c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            }
3341c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown        }
3342c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
33433915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Apply the fallback event policy.
33443915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mFallbackEventHandler.dispatchKeyEvent(event)) {
33453915bb845b032dc184dba5e60970b803390ca3edJeff Brown            finishKeyEvent(event, sendDone, true);
33463915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
33473915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33493915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Handle automatic focus changes.
33503915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (event.getAction() == KeyEvent.ACTION_DOWN) {
33513915bb845b032dc184dba5e60970b803390ca3edJeff Brown            int direction = 0;
33523915bb845b032dc184dba5e60970b803390ca3edJeff Brown            switch (event.getKeyCode()) {
33533915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_LEFT:
33544e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
33554e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_LEFT;
33564e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
33573915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
33583915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_RIGHT:
33594e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
33604e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_RIGHT;
33614e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
33623915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
33633915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_UP:
33644e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
33654e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_UP;
33664e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
33673915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
33683915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_DOWN:
33694e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
33704e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_DOWN;
33714e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
33724e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                break;
33734e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            case KeyEvent.KEYCODE_TAB:
33744e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
33754e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_FORWARD;
33764e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
33774e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_BACKWARD;
33784e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
33793915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
33803915bb845b032dc184dba5e60970b803390ca3edJeff Brown            }
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33823915bb845b032dc184dba5e60970b803390ca3edJeff Brown            if (direction != 0) {
33833915bb845b032dc184dba5e60970b803390ca3edJeff Brown                View focused = mView != null ? mView.findFocus() : null;
33843915bb845b032dc184dba5e60970b803390ca3edJeff Brown                if (focused != null) {
33853915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    View v = focused.focusSearch(direction);
33863915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    if (v != null && v != focused) {
33873915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // do the math the get the interesting rect
33883915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // of previous focused into the coord system of
33893915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // newly focused view
33903915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        focused.getFocusedRect(mTempRect);
33913915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        if (mView instanceof ViewGroup) {
33923915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            ((ViewGroup) mView).offsetDescendantRectToMyCoords(
33933915bb845b032dc184dba5e60970b803390ca3edJeff Brown                                    focused, mTempRect);
33943915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            ((ViewGroup) mView).offsetRectIntoDescendantCoords(
33953915bb845b032dc184dba5e60970b803390ca3edJeff Brown                                    v, mTempRect);
33963915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        }
33973915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        if (v.requestFocus(direction, mTempRect)) {
33983915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            playSoundEffect(
33993915bb845b032dc184dba5e60970b803390ca3edJeff Brown                                    SoundEffectConstants.getContantForFocusDirection(direction));
34003915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            finishKeyEvent(event, sendDone, true);
34013915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            return;
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34043915bb845b032dc184dba5e60970b803390ca3edJeff Brown
34053915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    // Give the focused view a last chance to handle the dpad key.
34063915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    if (mView.dispatchUnhandledMove(focused, direction)) {
34073915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        finishKeyEvent(event, sendDone, true);
34083915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        return;
34093915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    }
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34123915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34143915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Key was unhandled.
34153915bb845b032dc184dba5e60970b803390ca3edJeff Brown        finishKeyEvent(event, sendDone, false);
34163915bb845b032dc184dba5e60970b803390ca3edJeff Brown    }
34173915bb845b032dc184dba5e60970b803390ca3edJeff Brown
34183915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private void finishKeyEvent(KeyEvent event, boolean sendDone, boolean handled) {
34193915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (sendDone) {
34204e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown            finishInputEvent(event, handled);
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3424a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /* drag/drop */
3425407b4e91fe7627545b8110e683953353236b4543Christopher Tate    void setLocalDragState(Object obj) {
3426407b4e91fe7627545b8110e683953353236b4543Christopher Tate        mLocalDragState = obj;
3427407b4e91fe7627545b8110e683953353236b4543Christopher Tate    }
3428407b4e91fe7627545b8110e683953353236b4543Christopher Tate
3429a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    private void handleDragEvent(DragEvent event) {
3430a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // From the root, only drag start/end/location are dispatched.  entered/exited
3431a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // are determined and dispatched by the viewgroup hierarchy, who then report
3432a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // that back here for ultimate reporting back to the framework.
3433a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (mView != null && mAdded) {
3434a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            final int what = event.mAction;
3435a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3436a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            if (what == DragEvent.ACTION_DRAG_EXITED) {
3437a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // A direct EXITED event means that the window manager knows we've just crossed
3438a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // a window boundary, so the current drag target within this one must have
3439a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // just been exited.  Send it the usual notifications and then we're done
3440a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // for now.
34419d1ab883293b047b654935b84d0803c8c383be91Chris Tate                mView.dispatchDragEvent(event);
3442a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } else {
3443a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Cache the drag description when the operation starts, then fill it in
3444a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // on subsequent calls as a convenience
3445a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if (what == DragEvent.ACTION_DRAG_STARTED) {
34469d1ab883293b047b654935b84d0803c8c383be91Chris Tate                    mCurrentDragView = null;    // Start the current-recipient tracking
3447a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    mDragDescription = event.mClipDescription;
3448a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                } else {
3449a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mClipDescription = mDragDescription;
3450a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3451a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3452a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // For events with a [screen] location, translate into window coordinates
3453a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if ((what == DragEvent.ACTION_DRAG_LOCATION) || (what == DragEvent.ACTION_DROP)) {
3454a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    mDragPoint.set(event.mX, event.mY);
3455a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mTranslator != null) {
3456a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mTranslator.translatePointInScreenToAppWindow(mDragPoint);
3457a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3458a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3459a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mCurScrollY != 0) {
3460a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragPoint.offset(0, mCurScrollY);
3461a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3462a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3463a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mX = mDragPoint.x;
3464a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mY = mDragPoint.y;
3465a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3466a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3467a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Remember who the current drag target is pre-dispatch
3468a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                final View prevDragView = mCurrentDragView;
3469a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3470a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Now dispatch the drag/drop event
3471d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                boolean result = mView.dispatchDragEvent(event);
3472a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3473a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // If we changed apparent drag target, tell the OS about it
3474a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if (prevDragView != mCurrentDragView) {
3475a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    try {
3476a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (prevDragView != null) {
3477a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            sWindowSession.dragRecipientExited(mWindow);
3478a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
3479a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (mCurrentDragView != null) {
3480a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            sWindowSession.dragRecipientEntered(mWindow);
3481a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
3482a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } catch (RemoteException e) {
3483a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.e(TAG, "Unable to note drag target change");
3484a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3485a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3486d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate
3487407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // Report the drop result when we're done
3488d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                if (what == DragEvent.ACTION_DROP) {
34891fc014fd0051a48083c6d469c2a4f22da1aa15e4Christopher Tate                    mDragDescription = null;
3490d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    try {
3491d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Log.i(TAG, "Reporting drop result: " + result);
3492d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        sWindowSession.reportDropResult(mWindow, result);
3493d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    } catch (RemoteException e) {
3494d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Log.e(TAG, "Unable to report drop result");
3495d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
3496d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                }
3497407b4e91fe7627545b8110e683953353236b4543Christopher Tate
3498407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // When the drag operation ends, release any local state object
3499407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // that may have been in use
3500407b4e91fe7627545b8110e683953353236b4543Christopher Tate                if (what == DragEvent.ACTION_DRAG_ENDED) {
3501407b4e91fe7627545b8110e683953353236b4543Christopher Tate                    setLocalDragState(null);
3502407b4e91fe7627545b8110e683953353236b4543Christopher Tate                }
3503a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
3504a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
3505a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        event.recycle();
3506a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
3507a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
35089a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public void handleDispatchSystemUiVisibilityChanged(SystemUiVisibilityInfo args) {
35099a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        if (mSeq != args.seq) {
35109a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            // The sequence has changed, so we need to update our value and make
35119a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            // sure to do a traversal afterward so the window manager is given our
35129a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            // most recent data.
35139a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            mSeq = args.seq;
35149a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            mAttachInfo.mForceReportNewAttributes = true;
35159a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            scheduleTraversals();
35169a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        }
3517664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        if (mView == null) return;
35189a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        if (args.localChanges != 0) {
35199a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            if (mAttachInfo != null) {
35209a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                mAttachInfo.mSystemUiVisibility =
35219a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                        (mAttachInfo.mSystemUiVisibility&~args.localChanges)
35229a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                        | (args.localValue&args.localChanges);
35239a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            }
35249a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            mView.updateLocalSystemUiVisibility(args.localValue, args.localChanges);
35259a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            mAttachInfo.mRecomputeGlobalAttributes = true;
35269a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            scheduleTraversals();
352714782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato        }
35289a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        mView.dispatchSystemUiVisibilityChanged(args.globalVisibility);
3529664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
3530664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
35312c095f367779ef32130c72849936a2e3013c8492Christopher Tate    public void getLastTouchPoint(Point outLocation) {
35322c095f367779ef32130c72849936a2e3013c8492Christopher Tate        outLocation.x = (int) mLastTouchPoint.x;
35332c095f367779ef32130c72849936a2e3013c8492Christopher Tate        outLocation.y = (int) mLastTouchPoint.y;
35342c095f367779ef32130c72849936a2e3013c8492Christopher Tate    }
35352c095f367779ef32130c72849936a2e3013c8492Christopher Tate
35369d1ab883293b047b654935b84d0803c8c383be91Chris Tate    public void setDragFocus(View newDragTarget) {
3537a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (mCurrentDragView != newDragTarget) {
3538048691cfac42acce24d9462eca5e57ca5aa78e7dChris Tate            mCurrentDragView = newDragTarget;
3539a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
3540a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
3541a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AudioManager getAudioManager() {
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == null) {
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("getAudioManager called when there is no mView");
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAudioManager == null) {
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAudioManager = (AudioManager) mView.getContext().getSystemService(Context.AUDIO_SERVICE);
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAudioManager;
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    public AccessibilityInteractionController getAccessibilityInteractionController() {
35538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        if (mView == null) {
35548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            throw new IllegalStateException("getAccessibilityInteractionController"
35558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    + " called when there is no mView");
35568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
35575ac84423a28fea4924eb1c389d647defe1c1b93cGilles Debunne        if (mAccessibilityInteractionController == null) {
35585ac84423a28fea4924eb1c389d647defe1c1b93cGilles Debunne            mAccessibilityInteractionController = new AccessibilityInteractionController();
35598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
35605ac84423a28fea4924eb1c389d647defe1c1b93cGilles Debunne        return mAccessibilityInteractionController;
35618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
35628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
35638169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
35648169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            boolean insetsPending) throws RemoteException {
356564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
356664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        float appScale = mAttachInfo.mApplicationScale;
35673d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        boolean restore = false;
356864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (params != null && mTranslator != null) {
3569e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            restore = true;
3570e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            params.backup();
357164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateWindowLayout(params);
35729189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        }
357364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (params != null) {
357464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            if (DBG) Log.d(TAG, "WindowLayout in layoutWindow:" + params);
35753d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        }
3576694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        mPendingConfiguration.seq = 0;
3577f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        //Log.d(TAG, ">>>>>> CALLING relayout");
3578180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn        if (params != null && mOrigWindowType != params.type) {
3579180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn            // For compatibility with old apps, don't crash here.
3580180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn            if (mTargetSdkVersion < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
3581180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                Slog.w(TAG, "Window type can not be changed after "
3582180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                        + "the window is added; ignoring change of " + mView);
3583180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                params.type = mOrigWindowType;
3584180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn            }
3585180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn        }
35868169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima        int relayoutResult = sWindowSession.relayout(
35879a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                mWindow, mSeq, params,
3588189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                (int) (mView.getMeasuredWidth() * appScale + 0.5f),
3589189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                (int) (mView.getMeasuredHeight() * appScale + 0.5f),
35906d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                viewVisibility, insetsPending ? WindowManagerImpl.RELAYOUT_INSETS_PENDING : 0,
35916d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                mWinFrame, mPendingContentInsets, mPendingVisibleInsets,
3592694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mPendingConfiguration, mSurface);
3593f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        //Log.d(TAG, "<<<<<< BACK FROM relayout");
35943d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        if (restore) {
3595e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            params.restore();
35963d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        }
359764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
359864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mTranslator != null) {
359964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWinFrame(mWinFrame);
360064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(mPendingContentInsets);
360164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(mPendingVisibleInsets);
36029189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        }
36038169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima        return relayoutResult;
36048169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    }
36058506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
36069189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    /**
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void playSoundEffect(int effectId) {
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
361213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi        try {
361313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            final AudioManager audioManager = getAudioManager();
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
361513b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            switch (effectId) {
361613b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.CLICK:
361713b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
361813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
361913b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_DOWN:
362013b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN);
362113b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
362213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_LEFT:
362313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT);
362413b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
362513b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_RIGHT:
362613b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT);
362713b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
362813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_UP:
362913b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP);
363013b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
363113b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                default:
363213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    throw new IllegalArgumentException("unknown effect id " + effectId +
363313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                            " not defined in " + SoundEffectConstants.class.getCanonicalName());
363413b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            }
363513b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi        } catch (IllegalStateException e) {
363613b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            // Exception thrown by getAudioManager() when mView is null
363713b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            Log.e(TAG, "FATAL EXCEPTION when attempting to play sound effect: " + e);
363813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            e.printStackTrace();
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean performHapticFeedback(int effectId, boolean always) {
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sWindowSession.performHapticFeedback(mWindow, effectId, always);
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View focusSearch(View focused, int direction) {
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(mView instanceof ViewGroup)) {
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return FocusFinder.getInstance().findNextFocus((ViewGroup) mView, focused, direction);
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void debug() {
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView.debug();
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
366765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
366865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    public void dumpGfxInfo(PrintWriter pw, int[] info) {
366965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mView != null) {
367065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            getGfxInfo(mView, info);
367165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        } else {
367265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            info[0] = info[1] = 0;
367365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
367465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
367565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
367665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    private void getGfxInfo(View view, int[] info) {
367765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        DisplayList displayList = view.mDisplayList;
367865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        info[0]++;
367965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (displayList != null) {
368065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            info[1] += displayList.getSize();
368165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
368265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
368365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (view instanceof ViewGroup) {
368465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            ViewGroup group = (ViewGroup) view;
368565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
368665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            int count = group.getChildCount();
368765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            for (int i = 0; i < count; i++) {
368865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                getGfxInfo(group.getChildAt(i), info);
368965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
369065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
369165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void die(boolean immediate) {
369494d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        if (immediate) {
369594d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn            doDie();
369694d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        } else {
369794d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn            sendEmptyMessage(DIE);
369894d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        }
369994d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn    }
370094d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn
370194d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn    void doDie() {
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
3703b75fa30aaf03d9e425d150b452501e5df0621351Jeff Brown        if (LOCAL_LOGV) Log.v(TAG, "DIE in " + this + " of " + mSurface);
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
370516260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            if (mAdded) {
370616260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy                mAdded = false;
370716260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy                dispatchDetachedFromWindow();
370816260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            }
370916260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAdded && !mFirst) {
371129d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy                destroyHardwareRenderer();
371229d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int viewVisibility = mView.getVisibility();
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean viewVisibilityChanged = mViewVisibility != viewVisibility;
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWindowAttributesChanged || viewVisibilityChanged) {
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If layout params have been changed, first give them
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to the window manager to make sure it has the correct
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // animation info.
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
37208169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                        if ((relayoutWindow(mWindowAttributes, viewVisibility, false)
37216d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                                & WindowManagerImpl.RELAYOUT_RES_FIRST_TIME) != 0) {
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sWindowSession.finishDrawing(mWindow);
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException e) {
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37280586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mSurface.release();
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37335fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public void requestUpdateConfiguration(Configuration config) {
37345fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        Message msg = obtainMessage(UPDATE_CONFIGURATION, config);
37355fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        sendMessage(msg);
37365fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
37375fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
373829d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy    private void destroyHardwareRenderer() {
3739b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        if (mAttachInfo.mHardwareRenderer != null) {
3740b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            mAttachInfo.mHardwareRenderer.destroy(true);
3741b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            mAttachInfo.mHardwareRenderer = null;
374229d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy            mAttachInfo.mHardwareAccelerated = false;
374329d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy        }
374429d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy    }
374529d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchFinishedEvent(int seq, boolean handled) {
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(FINISHED_EVENT);
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = seq;
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg2 = handled ? 1 : 0;
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37523d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchResized(int w, int h, Rect coveredInsets,
3754e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            Rect visibleInsets, boolean reportDraw, Configuration newConfig) {
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_LAYOUT) Log.v(TAG, "Resizing " + this + ": w=" + w
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " h=" + h + " coveredInsets=" + coveredInsets.toShortString()
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " visibleInsets=" + visibleInsets.toShortString()
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " reportDraw=" + reportDraw);
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(reportDraw ? RESIZED_REPORT :RESIZED);
376064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mTranslator != null) {
376164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(coveredInsets);
376264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(visibleInsets);
376364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            w *= mTranslator.applicationInvertedScale;
376464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            h *= mTranslator.applicationInvertedScale;
376564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        }
376664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        msg.arg1 = w;
376764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        msg.arg2 = h;
3768e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ResizedInfo ri = new ResizedInfo();
3769e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ri.coveredInsets = new Rect(coveredInsets);
3770e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ri.visibleInsets = new Rect(visibleInsets);
3771e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ri.newConfig = newConfig;
3772e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        msg.obj = ri;
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37751f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
37764e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    private long mInputEventReceiveTimeNanos;
37774e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    private long mInputEventDeliverTimeNanos;
37784e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    private long mInputEventDeliverPostImeTimeNanos;
37793915bb845b032dc184dba5e60970b803390ca3edJeff Brown    private InputQueue.FinishedCallback mFinishedCallback;
378046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
378146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    private final InputHandler mInputHandler = new InputHandler() {
37823915bb845b032dc184dba5e60970b803390ca3edJeff Brown        public void handleKey(KeyEvent event, InputQueue.FinishedCallback finishedCallback) {
37831c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            startInputEvent(finishedCallback);
378492ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown            dispatchKey(event, true);
378546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
378646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
37873915bb845b032dc184dba5e60970b803390ca3edJeff Brown        public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) {
37881c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            startInputEvent(finishedCallback);
378993ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown            dispatchMotion(event, true);
379046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
379146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    };
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37931f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    /**
37941f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase     * Utility class used to queue up input events which are then handled during
37951f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase     * performTraversals(). Doing it this way allows us to ensure that we are up to date with
37961f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase     * all input events just prior to drawing, instead of placing those events on the regular
37971f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase     * handler queue, potentially behind a drawing event.
37981f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase     */
37991f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    static class InputEventMessage {
38001f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        Message mMessage;
38011f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        InputEventMessage mNext;
38021f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
38031f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        private static final Object sPoolSync = new Object();
38041f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        private static InputEventMessage sPool;
38051f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        private static int sPoolSize = 0;
38061f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
38071f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        private static final int MAX_POOL_SIZE = 10;
38081f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
38091f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        private InputEventMessage(Message m) {
38101f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            mMessage = m;
38111f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            mNext = null;
38121f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        }
38131f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
38141f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        /**
38151f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase         * Return a new Message instance from the global pool. Allows us to
38161f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase         * avoid allocating new objects in many cases.
38171f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase         */
38181f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        public static InputEventMessage obtain(Message msg) {
38191f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            synchronized (sPoolSync) {
38201f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                if (sPool != null) {
38211f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                    InputEventMessage m = sPool;
38221f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                    sPool = m.mNext;
38231f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                    m.mNext = null;
38241f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                    sPoolSize--;
38251f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                    m.mMessage = msg;
38261f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                    return m;
38271f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                }
38281f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            }
38291f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            return new InputEventMessage(msg);
38301f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        }
38311f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
38321f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        /**
38331f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase         * Return the message to the pool.
38341f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase         */
38351f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        public void recycle() {
38361f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            mMessage.recycle();
38371f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            synchronized (sPoolSync) {
38381f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                if (sPoolSize < MAX_POOL_SIZE) {
38391f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                    mNext = sPool;
38401f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                    sPool = this;
38411f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                    sPoolSize++;
38421f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                }
38431f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            }
38441f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
38451f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        }
38461f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    }
38471f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
38481f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    /**
38491f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase     * Place the input event message at the end of the current pending list
38501f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase     */
38511f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    private void enqueueInputEvent(Message msg, long when) {
38521f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        InputEventMessage inputMessage = InputEventMessage.obtain(msg);
38531f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        if (mPendingInputEvents == null) {
38541f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            mPendingInputEvents = inputMessage;
38551f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        } else {
38561f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            InputEventMessage currMessage = mPendingInputEvents;
38571f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            while (currMessage.mNext != null) {
38581f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase                currMessage = currMessage.mNext;
38591f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            }
38601f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            currMessage.mNext = inputMessage;
38611f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        }
38621f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        sendEmptyMessageAtTime(PROCESS_INPUT_EVENTS, when);
38631f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    }
38641f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchKey(KeyEvent event) {
386692ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown        dispatchKey(event, false);
386792ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown    }
386892ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown
386992ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown    private void dispatchKey(KeyEvent event, boolean sendDone) {
387092ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown        //noinspection ConstantConditions
387192ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown        if (false && event.getAction() == KeyEvent.ACTION_DOWN) {
387292ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown            if (event.getKeyCode() == KeyEvent.KEYCODE_CAMERA) {
3873812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                if (DBG) Log.d("keydisp", "===================================================");
3874812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                if (DBG) Log.d("keydisp", "Focused view Hierarchy is:");
3875812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debug();
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3878812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                if (DBG) Log.d("keydisp", "===================================================");
38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(DISPATCH_KEY);
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.obj = event;
388492ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown        msg.arg1 = sendDone ? 1 : 0;
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_LOGV) Log.v(
3887c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            TAG, "sending key " + event + " to " + mView);
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38891f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        enqueueInputEvent(msg, event.getEventTime());
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3891c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
389293ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown    private void dispatchMotion(MotionEvent event, boolean sendDone) {
3893c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        int source = event.getSource();
3894c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) {
389593ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown            dispatchPointer(event, sendDone);
3896c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        } else if ((source & InputDevice.SOURCE_CLASS_TRACKBALL) != 0) {
389793ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown            dispatchTrackball(event, sendDone);
3898c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        } else {
3899cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            dispatchGenericMotion(event, sendDone);
3900c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
3901c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
390393ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown    private void dispatchPointer(MotionEvent event, boolean sendDone) {
39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(DISPATCH_POINTER);
39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.obj = event;
390693ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        msg.arg1 = sendDone ? 1 : 0;
39071f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        enqueueInputEvent(msg, event.getEventTime());
39089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
391093ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown    private void dispatchTrackball(MotionEvent event, boolean sendDone) {
39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(DISPATCH_TRACKBALL);
39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.obj = event;
391393ed4e3052a773289c0570984801ea8f0f0849d2Jeff Brown        msg.arg1 = sendDone ? 1 : 0;
39141f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        enqueueInputEvent(msg, event.getEventTime());
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3916cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3917cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private void dispatchGenericMotion(MotionEvent event, boolean sendDone) {
3918cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        Message msg = obtainMessage(DISPATCH_GENERIC_MOTION);
3919cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        msg.obj = event;
3920cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        msg.arg1 = sendDone ? 1 : 0;
39211f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        enqueueInputEvent(msg, event.getEventTime());
3922cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3923cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchAppVisibility(boolean visible) {
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(DISPATCH_APP_VISIBILITY);
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = visible ? 1 : 0;
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchGetNewSurface() {
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(DISPATCH_GET_NEW_SURFACE);
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) {
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = Message.obtain();
39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.what = WINDOW_FOCUS_CHANGED;
39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = hasFocus ? 1 : 0;
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg2 = inTouchMode ? 1 : 0;
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3943ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    public void dispatchCloseSystemDialogs(String reason) {
3944ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        Message msg = Message.obtain();
3945ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        msg.what = CLOSE_SYSTEM_DIALOGS;
3946ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        msg.obj = reason;
3947ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        sendMessage(msg);
3948ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    }
3949a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3950a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    public void dispatchDragEvent(DragEvent event) {
395191e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        final int what;
395291e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        if (event.getAction() == DragEvent.ACTION_DRAG_LOCATION) {
395391e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate            what = DISPATCH_DRAG_LOCATION_EVENT;
395491e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate            removeMessages(what);
395591e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        } else {
395691e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate            what = DISPATCH_DRAG_EVENT;
395791e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        }
395891e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        Message msg = obtainMessage(what, event);
3959a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        sendMessage(msg);
3960a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
3961a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
39629a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility,
39639a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            int localValue, int localChanges) {
39649a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        SystemUiVisibilityInfo args = new SystemUiVisibilityInfo();
39659a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.seq = seq;
39669a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.globalVisibility = globalVisibility;
39679a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.localValue = localValue;
39689a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.localChanges = localChanges;
39699a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        sendMessage(obtainMessage(DISPATCH_SYSTEM_UI_VISIBILITY, args));
3970664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
3971664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
397275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
397375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * The window is getting focus so if there is anything focused/selected
397475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * send an {@link AccessibilityEvent} to announce that.
397575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
397675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private void sendAccessibilityEvents() {
39778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        if (!mAccessibilityManager.isEnabled()) {
397875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return;
397975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
398075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
398175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        View focusedView = mView.findFocus();
398275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (focusedView != null && focusedView != mView) {
398375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            focusedView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
398475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
398575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
398675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
3987eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    /**
3988eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * Post a callback to send a
3989eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * {@link AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED} event.
3990a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov     * This event is send at most once every
3991a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov     * {@link ViewConfiguration#getSendRecurringAccessibilityEventsInterval()}.
3992eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     */
3993eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    private void postSendWindowContentChangedCallback() {
3994a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        if (mSendWindowContentChangedAccessibilityEvent == null) {
3995a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov            mSendWindowContentChangedAccessibilityEvent =
3996a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov                new SendWindowContentChangedAccessibilityEvent();
3997a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        }
3998a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        if (!mSendWindowContentChangedAccessibilityEvent.mIsPending) {
3999a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov            mSendWindowContentChangedAccessibilityEvent.mIsPending = true;
4000a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov            postDelayed(mSendWindowContentChangedAccessibilityEvent,
4001a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov                    ViewConfiguration.getSendRecurringAccessibilityEventsInterval());
4002eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
4003eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
4004eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
4005eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    /**
4006eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * Remove a posted callback to send a
4007eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * {@link AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED} event.
4008eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     */
4009eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    private void removeSendWindowContentChangedCallback() {
4010a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        if (mSendWindowContentChangedAccessibilityEvent != null) {
4011a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov            removeCallbacks(mSendWindowContentChangedAccessibilityEvent);
4012eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
4013eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
4014eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
40159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean showContextMenuForChild(View originalView) {
40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40196e34636749217654f43221885afb7a29bb5ca96aAdam Powell    public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) {
40206e34636749217654f43221885afb7a29bb5ca96aAdam Powell        return null;
40216e34636749217654f43221885afb7a29bb5ca96aAdam Powell    }
40226e34636749217654f43221885afb7a29bb5ca96aAdam Powell
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void createContextMenu(ContextMenu menu) {
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void childDrawableStateChanged(View child) {
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public boolean requestSendAccessibilityEvent(View child, AccessibilityEvent event) {
4030736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        if (mView == null) {
4031736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            return false;
4032736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        }
40338643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager.sendAccessibilityEvent(event);
4034736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        return true;
4035736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    }
4036736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void checkThread() {
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mThread != Thread.currentThread()) {
40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new CalledFromWrongThreadException(
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Only the original thread that created a view hierarchy can touch its views.");
40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
4045c6cc0f8c19d9eccf408a443fa2bf668af261dcd0Joe Onorato        // ViewAncestor never intercepts touch event, so this can be a no-op
40469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean requestChildRectangleOnScreen(View child, Rect rectangle,
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean immediate) {
40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return scrollToRectOrFocus(rectangle, immediate);
40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40528506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
4053dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    class TakenSurfaceHolder extends BaseSurfaceHolder {
4054dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4055dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public boolean onAllowLockCanvas() {
4056dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return mDrawingAllowed;
4057dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4058dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4059dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4060dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void onRelayoutContainer() {
4061dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // Not currently interesting -- from changing between fixed and layout size.
4062dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4063dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4064dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setFormat(int format) {
4065dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceFormat(format);
4066dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4067dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4068dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setType(int type) {
4069dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceType(type);
4070dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4071dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4072dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4073dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void onUpdateSurface() {
4074dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // We take care of format and type changes on our own.
4075dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            throw new IllegalStateException("Shouldn't be here");
4076dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4077dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4078dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public boolean isCreating() {
4079dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return mIsCreating;
4080dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4081dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4082dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4083dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setFixedSize(int width, int height) {
4084dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            throw new UnsupportedOperationException(
4085dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    "Currently only support sizing from layout");
4086dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4087dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4088dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setKeepScreenOn(boolean screenOn) {
4089dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceKeepScreenOn(screenOn);
4090dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4091dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    }
4092dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
40939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class InputMethodCallback extends IInputMethodCallback.Stub {
40946dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        private WeakReference<ViewRootImpl> mViewAncestor;
40959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40966dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        public InputMethodCallback(ViewRootImpl viewAncestor) {
40976dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor);
40989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40998506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
41009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void finishedEvent(int seq, boolean handled) {
41016dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
41028643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
41038643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchFinishedEvent(seq, handled);
41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41078643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void sessionCreated(IInputMethodSession session) {
41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Stub -- not for use in the client.
41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41118506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
41129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class W extends IWindow.Stub {
41136dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        private final WeakReference<ViewRootImpl> mViewAncestor;
41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41156dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        W(ViewRootImpl viewAncestor) {
41166dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor);
41179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy        public void resized(int w, int h, Rect coveredInsets, Rect visibleInsets,
4120fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy                boolean reportDraw, Configuration newConfig) {
41216dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
41228643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
41238643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchResized(w, h, coveredInsets, visibleInsets, reportDraw,
41248643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        newConfig);
41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void dispatchAppVisibility(boolean visible) {
41296dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
41308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
41318643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchAppVisibility(visible);
41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void dispatchGetNewSurface() {
41366dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
41378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
41388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchGetNewSurface();
41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) {
41436dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
41448643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
41458643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.windowFocusChanged(hasFocus, inTouchMode);
41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static int checkCallingPermission(String permission) {
41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault().checkPermission(
41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        permission, Binder.getCallingPid(), Binder.getCallingUid());
41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_DENIED;
41559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void executeCommand(String command, String parameters, ParcelFileDescriptor out) {
41596dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
41608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
41618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                final View view = viewAncestor.mView;
41629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (view != null) {
41639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (checkCallingPermission(Manifest.permission.DUMP) !=
41649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            PackageManager.PERMISSION_GRANTED) {
41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw new SecurityException("Insufficient permissions to invoke"
41669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " executeCommand() from pid=" + Binder.getCallingPid()
41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ", uid=" + Binder.getCallingUid());
41689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    OutputStream clientStream = null;
41719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        clientStream = new ParcelFileDescriptor.AutoCloseOutputStream(out);
41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ViewDebug.dispatchCommand(view, command, parameters, clientStream);
41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException e) {
41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        e.printStackTrace();
41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } finally {
41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (clientStream != null) {
41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                clientStream.close();
41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (IOException e) {
41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                e.printStackTrace();
41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
41839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
418872c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn
4189ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        public void closeSystemDialogs(String reason) {
41906dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
41918643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
41928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchCloseSystemDialogs(reason);
4193ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            }
4194ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
4195ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn
4196bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
4197bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                boolean sync) {
419819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            if (sync) {
419919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                try {
420019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    sWindowSession.wallpaperOffsetsComplete(asBinder());
420119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                } catch (RemoteException e) {
42027580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                }
42037580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
42047580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
42058643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
42067580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        public void dispatchWallpaperCommand(String action, int x, int y,
42077580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                int z, Bundle extras, boolean sync) {
42087580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (sync) {
42097580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                try {
42107580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    sWindowSession.wallpaperCommandComplete(asBinder(), null);
42117580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                } catch (RemoteException e) {
421219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
421319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            }
421472c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        }
4215a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
4216a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        /* Drag/drop */
4217a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        public void dispatchDragEvent(DragEvent event) {
42186dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
42198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
42208643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchDragEvent(event);
4221a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
4222a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
4223664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
42249a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        public void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility,
42259a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                int localValue, int localChanges) {
42266dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
42278643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
42289a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                viewAncestor.dispatchSystemUiVisibilityChanged(seq, globalVisibility,
42299a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                        localValue, localChanges);
4230664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            }
4231664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        }
42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
42359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Maintains state information for a single trackball axis, generating
42369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * discrete (DPAD) movements based on raw trackball motion.
42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final class TrackballAxis {
42399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
42409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum amount of acceleration we will apply.
42419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
42429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final float MAX_ACCELERATION = 20;
42438506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
42449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum amount of time (in milliseconds) between events in order
42469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for us to consider the user to be doing fast trackball movements,
42479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * and thus apply an acceleration.
42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final long FAST_MOVE_TIME = 150;
42508506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
42519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
42529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Scaling factor to the time (in milliseconds) between events to how
42539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * much to multiple/divide the current acceleration.  When movement
42549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * is < FAST_MOVE_TIME this multiplies the acceleration; when >
42559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * FAST_MOVE_TIME it divides it.
42569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
42579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final float ACCEL_MOVE_SCALING_FACTOR = (1.0f/40);
42588506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
42599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float position;
42609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float absPosition;
42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float acceleration = 1;
42629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long lastMoveTime = 0;
42639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int step;
42649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int dir;
42659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nonAccelMovement;
42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void reset(int _step) {
42689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            position = 0;
42699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            acceleration = 1;
42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lastMoveTime = 0;
42719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            step = _step;
42729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dir = 0;
42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
42769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Add trackball movement into the state.  If the direction of movement
42779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * has been reversed, the state is reset before adding the
42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * movement (so that you don't have to compensate for any previously
42799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * collected movement before see the result of the movement in the
42809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * new direction).
42819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
42829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Returns the absolute value of the amount of movement
42839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * collected so far.
42849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
42859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float collect(float off, long time, String axis) {
42869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long normTime;
42879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (off > 0) {
42889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = (long)(off * FAST_MOVE_TIME);
42899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (dir < 0) {
42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " reversed to positive!");
42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    position = 0;
42929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    step = 0;
42939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = 1;
42949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastMoveTime = 0;
42959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
42969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = 1;
42979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (off < 0) {
42989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = (long)((-off) * FAST_MOVE_TIME);
42999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (dir > 0) {
43009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " reversed to negative!");
43019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    position = 0;
43029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    step = 0;
43039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = 1;
43049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastMoveTime = 0;
43059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = -1;
43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = 0;
43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43108506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
43119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The number of milliseconds between each movement that is
43129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // considered "normal" and will not result in any acceleration
43139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // or deceleration, scaled by the offset we have here.
43149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (normTime > 0) {
43159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long delta = time - lastMoveTime;
43169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lastMoveTime = time;
43179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float acc = acceleration;
43189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (delta < normTime) {
43199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // The user is scrolling rapidly, so increase acceleration.
43209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float scale = (normTime-delta) * ACCEL_MOVE_SCALING_FACTOR;
43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (scale > 1) acc *= scale;
43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " accelerate: off="
43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + off + " normTime=" + normTime + " delta=" + delta
43249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " scale=" + scale + " acc=" + acc);
43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = acc < MAX_ACCELERATION ? acc : MAX_ACCELERATION;
43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
43279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // The user is scrolling slowly, so decrease acceleration.
43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float scale = (delta-normTime) * ACCEL_MOVE_SCALING_FACTOR;
43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (scale > 1) acc /= scale;
43309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " deccelerate: off="
43319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + off + " normTime=" + normTime + " delta=" + delta
43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " scale=" + scale + " acc=" + acc);
43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = acc > 1 ? acc : 1;
43349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
43359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            position += off;
43379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (absPosition = Math.abs(position));
43389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
43419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Generate the number of discrete movement events appropriate for
43429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the currently collected trackball movement.
43439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
43449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param precision The minimum movement required to generate the
43459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * first discrete movement.
43469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
43479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Returns the number of discrete movements, either positive
43489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * or negative, or 0 if there is not enough trackball movement yet
43499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for a discrete movement.
43509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
43519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int generate(float precision) {
43529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int movement = 0;
43539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            nonAccelMovement = 0;
43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
43559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int dir = position >= 0 ? 1 : -1;
43569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (step) {
43579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we are going to execute the first step, then we want
43589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to do this as soon as possible instead of waiting for
43599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // a full movement, in order to make things look responsive.
43609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case 0:
43619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < precision) {
43629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
43639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
43649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
43659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        nonAccelMovement += dir;
43669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        step = 1;
43679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
43689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we have generated the first movement, then we need
43699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to wait for the second complete trackball motion before
43709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // generating the second discrete movement.
43719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case 1:
43729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < 2) {
43739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
43749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
43759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
43769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        nonAccelMovement += dir;
43779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        position += dir > 0 ? -2 : 2;
43789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        absPosition = Math.abs(position);
43799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        step = 2;
43809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
43819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // After the first two, we generate discrete movements
43829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // consistently with the trackball, applying an acceleration
43839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // if the trackball is moving quickly.  This is a simple
43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // acceleration on top of what we already compute based
43859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // on how quickly the wheel is being turned, to apply
43869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // a longer increasing acceleration to continuous movement
43879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in one direction.
43889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    default:
43899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < 1) {
43909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
43919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
43929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
43939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        position += dir >= 0 ? -1 : 1;
43949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        absPosition = Math.abs(position);
43959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        float acc = acceleration;
43969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        acc *= 1.1f;
43979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        acceleration = acc < MAX_ACCELERATION ? acc : acceleration;
43989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
43999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (true);
44019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class CalledFromWrongThreadException extends AndroidRuntimeException {
44059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CalledFromWrongThreadException(String msg) {
44069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(msg);
44079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SurfaceHolder mHolder = new SurfaceHolder() {
44119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // we only need a SurfaceHolder for opengl. it would be nice
44129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to implement everything else though, especially the callback
44139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // support (opengl doesn't make use of it right now, but eventually
44149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // will).
44159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface getSurface() {
44169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSurface;
44179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isCreating() {
44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
44219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void addCallback(Callback callback) {
44249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void removeCallback(Callback callback) {
44279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setFixedSize(int width, int height) {
44309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setSizeFromLayout() {
44339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setFormat(int format) {
44369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setType(int type) {
44399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setKeepScreenOn(boolean screenOn) {
44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Canvas lockCanvas() {
44459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
44469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Canvas lockCanvas(Rect dirty) {
44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unlockCanvasAndPost(Canvas canvas) {
44539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Rect getSurfaceFrame() {
44559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
44569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
44589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static RunQueue getRunQueue() {
44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RunQueue rq = sRunQueues.get();
44619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rq != null) {
44629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return rq;
44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        rq = new RunQueue();
44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sRunQueues.set(rq);
44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return rq;
44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44688506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
44699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final class RunQueue {
44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ArrayList<HandlerAction> mActions = new ArrayList<HandlerAction>();
44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void post(Runnable action) {
44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            postDelayed(action, 0);
44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void postDelayed(Runnable action, long delayMillis) {
44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            HandlerAction handlerAction = new HandlerAction();
44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.action = action;
44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.delay = delayMillis;
44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mActions.add(handlerAction);
44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void removeCallbacks(Runnable action) {
44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HandlerAction handlerAction = new HandlerAction();
44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.action = action;
44929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
44949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ArrayList<HandlerAction> actions = mActions;
44959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (actions.remove(handlerAction)) {
44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Keep going
44989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void executeActions(Handler handler) {
45039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
45049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ArrayList<HandlerAction> actions = mActions;
45059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int count = actions.size();
45069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < count; i++) {
45089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final HandlerAction handlerAction = actions.get(i);
45099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    handler.postDelayed(handlerAction.action, handlerAction.delay);
45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
451215df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy                actions.clear();
45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static class HandlerAction {
45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Runnable action;
45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long delay;
45199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
45219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public boolean equals(Object o) {
45229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (this == o) return true;
45239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (o == null || getClass() != o.getClass()) return false;
45249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                HandlerAction that = (HandlerAction) o;
45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return !(action != null ? !action.equals(that.action) : that.action != null);
45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
45319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int hashCode() {
45329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int result = action != null ? action.hashCode() : 0;
45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = 31 * result + (int) (delay ^ (delay >>> 32));
45349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return result;
45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45398643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
45408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * Class for managing the accessibility interaction connection
45418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * based on the global accessibility state.
45428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
45438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final class AccessibilityInteractionConnectionManager
45448643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            implements AccessibilityStateChangeListener {
45458643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void onAccessibilityStateChanged(boolean enabled) {
45468643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (enabled) {
45478643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                ensureConnection();
45488643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            } else {
45498643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                ensureNoConnection();
45508643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
45518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
45528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void ensureConnection() {
45548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final boolean registered = mAttachInfo.mAccessibilityWindowId != View.NO_ID;
45558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (!registered) {
45568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAttachInfo.mAccessibilityWindowId =
45578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    mAccessibilityManager.addAccessibilityInteractionConnection(mWindow,
45586dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                            new AccessibilityInteractionConnection(ViewRootImpl.this));
45598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
45608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
45618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void ensureNoConnection() {
45638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final boolean registered = mAttachInfo.mAccessibilityWindowId != View.NO_ID;
45648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (registered) {
45658643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAttachInfo.mAccessibilityWindowId = View.NO_ID;
45668643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAccessibilityManager.removeAccessibilityInteractionConnection(mWindow);
45678643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
45688643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
45698643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
45708643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45718643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
45728643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * This class is an interface this ViewAncestor provides to the
45738643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * AccessibilityManagerService to the latter can interact with
45748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * the view hierarchy in this ViewAncestor.
45758643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
4576af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov    static final class AccessibilityInteractionConnection
45778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            extends IAccessibilityInteractionConnection.Stub {
4578af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov        private final WeakReference<ViewRootImpl> mRootImpl;
45798643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45806dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        AccessibilityInteractionConnection(ViewRootImpl viewAncestor) {
4581af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov            mRootImpl = new WeakReference<ViewRootImpl>(viewAncestor);
45828643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
45838643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByAccessibilityId(int accessibilityId,
45858bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
45868bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interrogatingPid, long interrogatingTid) {
4587af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov            ViewRootImpl viewRootImpl = mRootImpl.get();
4588af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov            if (viewRootImpl != null) {
4589af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
4590601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .findAccessibilityNodeInfoByAccessibilityIdClientThread(accessibilityId,
45918bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                        interactionId, callback, interrogatingPid, interrogatingTid);
4592601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
45938643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
45948643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
45958643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void performAccessibilityAction(int accessibilityId, int action,
45968bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
45978bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interogatingPid, long interrogatingTid) {
4598af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov            ViewRootImpl viewRootImpl = mRootImpl.get();
4599af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov            if (viewRootImpl != null) {
4600af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
4601601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov                    .performAccessibilityActionClientThread(accessibilityId, action, interactionId,
46028bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                            callback, interogatingPid, interrogatingTid);
46038643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46048643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
46058643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46068643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByViewId(int viewId,
46078bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
46088bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interrogatingPid, long interrogatingTid) {
4609af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov            ViewRootImpl viewRootImpl = mRootImpl.get();
4610af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov            if (viewRootImpl != null) {
4611af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
46128bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                    .findAccessibilityNodeInfoByViewIdClientThread(viewId, interactionId, callback,
46138bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                            interrogatingPid, interrogatingTid);
46148643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46158643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
46168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
4617eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        public void findAccessibilityNodeInfosByViewText(String text, int accessibilityId,
46188bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
46198bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interrogatingPid, long interrogatingTid) {
4620af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov            ViewRootImpl viewRootImpl = mRootImpl.get();
4621af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov            if (viewRootImpl != null) {
4622af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
4623eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                    .findAccessibilityNodeInfosByViewTextClientThread(text, accessibilityId,
46248bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                            interactionId, callback, interrogatingPid, interrogatingTid);
46258643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46268643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
46278643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
46288643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46298643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
46308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * Class for managing accessibility interactions initiated from the system
46318643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * and targeting the view hierarchy. A *ClientThread method is to be
46328643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * called from the interaction connection this ViewAncestor gives the
46338643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * system to talk to it and a corresponding *UiThread method that is executed
46348643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * on the UI thread.
46358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
46368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final class AccessibilityInteractionController {
46378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private static final int POOL_SIZE = 5;
46388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46398643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private ArrayList<AccessibilityNodeInfo> mTempAccessibilityNodeInfoList =
46408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            new ArrayList<AccessibilityNodeInfo>();
46418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        // Reusable poolable arguments for interacting with the view hierarchy
46438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        // to fit more arguments than Message and to avoid sharing objects between
46448643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        // two messages since several threads can send messages concurrently.
46458643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private final Pool<SomeArgs> mPool = Pools.synchronizedPool(Pools.finitePool(
46468643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                new PoolableManager<SomeArgs>() {
46478643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    public SomeArgs newInstance() {
46488643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        return new SomeArgs();
46498643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    }
46508643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    public void onAcquired(SomeArgs info) {
46528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        /* do nothing */
46538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    }
46548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    public void onReleased(SomeArgs info) {
46568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        info.clear();
46578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    }
46588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }, POOL_SIZE)
46598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        );
46608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public class SomeArgs implements Poolable<SomeArgs> {
46628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            private SomeArgs mNext;
46638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            private boolean mIsPooled;
46648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46658643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public Object arg1;
46668643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public Object arg2;
46678643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public int argi1;
46688643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public int argi2;
46698643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public int argi3;
46708643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46718643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public SomeArgs getNextPoolable() {
46728643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return mNext;
46738643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46758643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public boolean isPooled() {
46768643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return mIsPooled;
46778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46788643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46798643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public void setNextPoolable(SomeArgs args) {
46808643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mNext = args;
46818643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46828643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46838643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public void setPooled(boolean isPooled) {
46848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mIsPooled = isPooled;
46858643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46868643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46878643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            private void clear() {
46888643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                arg1 = null;
46898643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                arg2 = null;
46908643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                argi1 = 0;
46918643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                argi2 = 0;
46928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                argi3 = 0;
46938643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
46948643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
46958643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
46968643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByAccessibilityIdClientThread(int accessibilityId,
46978bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
46988bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interrogatingPid, long interrogatingTid) {
46998643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            Message message = Message.obtain();
47008643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID;
47018643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.arg1 = accessibilityId;
47028643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.arg2 = interactionId;
47038643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.obj = callback;
47048bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // If the interrogation is performed by the same thread as the main UI
47058bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // thread in this process, set the message as a static reference so
47068bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // after this call completes the same thread but in the interrogating
47078bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // client can handle the message to generate the result.
47088bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            if (interrogatingPid == Process.myPid()
47098bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                    && interrogatingTid == Looper.getMainLooper().getThread().getId()) {
47108bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                message.setTarget(ViewRootImpl.this);
47118bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                AccessibilityInteractionClient.getInstance().setSameThreadMessage(message);
47128bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            } else {
47138bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                sendMessage(message);
47148bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            }
47158643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
47168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
47178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByAccessibilityIdUiThread(Message message) {
47188643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int accessibilityId = message.arg1;
47198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int interactionId = message.arg2;
47208643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
47218643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) message.obj;
47228643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
47238dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            AccessibilityNodeInfo info = null;
47248dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            try {
47252cdedffcfa5594f9d516fa235d5edf4d4f92c21dSvetoslav Ganov                View target = findViewByAccessibilityId(accessibilityId);
47262cdedffcfa5594f9d516fa235d5edf4d4f92c21dSvetoslav Ganov                if (target != null) {
47278dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    info = target.createAccessibilityNodeInfo();
47288dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
47298dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
47308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                try {
47318643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    callback.setFindAccessibilityNodeInfoResult(info, interactionId);
47328643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                } catch (RemoteException re) {
47338643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    /* ignore - the other side will time out */
47348643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }
47358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
47368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
47378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
47388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByViewIdClientThread(int viewId, int interactionId,
47398bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                IAccessibilityInteractionConnectionCallback callback, int interrogatingPid,
47408bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                long interrogatingTid) {
47418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            Message message = Message.obtain();
47428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID;
47438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.arg1 = viewId;
47448643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.arg2 = interactionId;
47458643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.obj = callback;
47468bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // If the interrogation is performed by the same thread as the main UI
47478bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // thread in this process, set the message as a static reference so
47488bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // after this call completes the same thread but in the interrogating
47498bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // client can handle the message to generate the result.
47508bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            if (interrogatingPid == Process.myPid()
47518bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                    && interrogatingTid == Looper.getMainLooper().getThread().getId()) {
47528bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                message.setTarget(ViewRootImpl.this);
47538bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                AccessibilityInteractionClient.getInstance().setSameThreadMessage(message);
47548bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            } else {
47558bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                sendMessage(message);
47568bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            }
47578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
47588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
47598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByViewIdUiThread(Message message) {
47608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int viewId = message.arg1;
47618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int interactionId = message.arg2;
47628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
47638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) message.obj;
47648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
47658dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            AccessibilityNodeInfo info = null;
47668dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            try {
47676dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                View root = ViewRootImpl.this.mView;
47688dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                View target = root.findViewById(viewId);
47690b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov                if (target != null && target.getVisibility() == View.VISIBLE) {
47708dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    info = target.createAccessibilityNodeInfo();
47718dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
47728dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
47738643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                try {
47748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    callback.setFindAccessibilityNodeInfoResult(info, interactionId);
47758643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                } catch (RemoteException re) {
47768643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    /* ignore - the other side will time out */
47778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }
47788643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
47798643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
47808643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
4781eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        public void findAccessibilityNodeInfosByViewTextClientThread(String text,
4782eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                int accessibilityViewId, int interactionId,
47838bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                IAccessibilityInteractionConnectionCallback callback, int interrogatingPid,
47848bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                long interrogatingTid) {
47858643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            Message message = Message.obtain();
47868643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT;
47878643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = mPool.acquire();
47888643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.arg1 = text;
4789eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            args.argi1 = accessibilityViewId;
4790eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            args.argi2 = interactionId;
47918643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.arg2 = callback;
47928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.obj = args;
47938bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // If the interrogation is performed by the same thread as the main UI
47948bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // thread in this process, set the message as a static reference so
47958bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // after this call completes the same thread but in the interrogating
47968bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // client can handle the message to generate the result.
47978bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            if (interrogatingPid == Process.myPid()
47988bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                    && interrogatingTid == Looper.getMainLooper().getThread().getId()) {
47998bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                message.setTarget(ViewRootImpl.this);
48008bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                AccessibilityInteractionClient.getInstance().setSameThreadMessage(message);
48018bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            } else {
48028bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                sendMessage(message);
48038bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            }
48048643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
48058643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
48068643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfosByViewTextUiThread(Message message) {
48078643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = (SomeArgs) message.obj;
48088643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final String text = (String) args.arg1;
4809eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            final int accessibilityViewId = args.argi1;
4810eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            final int interactionId = args.argi2;
48118643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
48128643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) args.arg2;
48138643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            mPool.release(args);
48148643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
48158dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            List<AccessibilityNodeInfo> infos = null;
48168dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            try {
48178dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                ArrayList<View> foundViews = mAttachInfo.mFocusablesTempList;
48188dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                foundViews.clear();
48198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
48200b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov                View root = null;
4821eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                if (accessibilityViewId != View.NO_ID) {
4822eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                    root = findViewByAccessibilityId(accessibilityViewId);
4823eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                } else {
48246dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn                    root = ViewRootImpl.this.mView;
4825eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                }
4826eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
48270b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov                if (root == null || root.getVisibility() != View.VISIBLE) {
4828eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                    return;
4829eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                }
4830eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
4831ea515aeafa01de6f50c854ee381b972ef2478284Svetoslav Ganov                root.findViewsWithText(foundViews, text, View.FIND_VIEWS_WITH_TEXT
4832ea515aeafa01de6f50c854ee381b972ef2478284Svetoslav Ganov                        | View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
48338dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                if (foundViews.isEmpty()) {
48348dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    return;
48358dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
48368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
48378dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                infos = mTempAccessibilityNodeInfoList;
48388dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                infos.clear();
48398643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
48408dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                final int viewCount = foundViews.size();
48418dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                for (int i = 0; i < viewCount; i++) {
48428dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    View foundView = foundViews.get(i);
48430b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov                    if (foundView.getVisibility() == View.VISIBLE) {
4844ea1da3d2e61625afcc7753ba2e03c5d2fb565daeSvetoslav Ganov                        infos.add(foundView.createAccessibilityNodeInfo());
4845ea1da3d2e61625afcc7753ba2e03c5d2fb565daeSvetoslav Ganov                    }
48468dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                 }
48478dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
48488dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                try {
48498dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    callback.setFindAccessibilityNodeInfosResult(infos, interactionId);
48508dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                } catch (RemoteException re) {
48518dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    /* ignore - the other side will time out */
48528dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
48538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
48548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
48558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
48568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void performAccessibilityActionClientThread(int accessibilityId, int action,
48578bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
48588bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interogatingPid, long interrogatingTid) {
48598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            Message message = Message.obtain();
48608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.what = DO_PERFORM_ACCESSIBILITY_ACTION;
48618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = mPool.acquire();
48628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.argi1 = accessibilityId;
48638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.argi2 = action;
48648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.argi3 = interactionId;
48658643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.arg1 = callback;
48668643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.obj = args;
48678bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // If the interrogation is performed by the same thread as the main UI
48688bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // thread in this process, set the message as a static reference so
48698bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // after this call completes the same thread but in the interrogating
48708bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // client can handle the message to generate the result.
48718bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            if (interogatingPid == Process.myPid()
48728bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                    && interrogatingTid == Looper.getMainLooper().getThread().getId()) {
48738bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                message.setTarget(ViewRootImpl.this);
48748bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                AccessibilityInteractionClient.getInstance().setSameThreadMessage(message);
48758bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            } else {
48768bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                sendMessage(message);
48778bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            }
48788643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
48798643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
48808643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void perfromAccessibilityActionUiThread(Message message) {
48818643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = (SomeArgs) message.obj;
48828643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int accessibilityId = args.argi1;
48838643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int action = args.argi2;
48848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final int interactionId = args.argi3;
48858643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
48868643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) args.arg1;
48878643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            mPool.release(args);
48888643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
48898643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            boolean succeeded = false;
48908643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            try {
48918dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                switch (action) {
48928dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    case AccessibilityNodeInfo.ACTION_FOCUS: {
48938dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                        succeeded = performActionFocus(accessibilityId);
48948dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    } break;
48958dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    case AccessibilityNodeInfo.ACTION_CLEAR_FOCUS: {
48968dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                        succeeded = performActionClearFocus(accessibilityId);
48978dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    } break;
48988dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    case AccessibilityNodeInfo.ACTION_SELECT: {
48998dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                        succeeded = performActionSelect(accessibilityId);
49008dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    } break;
49018dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    case AccessibilityNodeInfo.ACTION_CLEAR_SELECTION: {
49028dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                        succeeded = performActionClearSelection(accessibilityId);
49038dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    } break;
49048dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
49058dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
49068dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                try {
49078dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    callback.setPerformAccessibilityActionResult(succeeded, interactionId);
49088dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                } catch (RemoteException re) {
49098dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    /* ignore - the other side will time out */
49108dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
49118643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49128643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
49138643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49148643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private boolean performActionFocus(int accessibilityId) {
49158643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            View target = findViewByAccessibilityId(accessibilityId);
49160b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov            if (target == null || target.getVisibility() != View.VISIBLE) {
49178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
49188643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            // Get out of touch mode since accessibility wants to move focus around.
49208643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            ensureTouchMode(false);
49218643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            return target.requestFocus();
49228643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
49238643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49248643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private boolean performActionClearFocus(int accessibilityId) {
49258643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            View target = findViewByAccessibilityId(accessibilityId);
49260b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov            if (target == null || target.getVisibility() != View.VISIBLE) {
49278643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
49288643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49298643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (!target.isFocused()) {
49308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
49318643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49328643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            target.clearFocus();
49338643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            return !target.isFocused();
49348643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
49358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private boolean performActionSelect(int accessibilityId) {
49378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            View target = findViewByAccessibilityId(accessibilityId);
49380b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov            if (target == null || target.getVisibility() != View.VISIBLE) {
49398643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
49408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (target.isSelected()) {
49428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
49438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49448643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            target.setSelected(true);
49458643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            return target.isSelected();
49468643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
49478643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49488643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private boolean performActionClearSelection(int accessibilityId) {
49498643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            View target = findViewByAccessibilityId(accessibilityId);
49500b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov            if (target == null || target.getVisibility() != View.VISIBLE) {
49518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
49528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (!target.isSelected()) {
49548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return false;
49558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            target.setSelected(false);
49578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            return !target.isSelected();
49588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
49598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private View findViewByAccessibilityId(int accessibilityId) {
49616dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            View root = ViewRootImpl.this.mView;
49628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (root == null) {
49638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return null;
49648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49652cdedffcfa5594f9d516fa235d5edf4d4f92c21dSvetoslav Ganov            View foundView = root.findViewByAccessibilityId(accessibilityId);
49662cdedffcfa5594f9d516fa235d5edf4d4f92c21dSvetoslav Ganov            if (foundView != null && foundView.getVisibility() != View.VISIBLE) {
49670b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov                return null;
49680b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov            }
49690b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov            return foundView;
49708643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
49718643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
4972eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
4973a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov    private class SendWindowContentChangedAccessibilityEvent implements Runnable {
4974a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        public volatile boolean mIsPending;
4975a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov
4976eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        public void run() {
4977eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            if (mView != null) {
497882e236d72ac197d6673d0b4d484fe5f0b9436731Svetoslav Ganov                mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
4979a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov                mIsPending = false;
4980eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            }
4981eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
4982eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
49839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4984