ViewRootImpl.java revision a998dff5d49a423aaf7097aa8f96bf5bdc681d25
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;
21c38fa1f63674971f9ac6ced1a449fb81026b62f7Chet Haaseimport android.animation.ValueAnimator;
226b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.app.ActivityManagerNative;
236b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.ClipDescription;
246b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.ComponentCallbacks;
25c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.content.ComponentCallbacks2;
266b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.Context;
27211370fd943cf26905001b38b8b1791851b26adcRomain Guyimport android.content.pm.ApplicationInfo;
286b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.pm.PackageManager;
296b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.res.CompatibilityInfo;
306b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.res.Configuration;
316b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.content.res.Resources;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
330f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackbornimport android.graphics.Paint;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat;
352c095f367779ef32130c72849936a2e3013c8492Christopher Tateimport android.graphics.Point;
36a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tateimport android.graphics.PointF;
376b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.graphics.PorterDuff;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region;
406b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.media.AudioManager;
416b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Binder;
426b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Bundle;
436b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Debug;
446b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Handler;
456b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.LatencyTimer;
466b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Looper;
476b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Message;
486b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.ParcelFileDescriptor;
497e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guyimport android.os.PowerManager;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
516b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.RemoteException;
526b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.SystemClock;
5359a12cae208790dd202656f50a40a53ef49baeebRomain Guyimport android.os.SystemProperties;
54481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brownimport android.os.Trace;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
569189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshimaimport android.util.DisplayMetrics;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
586b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.util.Log;
598643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.util.Pool;
608643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.util.Poolable;
618643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.util.PoolableManager;
628643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.util.Pools;
63949dbf7629eacfa02f267ade4643c98aef8e42a9Chet Haaseimport android.util.Slog;
6457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganovimport android.util.SparseLongArray;
65711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackbornimport android.util.TypedValue;
66a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brownimport android.view.View.AttachInfo;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.MeasureSpec;
6875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEvent;
698bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganovimport android.view.accessibility.AccessibilityInteractionClient;
7075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
718643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
728643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo;
73021078554b902179442a345a9d080a165c3b5139Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeProvider;
748643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.IAccessibilityInteractionConnection;
758643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.IAccessibilityInteractionConnectionCallback;
760f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackbornimport android.view.animation.AccelerateDecelerateInterpolator;
770f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackbornimport android.view.animation.Interpolator;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputConnection;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.Scroller;
818643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
8286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport com.android.internal.policy.PolicyManager;
836b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.BaseSurfaceHolder;
846b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.IInputMethodCallback;
856b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.IInputMethodSession;
866b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.RootViewSurfaceTaker;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
906b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport java.lang.ref.WeakReference;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
9257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganovimport java.util.HashMap;
938643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport java.util.List;
9457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganovimport java.util.Map;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The top of a view hierarchy, implementing the needed protocol between View
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the WindowManager.  This is for the most part an internal implementation
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * detail of {@link WindowManagerImpl}.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
103812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy@SuppressWarnings({"EmptyCatchBlock", "PointlessBooleanExpression"})
104a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brownpublic final class ViewRootImpl implements ViewParent,
1054a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks {
10670a3f677bf015d8641f41d149b76d362bb2b801cDianne Hackborn    private static final String TAG = "ViewRootImpl";
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DBG = false;
108812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy    private static final boolean LOCAL_LOGV = false;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @noinspection PointlessBooleanExpression*/
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_DRAW = false || LOCAL_LOGV;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_LAYOUT = false || LOCAL_LOGV;
112711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn    private static final boolean DEBUG_DIALOG = false || LOCAL_LOGV;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_INPUT_RESIZE = false || LOCAL_LOGV;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_ORIENTATION = false || LOCAL_LOGV;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_TRACKBALL = false || LOCAL_LOGV;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_IMF = false || LOCAL_LOGV;
117694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    private static final boolean DEBUG_CONFIGURATION = false || LOCAL_LOGV;
1182f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private static final boolean DEBUG_FPS = false;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12051e4d4db296c252641161b39e98f49acebc46062Romain Guy    private static final boolean USE_RENDER_THREAD = false;
12151e4d4db296c252641161b39e98f49acebc46062Romain Guy
12259a12cae208790dd202656f50a40a53ef49baeebRomain Guy    /**
12359a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * Set this system property to true to force the view hierarchy to render
12459a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * at 60 Hz. This can be used to measure the potential framerate.
12559a12cae208790dd202656f50a40a53ef49baeebRomain Guy     */
12659a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private static final String PROPERTY_PROFILE_RENDERING = "viewancestor.profile_rendering";
12759a12cae208790dd202656f50a40a53ef49baeebRomain Guy
12853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    private static final boolean MEASURE_LATENCY = false;
12953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    private static LatencyTimer lt;
13053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Maximum time we allow the user to roll the trackball enough to generate
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a key event, before resetting the counters.
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int MAX_TRACKBALL_DELAY = 250;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static IWindowSession sWindowSession;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final Object mStaticInit = new Object();
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean mInitialized = false;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final ThreadLocal<RunQueue> sRunQueues = new ThreadLocal<RunQueue>();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1442a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    static final ArrayList<Runnable> sFirstDrawHandlers = new ArrayList<Runnable>();
1452a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    static boolean sFirstDrawComplete = false;
1462a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn
147e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    static final ArrayList<ComponentCallbacks> sConfigCallbacks
148e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            = new ArrayList<ComponentCallbacks>();
14959a12cae208790dd202656f50a40a53ef49baeebRomain Guy
150211370fd943cf26905001b38b8b1791851b26adcRomain Guy    private static boolean sUseRenderThread = false;
151211370fd943cf26905001b38b8b1791851b26adcRomain Guy    private static boolean sRenderThreadQueried = false;
152211370fd943cf26905001b38b8b1791851b26adcRomain Guy    private static final Object[] sRenderThreadQueryLock = new Object[0];
153211370fd943cf26905001b38b8b1791851b26adcRomain Guy
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastTrackballTime = 0;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final TrackballAxis mTrackballAxisX = new TrackballAxis();
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final TrackballAxis mTrackballAxisY = new TrackballAxis();
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
158cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickXDirection;
159cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickYDirection;
160cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickXKeyCode;
161cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickYKeyCode;
162cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final int[] mTmpLocation = new int[2];
1648506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
165711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn    final TypedValue mTmpValue = new TypedValue();
166711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final InputMethodCallback mInputMethodCallback;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Thread mThread;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowLeaked mLocation;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowManager.LayoutParams mWindowAttributes = new WindowManager.LayoutParams();
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final W mWindow;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
176180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn    final int mTargetSdkVersion;
177180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn
1789a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    int mSeq;
1799a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mView;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mFocusedView;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mRealFocusedView;  // this is not set to null in touch mode
183b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov    View mOldFocusedView;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mViewVisibility;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppVisible = true;
186180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn    int mOrigWindowType = -1;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
188ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    // Set to true if the owner of this window is in the stopped state,
189ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    // so the window should no longer be active.
190ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    boolean mStopped = false;
191ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1925fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    boolean mLastInCompatMode = false;
1935fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
194d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    SurfaceHolder.Callback2 mSurfaceHolderCallback;
195dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    BaseSurfaceHolder mSurfaceHolder;
196dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    boolean mIsCreating;
197dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    boolean mDrawingAllowed;
198dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Region mTransparentRegion;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Region mPreviousTransparentRegion;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mWidth;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mHeight;
2047d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    Rect mDirty;
2057d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    final Rect mCurrentDirty = new Rect();
2067d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    final Rect mPreviousDirty = new Rect();
207bb93d5598daa3312318c29401815bddf1df8c4deRomain Guy    boolean mIsAnimating;
2088506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
20964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    CompatibilityInfo.Translator mTranslator;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final View.AttachInfo mAttachInfo;
21246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    InputChannel mInputChannel;
2131e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn    InputQueue.Callback mInputQueueCallback;
2141e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn    InputQueue mInputQueue;
21586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato    FallbackEventHandler mFallbackEventHandler;
21696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    Choreographer mChoreographer;
217a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mTempRect; // used in the transaction to not thrash the heap.
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mVisRect; // used to retrieve visible rect of focused view.
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mTraversalScheduled;
222e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown    int mTraversalBarrier;
2234e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    long mLastTraversalFinishedTimeNanos;
22496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    long mLastDrawFinishedTimeNanos;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWillDrawSoon;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLayoutRequested;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFirst;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mReportNextDraw;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFullRedrawNeeded;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mNewSurfaceNeeded;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mHasHadWindowFocus;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLastWasImTarget;
2334952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
2344952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    // Pool of queued input events.
2354952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private static final int MAX_QUEUED_INPUT_EVENT_POOL_SIZE = 10;
2364952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private QueuedInputEvent mQueuedInputEventPool;
2374952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private int mQueuedInputEventPoolSize;
2384952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
2394952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    // Input event queue.
2404952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    QueuedInputEvent mFirstPendingInputEvent;
2414952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    QueuedInputEvent mCurrentInputEvent;
24296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    boolean mProcessInputEventsScheduled;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWindowAttributesChanged = false;
245f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy    int mWindowAttributesChangesFlag = 0;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These can be accessed by any thread, must be protected with a lock.
2485583dc630f861dd9a3006390db227f9296007e00Mathias Agopian    // Surface can never be reassigned or cleared (use Surface.clear()).
2495583dc630f861dd9a3006390db227f9296007e00Mathias Agopian    private final Surface mSurface = new Surface();
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAdded;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAddedTouchMode;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2545fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    CompatibilityInfoHolder mCompatibilityInfo;
2555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ int mAddNesting;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are accessed by multiple threads.
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mWinFrame; // frame given by window manager.
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mPendingVisibleInsets = new Rect();
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mPendingContentInsets = new Rect();
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ViewTreeObserver.InternalInsetsInfo mLastGivenInsets
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new ViewTreeObserver.InternalInsetsInfo();
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
266694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    final Configuration mLastConfiguration = new Configuration();
267694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    final Configuration mPendingConfiguration = new Configuration();
26859a12cae208790dd202656f50a40a53ef49baeebRomain Guy
269e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    class ResizedInfo {
270e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Rect coveredInsets;
271e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Rect visibleInsets;
272e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Configuration newConfig;
273e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
274e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScrollMayChange;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSoftInputMode;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mLastScrolledFocus;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mScrollY;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mCurScrollY;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Scroller mScroller;
2817d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    HardwareLayer mResizeBuffer;
2827d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    long mResizeBufferStartTime;
2837d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    int mResizeBufferDuration;
2840f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    static final Interpolator mResizeInterpolator = new AccelerateDecelerateInterpolator();
285cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    private ArrayList<LayoutTransition> mPendingTransitions;
2868506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2878506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy    final ViewConfiguration mViewConfiguration;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /* Drag/drop */
290a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    ClipDescription mDragDescription;
291a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    View mCurrentDragView;
2927fb8b565f9cd2ec6a63ff4d8a89f98f68a1a138cChristopher Tate    volatile Object mLocalDragState;
293a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    final PointF mDragPoint = new PointF();
2942c095f367779ef32130c72849936a2e3013c8492Christopher Tate    final PointF mLastTouchPoint = new PointF();
29559a12cae208790dd202656f50a40a53ef49baeebRomain Guy
29659a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private boolean mProfileRendering;
29759a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private Thread mRenderProfiler;
29859a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private volatile boolean mRenderProfilingEnabled;
299a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3002f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    // Variables to track frames per second, enabled via DEBUG_FPS flag
3012f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private long mFpsStartTime = -1;
3022f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private long mFpsPrevTime = -1;
3032f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private int mFpsNumFrames;
3042f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
30551e4d4db296c252641161b39e98f49acebc46062Romain Guy    private final ArrayList<DisplayList> mDisplayLists = new ArrayList<DisplayList>(24);
30651e4d4db296c252641161b39e98f49acebc46062Romain Guy
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * see {@link #playSoundEffect(int)}
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AudioManager mAudioManager;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3128643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final AccessibilityManager mAccessibilityManager;
3138643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
3145ac84423a28fea4924eb1c389d647defe1c1b93cGilles Debunne    AccessibilityInteractionController mAccessibilityInteractionController;
3158643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
3168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    AccessibilityInteractionConnectionManager mAccessibilityInteractionConnectionManager;
3178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
318a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov    SendWindowContentChangedAccessibilityEvent mSendWindowContentChangedAccessibilityEvent;
319eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
32057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov    AccessibilityNodePrefetcher mAccessibilityNodePrefetcher;
32179311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov
32211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn    private final int mDensity;
323b08013c312e3d849029a2f4c11889274c00f438dAdam Powell
32421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /**
32521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * Consistency verifier for debugging purposes.
32621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     */
32721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    protected final InputEventConsistencyVerifier mInputEventConsistencyVerifier =
32821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            InputEventConsistencyVerifier.isInstrumentationEnabled() ?
32921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                    new InputEventConsistencyVerifier(this, 0) : null;
33021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
3314c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    public static IWindowSession getWindowSession(Looper mainLooper) {
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStaticInit) {
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mInitialized) {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
3354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    InputMethodManager imm = InputMethodManager.getInstance(mainLooper);
336c38fa1f63674971f9ac6ced1a449fb81026b62f7Chet Haase                    IWindowManager windowManager = Display.getWindowManager();
337c38fa1f63674971f9ac6ced1a449fb81026b62f7Chet Haase                    sWindowSession = windowManager.openSession(
33844bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn                            imm.getClient(), imm.getInputContext());
339c38fa1f63674971f9ac6ced1a449fb81026b62f7Chet Haase                    float animatorScale = windowManager.getAnimationScale(2);
340c38fa1f63674971f9ac6ced1a449fb81026b62f7Chet Haase                    ValueAnimator.setDurationScale(animatorScale);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInitialized = true;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3454c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            return sWindowSession;
3464c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
3474c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
3489a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn
3499a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    static final class SystemUiVisibilityInfo {
3509a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int seq;
3519a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int globalVisibility;
3529a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int localValue;
3539a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int localChanges;
3549a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    }
3554c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
3566dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn    public ViewRootImpl(Context context) {
3574c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        super();
3584c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
359812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy        if (MEASURE_LATENCY) {
360812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy            if (lt == null) {
361812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                lt = new LatencyTimer(100, 1000);
362812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy            }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3654c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // Initialize the statics when this class is first instantiated. This is
3664c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // done here instead of in the static block because Zygote does not
3674c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // allow the spawning of threads.
3684c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWindowSession(context.getMainLooper());
3698643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread = Thread.currentThread();
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocation = new WindowLeaked(null);
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocation.fillInStackTrace();
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWidth = -1;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeight = -1;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDirty = new Rect();
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTempRect = new Rect();
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVisRect = new Rect();
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWinFrame = new Rect();
379fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy        mWindow = new W(this);
380180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn        mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInputMethodCallback = new InputMethodCallback(this);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewVisibility = View.GONE;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransparentRegion = new Region();
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPreviousTransparentRegion = new Region();
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = true; // true for the first time the view is added
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAdded = false;
3878643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager = AccessibilityManager.getInstance(context);
3888643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityInteractionConnectionManager =
3898643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            new AccessibilityInteractionConnectionManager();
39000d0c14a0fe8e6dff8dd3e230ee4b61dd275f860Svetoslav Ganov        mAccessibilityManager.addAccessibilityStateChangeListener(
39100d0c14a0fe8e6dff8dd3e230ee4b61dd275f860Svetoslav Ganov                mAccessibilityInteractionConnectionManager);
392a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mAttachInfo = new View.AttachInfo(sWindowSession, mWindow, this, mHandler, this);
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewConfiguration = ViewConfiguration.get(context);
39411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        mDensity = context.getResources().getDisplayMetrics().densityDpi;
39586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato        mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context);
39659a12cae208790dd202656f50a40a53ef49baeebRomain Guy        mProfileRendering = Boolean.parseBoolean(
39759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                SystemProperties.get(PROPERTY_PROFILE_RENDERING, "false"));
39896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        mChoreographer = Choreographer.getInstance();
3997e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy
4007e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
4017e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        mAttachInfo.mScreenOn = powerManager.isScreenOn();
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
404211370fd943cf26905001b38b8b1791851b26adcRomain Guy    /**
405211370fd943cf26905001b38b8b1791851b26adcRomain Guy     * @return True if the application requests the use of a separate render thread,
406211370fd943cf26905001b38b8b1791851b26adcRomain Guy     *         false otherwise
407211370fd943cf26905001b38b8b1791851b26adcRomain Guy     */
408211370fd943cf26905001b38b8b1791851b26adcRomain Guy    private static boolean isRenderThreadRequested(Context context) {
40951e4d4db296c252641161b39e98f49acebc46062Romain Guy        if (USE_RENDER_THREAD) {
41051e4d4db296c252641161b39e98f49acebc46062Romain Guy            synchronized (sRenderThreadQueryLock) {
41151e4d4db296c252641161b39e98f49acebc46062Romain Guy                if (!sRenderThreadQueried) {
41251e4d4db296c252641161b39e98f49acebc46062Romain Guy                    final PackageManager packageManager = context.getPackageManager();
41351e4d4db296c252641161b39e98f49acebc46062Romain Guy                    final String packageName = context.getApplicationInfo().packageName;
41451e4d4db296c252641161b39e98f49acebc46062Romain Guy                    try {
41551e4d4db296c252641161b39e98f49acebc46062Romain Guy                        ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName,
41651e4d4db296c252641161b39e98f49acebc46062Romain Guy                                PackageManager.GET_META_DATA);
41751e4d4db296c252641161b39e98f49acebc46062Romain Guy                        if (applicationInfo.metaData != null) {
41851e4d4db296c252641161b39e98f49acebc46062Romain Guy                            sUseRenderThread = applicationInfo.metaData.getBoolean(
41951e4d4db296c252641161b39e98f49acebc46062Romain Guy                                    "android.graphics.renderThread", false);
42051e4d4db296c252641161b39e98f49acebc46062Romain Guy                        }
42151e4d4db296c252641161b39e98f49acebc46062Romain Guy                    } catch (PackageManager.NameNotFoundException e) {
42251e4d4db296c252641161b39e98f49acebc46062Romain Guy                    } finally {
42351e4d4db296c252641161b39e98f49acebc46062Romain Guy                        sRenderThreadQueried = true;
424211370fd943cf26905001b38b8b1791851b26adcRomain Guy                    }
425211370fd943cf26905001b38b8b1791851b26adcRomain Guy                }
42651e4d4db296c252641161b39e98f49acebc46062Romain Guy                return sUseRenderThread;
427211370fd943cf26905001b38b8b1791851b26adcRomain Guy            }
42851e4d4db296c252641161b39e98f49acebc46062Romain Guy        } else {
42951e4d4db296c252641161b39e98f49acebc46062Romain Guy            return false;
430211370fd943cf26905001b38b8b1791851b26adcRomain Guy        }
431211370fd943cf26905001b38b8b1791851b26adcRomain Guy    }
432211370fd943cf26905001b38b8b1791851b26adcRomain Guy
4332a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    public static void addFirstDrawHandler(Runnable callback) {
4342a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        synchronized (sFirstDrawHandlers) {
4352a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            if (!sFirstDrawComplete) {
4362a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                sFirstDrawHandlers.add(callback);
4372a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            }
4382a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        }
4392a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    }
4402a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn
441e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    public static void addConfigCallback(ComponentCallbacks callback) {
442e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        synchronized (sConfigCallbacks) {
443e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            sConfigCallbacks.add(callback);
444e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
445e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
446e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // FIXME for perf testing only
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mProfile = false;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to profile the next traversal call.
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * FIXME for perf testing only. Remove eventually
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void profile() {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProfile = true;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether we are in touch mode. Calling this method triggers an IPC
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call and should be avoided whenever possible.
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True, if the device is in touch mode, false otherwise.
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean isInTouchMode() {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInitialized) {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sWindowSession.getInTouchMode();
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We have one child
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
479e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView == null) {
4828169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                mView = view;
48386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                mFallbackEventHandler.setView(view);
4849189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                mWindowAttributes.copyFrom(attrs);
4851ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                attrs = mWindowAttributes;
486e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
487dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (view instanceof RootViewSurfaceTaker) {
488dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolderCallback =
489dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            ((RootViewSurfaceTaker)view).willYouTakeTheSurface();
490dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (mSurfaceHolderCallback != null) {
491dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolder = new TakenSurfaceHolder();
492289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn                        mSurfaceHolder.setFormat(PixelFormat.UNKNOWN);
493dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
494dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
4951aec9a2212dd76e47ce0215006e5415b6430b54fRomain Guy
4965fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                CompatibilityInfo compatibilityInfo = mCompatibilityInfo.get();
497589cebe2d58591403de4a77077941c0454bc91bcMitsuru Oshima                mTranslator = compatibilityInfo.getTranslator();
49838ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
499856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy                // If the application owns the surface, don't enable hardware acceleration
500856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy                if (mSurfaceHolder == null) {
501211370fd943cf26905001b38b8b1791851b26adcRomain Guy                    enableHardwareAcceleration(mView.getContext(), attrs);
50238ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima                }
50338ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
504e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima                boolean restore = false;
50535b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                if (mTranslator != null) {
506856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy                    mSurface.setCompatibilityTranslator(mTranslator);
507e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima                    restore = true;
50864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    attrs.backup();
50964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateWindowLayout(attrs);
5109189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                }
51164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (DEBUG_LAYOUT) Log.d(TAG, "WindowLayout in setView:" + attrs);
51264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
5131ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                if (!compatibilityInfo.supportsScreen()) {
5141ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                    attrs.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
5155fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    mLastInCompatMode = true;
5161ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                }
5171ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSoftInputMode = attrs.softInputMode;
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowAttributesChanged = true;
520f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy                mWindowAttributesChangesFlag = WindowManager.LayoutParams.EVERYTHING_CHANGED;
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mRootView = view;
52235b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                mAttachInfo.mScalingRequired = mTranslator != null;
52364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                mAttachInfo.mApplicationScale =
52464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        mTranslator == null ? 1.0f : mTranslator.applicationScale;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (panelParentView != null) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mPanelParentWindowToken
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            = panelParentView.getApplicationWindowToken();
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAdded = true;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int res; /* = WindowManagerImpl.ADD_OKAY; */
5318506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Schedule the first layout -before- adding to the window
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // manager, to make sure we do the relayout before receiving
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // any other events from the system.
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout();
536cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if ((mWindowAttributes.inputFeatures
537cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) {
538cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    mInputChannel = new InputChannel();
539cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                }
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
541180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                    mOrigWindowType = mWindowAttributes.type;
5429a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                    res = sWindowSession.add(mWindow, mSeq, mWindowAttributes,
54346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                            getHostVisibility(), mAttachInfo.mContentInsets,
54446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                            mInputChannel);
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAdded = false;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView = null;
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mRootView = null;
54946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    mInputChannel = null;
55086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                    mFallbackEventHandler.setView(null);
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unscheduleTraversals();
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException("Adding window failed", e);
55364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                } finally {
55464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    if (restore) {
55564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        attrs.restore();
55664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
55846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
55964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (mTranslator != null) {
56064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateRectInScreenToAppWindow(mAttachInfo.mContentInsets);
5619189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                }
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingContentInsets.set(mAttachInfo.mContentInsets);
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingVisibleInsets.set(0, 0, 0, 0);
564711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                if (DEBUG_LAYOUT) Log.v(TAG, "Added window " + mWindow);
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (res < WindowManagerImpl.ADD_OKAY) {
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView = null;
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mRootView = null;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAdded = false;
56986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                    mFallbackEventHandler.setView(null);
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unscheduleTraversals();
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (res) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_BAD_APP_TOKEN:
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN:
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- token " + attrs.token
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is not valid; is your activity running?");
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_NOT_APP_TOKEN:
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- token " + attrs.token
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is not for an application");
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_APP_EXITING:
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- app for token " + attrs.token
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is exiting");
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_DUPLICATE_ADD:
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- window " + mWindow
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " has already been added");
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_STARTING_NOT_NEEDED:
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Silently ignore -- we would have just removed it
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // right away, anyway.
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_MULTIPLE_SINGLETON:
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window " + mWindow +
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                " -- another window of this type already exists");
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_PERMISSION_DENIED:
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window " + mWindow +
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                " -- permission denied for this window type");
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException(
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Unable to add window -- unknown error code " + res);
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
60546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
60600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (view instanceof RootViewSurfaceTaker) {
60700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputQueueCallback =
60800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        ((RootViewSurfaceTaker)view).willYouTakeTheInputQueue();
60900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                }
610cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (mInputChannel != null) {
611cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    if (mInputQueueCallback != null) {
612cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        mInputQueue = new InputQueue(mInputChannel);
613cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        mInputQueueCallback.onInputQueueCreated(mInputQueue);
614cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    } else {
61532cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                        mInputEventReceiver = new WindowInputEventReceiver(mInputChannel,
61632cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                                Looper.myLooper());
617cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    }
61846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                }
6198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                view.assignParent(this);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAddedTouchMode = (res&WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE) != 0;
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppVisible = (res&WindowManagerImpl.ADD_FLAG_APP_VISIBLE) != 0;
6238643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
6248643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                if (mAccessibilityManager.isEnabled()) {
6258643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    mAccessibilityInteractionConnectionManager.ensureConnection();
6268643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6318ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    void destroyHardwareResources() {
63265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mAttachInfo.mHardwareRenderer != null) {
63365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer.isEnabled()) {
63465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                mAttachInfo.mHardwareRenderer.destroyLayers(mView);
63565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
63665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            mAttachInfo.mHardwareRenderer.destroy(false);
63765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
63865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
63965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
64031f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy    void terminateHardwareResources() {
64131f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy        if (mAttachInfo.mHardwareRenderer != null) {
64231f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy            mAttachInfo.mHardwareRenderer.destroyHardwareResources(mView);
64331f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy            mAttachInfo.mHardwareRenderer.destroy(false);
64431f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy        }
64531f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy    }
64631f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy
64765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void destroyHardwareLayers() {
64865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mThread != Thread.currentThread()) {
64965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer != null &&
65065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    mAttachInfo.mHardwareRenderer.isEnabled()) {
651c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                HardwareRenderer.trimMemory(ComponentCallbacks2.TRIM_MEMORY_MODERATE);
65265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
65365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        } else {
65465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer != null &&
65565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    mAttachInfo.mHardwareRenderer.isEnabled()) {
65665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                mAttachInfo.mHardwareRenderer.destroyLayers(mView);
65765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
6586d7475d666baefaa3ba9f0dcee25238739454241Romain Guy        }
6596d7475d666baefaa3ba9f0dcee25238739454241Romain Guy    }
6606d7475d666baefaa3ba9f0dcee25238739454241Romain Guy
661211370fd943cf26905001b38b8b1791851b26adcRomain Guy    private void enableHardwareAcceleration(Context context, WindowManager.LayoutParams attrs) {
6627eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        mAttachInfo.mHardwareAccelerated = false;
6637eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        mAttachInfo.mHardwareAccelerationRequested = false;
6644f6aff386045000c2c03b903c7109cb42092b7eaRomain Guy
665856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy        // Don't enable hardware acceleration when the application is in compatibility mode
666856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy        if (mTranslator != null) return;
667856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy
6687eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        // Try to enable hardware acceleration if requested
6691b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller        final boolean hardwareAccelerated =
6701b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller                (attrs.flags & WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0;
6711b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller
672566c33105a76c6a02333db8b775721990bc6cca4Romain Guy        if (hardwareAccelerated) {
6731af23a32d879db330eb5a08b21090ec60b604a32Romain Guy            if (!HardwareRenderer.isAvailable()) {
6741af23a32d879db330eb5a08b21090ec60b604a32Romain Guy                return;
6751af23a32d879db330eb5a08b21090ec60b604a32Romain Guy            }
6761af23a32d879db330eb5a08b21090ec60b604a32Romain Guy
6775d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // Persistent processes (including the system) should not do
6785d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // accelerated rendering on low-end devices.  In that case,
6795d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // sRendererDisabled will be set.  In addition, the system process
6805d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // itself should never do accelerated rendering.  In that case, both
6815d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // sRendererDisabled and sSystemRendererDisabled are set.  When
6825d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // sSystemRendererDisabled is set, PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED
6835d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // can be used by code on the system process to escape that and enable
6845d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // HW accelerated drawing.  (This is basically for the lock screen.)
6855d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn
6865d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            final boolean fakeHwAccelerated = (attrs.privateFlags &
6875d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                    WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED) != 0;
6885d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            final boolean forceHwAccelerated = (attrs.privateFlags &
6895d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                    WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED) != 0;
6905d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn
6915d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            if (!HardwareRenderer.sRendererDisabled || (HardwareRenderer.sSystemRendererDisabled
6925d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                    && forceHwAccelerated)) {
693ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                // Don't enable hardware acceleration when we're not on the main thread
694211370fd943cf26905001b38b8b1791851b26adcRomain Guy                if (!HardwareRenderer.sSystemRendererDisabled &&
695211370fd943cf26905001b38b8b1791851b26adcRomain Guy                        Looper.getMainLooper() != Looper.myLooper()) {
696211370fd943cf26905001b38b8b1791851b26adcRomain Guy                    Log.w(HardwareRenderer.LOG_TAG, "Attempting to initialize hardware "
697ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                            + "acceleration outside of the main thread, aborting");
698ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                    return;
699ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                }
700ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy
70151e4d4db296c252641161b39e98f49acebc46062Romain Guy                final boolean renderThread = isRenderThreadRequested(context);
702211370fd943cf26905001b38b8b1791851b26adcRomain Guy                if (renderThread) {
703211370fd943cf26905001b38b8b1791851b26adcRomain Guy                    Log.i(HardwareRenderer.LOG_TAG, "Render threat initiated");
704211370fd943cf26905001b38b8b1791851b26adcRomain Guy                }
705211370fd943cf26905001b38b8b1791851b26adcRomain Guy
706b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                if (mAttachInfo.mHardwareRenderer != null) {
707b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                    mAttachInfo.mHardwareRenderer.destroy(true);
708211370fd943cf26905001b38b8b1791851b26adcRomain Guy                }
709211370fd943cf26905001b38b8b1791851b26adcRomain Guy
710211370fd943cf26905001b38b8b1791851b26adcRomain Guy                final boolean translucent = attrs.format != PixelFormat.OPAQUE;
711b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                mAttachInfo.mHardwareRenderer = HardwareRenderer.createGlRenderer(2, translucent);
7127eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                mAttachInfo.mHardwareAccelerated = mAttachInfo.mHardwareAccelerationRequested
7137eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                        = mAttachInfo.mHardwareRenderer != null;
714211370fd943cf26905001b38b8b1791851b26adcRomain Guy
7155d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            } else if (fakeHwAccelerated) {
7165d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // The window had wanted to use hardware acceleration, but this
7175d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // is not allowed in its process.  By setting this flag, it can
7185d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // still render as if it was accelerated.  This is basically for
7195d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // the preview windows the window manager shows for launching
7205d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // applications, so they will look more like the app being launched.
72107213e6d8895af10951851435adf96a779863f6cDianne Hackborn                mAttachInfo.mHardwareAccelerationRequested = true;
722e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            }
723e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        }
724e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
725e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getView() {
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mView;
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowLeaked getLocation() {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLocation;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setLayoutParams(WindowManager.LayoutParams attrs, boolean newView) {
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
736105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            int oldSoftInputMode = mWindowAttributes.softInputMode;
7375a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            // preserve compatible window flag if exists.
7385a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            int compatibleWindowFlag =
7395a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima                mWindowAttributes.flags & WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
740f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy            mWindowAttributesChangesFlag = mWindowAttributes.copyFrom(attrs);
7415a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            mWindowAttributes.flags |= compatibleWindowFlag;
7425a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newView) {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSoftInputMode = attrs.softInputMode;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout();
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
747105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            // Don't lose the mode we last auto-computed.
748105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if ((attrs.softInputMode&WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
749105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED) {
750105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mWindowAttributes.softInputMode = (mWindowAttributes.softInputMode
751105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        & ~WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
752105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        | (oldSoftInputMode
753105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                & WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST);
754105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = true;
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void handleAppVisibility(boolean visible) {
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAppVisible != visible) {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppVisible = visible;
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void handleGetNewSurface() {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNewSurfaceNeeded = true;
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullRedrawNeeded = true;
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scheduleTraversals();
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
773bb9908b828a8cfd5965553be66faa6af89973697Romain Guy    void handleScreenStateChange(boolean on) {
7747e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        if (on != mAttachInfo.mScreenOn) {
7757e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            mAttachInfo.mScreenOn = on;
776bb9908b828a8cfd5965553be66faa6af89973697Romain Guy            if (mView != null) {
777bb9908b828a8cfd5965553be66faa6af89973697Romain Guy                mView.dispatchScreenStateChanged(on ? View.SCREEN_STATE_ON : View.SCREEN_STATE_OFF);
778bb9908b828a8cfd5965553be66faa6af89973697Romain Guy            }
7797e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            if (on) {
7807e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy                mFullRedrawNeeded = true;
7817e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy                scheduleTraversals();
7827e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            }
7837e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        }
7847e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy    }
7857e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestLayout() {
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutRequested = true;
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scheduleTraversals();
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isLayoutRequested() {
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLayoutRequested;
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
802cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy    void invalidate() {
803cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        mDirty.set(0, 0, mWidth, mHeight);
804cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        scheduleTraversals();
805cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy    }
806cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void invalidateChild(View child, Rect dirty) {
808cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        invalidateChildInParent(null, dirty);
809cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy    }
810cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
811cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy    public ViewParent invalidateChildInParent(int[] location, Rect dirty) {
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
81364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (DEBUG_DRAW) Log.v(TAG, "Invalidate child: " + dirty);
814cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
81570d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase        if (dirty == null) {
81670d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase            invalidate();
817cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy            return null;
81870d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase        }
819cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
82064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mCurScrollY != 0 || mTranslator != null) {
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTempRect.set(dirty);
8221e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            dirty = mTempRect;
8238169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            if (mCurScrollY != 0) {
824cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy                dirty.offset(0, -mCurScrollY);
8258169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            }
82664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            if (mTranslator != null) {
8271e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy                mTranslator.translateRectInAppWindowToScreen(dirty);
8281e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            }
8291e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            if (mAttachInfo.mScalingRequired) {
8301e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy                dirty.inset(-1, -1);
8318169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            }
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
833cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
834cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        final Rect localDirty = mDirty;
835cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        if (!localDirty.isEmpty() && !localDirty.contains(dirty)) {
83602ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy            mAttachInfo.mSetIgnoreDirtyState = true;
8377d695945801b8e6a051440731b500ff109e4b5abRomain Guy            mAttachInfo.mIgnoreDirtyState = true;
8387d695945801b8e6a051440731b500ff109e4b5abRomain Guy        }
839cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
840cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        // Add the new dirty rect to the current one
841cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        localDirty.union(dirty.left, dirty.top, dirty.right, dirty.bottom);
842cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        // Intersect with the bounds of the window to skip
843cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        // updates that lie outside of the visible region
8447b2f8b8fb7064a1d3b6d942b978c30c24c9d7299Romain Guy        final float appScale = mAttachInfo.mApplicationScale;
8457b2f8b8fb7064a1d3b6d942b978c30c24c9d7299Romain Guy        localDirty.intersect(0, 0,
8467b2f8b8fb7064a1d3b6d942b978c30c24c9d7299Romain Guy                (int) (mWidth * appScale + 0.5f), (int) (mHeight * appScale + 0.5f));
847cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWillDrawSoon) {
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
851cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
852cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        return null;
8530d9275e565551eed57297627188aa39f3897a50bRomain Guy    }
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
855ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    void setStopped(boolean stopped) {
856ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        if (mStopped != stopped) {
857ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            mStopped = stopped;
858ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (!stopped) {
859ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                scheduleTraversals();
860ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            }
861ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        }
862ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    }
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
864cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy    public ViewParent getParent() {
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (child != mView) {
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("child is not mine, honest!");
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Note: don't apply scroll offset, because we want to know its
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // visibility in the virtual canvas being given to the view hierarchy.
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return r.intersect(0, 0, mWidth, mHeight);
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void bringChildToFront(View child) {
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void scheduleTraversals() {
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mTraversalScheduled) {
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTraversalScheduled = true;
883e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown            mTraversalBarrier = mHandler.getLooper().postSyncBarrier();
8844a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown            scheduleFrame();
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unscheduleTraversals() {
889e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown        if (mTraversalScheduled) {
890e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown            mTraversalScheduled = false;
891e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown            mHandler.getLooper().removeSyncBarrier(mTraversalBarrier);
892e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown        }
89396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    }
89496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
8954a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown    void scheduleFrame() {
8964a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        if (!mFrameScheduled) {
8974a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown            mFrameScheduled = true;
8987ae9d5faad5816f7e567ec1ec77e78d746cf7e5cJeff Brown            mChoreographer.postDrawCallback(mFrameRunnable, null);
8994a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        }
9004a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown    }
9014a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown
9024a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown    void unscheduleFrame() {
903e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown        unscheduleTraversals();
904e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown
9054a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        if (mFrameScheduled) {
9064a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown            mFrameScheduled = false;
9077ae9d5faad5816f7e567ec1ec77e78d746cf7e5cJeff Brown            mChoreographer.removeDrawCallbacks(mFrameRunnable, null);
9084a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        }
9094a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown    }
9104a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown
9114a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown    void doFrame() {
912072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        if (mInputEventReceiver != null) {
913072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            mInputEventReceiver.consumeBatchedInputEvents();
914072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        }
915072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        doProcessInputEvents();
916072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTraversalScheduled) {
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTraversalScheduled = false;
919e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown            mHandler.getLooper().removeSyncBarrier(mTraversalBarrier);
92096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            doTraversal();
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int getHostVisibility() {
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAppVisible ? mView.getVisibility() : View.GONE;
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9278506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
9287d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    void disposeResizeBuffer() {
9297d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
9307d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            mResizeBuffer.destroy();
9317d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            mResizeBuffer = null;
9320f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
9330f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
9340f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
935cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    /**
936cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * Add LayoutTransition to the list of transitions to be started in the next traversal.
937cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * This list will be cleared after the transitions on the list are start()'ed. These
938cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * transitionsa re added by LayoutTransition itself when it sets up animations. The setup
939cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * happens during the layout phase of traversal, which we want to complete before any of the
940cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * animations are started (because those animations may side-effect properties that layout
941cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * depends upon, like the bounding rectangles of the affected views). So we add the transition
942cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * to the list and it is started just prior to starting the drawing phase of traversal.
943cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     *
944cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * @param transition The LayoutTransition to be started on the next traversal.
945cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     *
946cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * @hide
947cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     */
948cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    public void requestTransitionStart(LayoutTransition transition) {
949cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase        if (mPendingTransitions == null || !mPendingTransitions.contains(transition)) {
950cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            if (mPendingTransitions == null) {
951cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase                 mPendingTransitions = new ArrayList<LayoutTransition>();
952cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            }
953cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            mPendingTransitions.add(transition);
954cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase        }
955cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    }
956cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase
95796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    private void doTraversal() {
95896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (mProfile) {
95996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            Debug.startMethodTracing("ViewAncestor");
96096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
96196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
96296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        final long traversalStartTime;
96396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (ViewDebug.DEBUG_LATENCY) {
96496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            traversalStartTime = System.nanoTime();
96596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            if (mLastTraversalFinishedTimeNanos != 0) {
96696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                Log.d(ViewDebug.DEBUG_LATENCY_TAG, "Starting performTraversals(); it has been "
96796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        + ((traversalStartTime - mLastTraversalFinishedTimeNanos) * 0.000001f)
96896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        + "ms since the last traversals finished.");
96996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            } else {
97096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                Log.d(ViewDebug.DEBUG_LATENCY_TAG, "Starting performTraversals().");
97196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            }
97296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
97396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
974481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        Trace.traceBegin(Trace.TRACE_TAG_VIEW, "performTraversals");
975481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        try {
976481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            performTraversals();
977481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        } finally {
978481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            Trace.traceEnd(Trace.TRACE_TAG_VIEW);
979481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        }
98096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
98196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (ViewDebug.DEBUG_LATENCY) {
98296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            long now = System.nanoTime();
98396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            Log.d(ViewDebug.DEBUG_LATENCY_TAG, "performTraversals() took "
98496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    + ((now - traversalStartTime) * 0.000001f)
98596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    + "ms.");
98696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mLastTraversalFinishedTimeNanos = now;
98796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
98896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
98996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (mProfile) {
99096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            Debug.stopMethodTracing();
99196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mProfile = false;
99296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
99396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    }
99496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void performTraversals() {
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // cache mView since it is used so much below...
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View host = mView;
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) {
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("======================================");
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("performTraversals");
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.debug();
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (host == null || !mAdded)
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWillDrawSoon = true;
1009711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn        boolean windowSizeMayChange = false;
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean newSurface = false;
1011dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        boolean surfaceChanged = false;
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManager.LayoutParams lp = mWindowAttributes;
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int desiredWindowWidth;
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int desiredWindowHeight;
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int childWidthMeasureSpec;
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int childHeightMeasureSpec;
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View.AttachInfo attachInfo = mAttachInfo;
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int viewVisibility = getHostVisibility();
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean viewVisibilityChanged = mViewVisibility != viewVisibility
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || mNewSurfaceNeeded;
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManager.LayoutParams params = null;
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindowAttributesChanged) {
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = false;
1028dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            surfaceChanged = true;
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            params = lp;
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10315fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatibilityInfo compatibilityInfo = mCompatibilityInfo.get();
10325fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (compatibilityInfo.supportsScreen() == mLastInCompatMode) {
10335fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            params = lp;
103496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mFullRedrawNeeded = true;
10355fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            mLayoutRequested = true;
10365fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            if (mLastInCompatMode) {
10375fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                params.flags &= ~WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
10385fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                mLastInCompatMode = false;
10395fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            } else {
10405fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                params.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
10415fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                mLastInCompatMode = true;
10425fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            }
10435fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
1044f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy
1045f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy        mWindowAttributesChangesFlag = 0;
1046f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy
104764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        Rect frame = mWinFrame;
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst) {
104996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mFullRedrawNeeded = true;
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutRequested = true;
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1052a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            if (lp.type == WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL) {
1053a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                // NOTE -- system code, won't try to do compat mode.
1054a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                Display disp = WindowManagerImpl.getDefault().getDefaultDisplay();
1055bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                Point size = new Point();
1056bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                disp.getRealSize(size);
1057bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                desiredWindowWidth = size.x;
1058bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                desiredWindowHeight = size.y;
1059a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            } else {
1060a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                DisplayMetrics packageMetrics =
1061a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    mView.getContext().getResources().getDisplayMetrics();
1062a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                desiredWindowWidth = packageMetrics.widthPixels;
1063a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                desiredWindowHeight = packageMetrics.heightPixels;
1064a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            }
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // For the very first time, tell the view hierarchy that it
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // is attached to the window.  Note that at this point the surface
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // object is not initialized to its backing store, but soon it
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // will be (assuming the window is visible).
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mSurface = mSurface;
1071c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // We used to use the following condition to choose 32 bits drawing caches:
1072c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // PixelFormat.hasAlpha(lp.format) || lp.format == PixelFormat.RGBX_8888
1073c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // However, windows are now always 32 bits by default, so choose 32 bits
1074c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            attachInfo.mUse32BitDrawingCache = true;
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mHasWindowFocus = false;
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowVisibility = viewVisibility;
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mRecomputeGlobalAttributes = false;
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mKeepScreenOn = false;
1079664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            attachInfo.mSystemUiVisibility = 0;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            viewVisibilityChanged = false;
1081694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            mLastConfiguration.setTo(host.getResources().getConfiguration());
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.dispatchAttachedToWindow(attachInfo, 0);
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Screen on initialized: " + attachInfo.mKeepScreenOn);
108475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
1085fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn            host.fitSystemWindows(mAttachInfo.mContentInsets);
1086fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
108864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            desiredWindowWidth = frame.width();
108964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            desiredWindowHeight = frame.height();
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (desiredWindowWidth != mWidth || desiredWindowHeight != mHeight) {
1091c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                if (DEBUG_ORIENTATION) Log.v(TAG,
109264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        "View " + host + " resized to: " + frame);
109396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mFullRedrawNeeded = true;
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutRequested = true;
1095711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                windowSizeMayChange = true;
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (viewVisibilityChanged) {
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowVisibility = viewVisibility;
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.dispatchWindowVisibilityChanged(viewVisibility);
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility != View.VISIBLE || mNewSurfaceNeeded) {
110365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                destroyHardwareResources();
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.GONE) {
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // After making a window gone, we will count it as being
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // shown for the first time the next time it gets focus.
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHasHadWindowFocus = false;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean insetsChanged = false;
11138506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1114ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        if (mLayoutRequested && !mStopped) {
111515df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy            // Execute enqueued actions on every layout in case a view that was detached
111615df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy            // enqueued an action after being detached
111715df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy            getRunQueue().executeActions(attachInfo.mHandler);
111815df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy
1119711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            final Resources res = mView.getContext().getResources();
1120711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFirst) {
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // make sure touch mode code executes by setting cached value
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to opposite of the added touch mode.
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mInTouchMode = !mAddedTouchMode;
11252d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy                ensureTouchModeLocally(mAddedTouchMode);
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1127fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                if (!mPendingContentInsets.equals(mAttachInfo.mContentInsets)) {
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    insetsChanged = true;
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1130fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                if (!mPendingVisibleInsets.equals(mAttachInfo.mVisibleInsets)) {
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets);
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Visible insets changing to: "
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mVisibleInsets);
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) {
1137711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    windowSizeMayChange = true;
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    if (lp.type == WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL) {
1140a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        // NOTE -- system code, won't try to do compat mode.
1141a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        Display disp = WindowManagerImpl.getDefault().getDefaultDisplay();
1142bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        Point size = new Point();
1143bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        disp.getRealSize(size);
1144bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        desiredWindowWidth = size.x;
1145bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        desiredWindowHeight = size.y;
1146a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    } else {
1147a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        DisplayMetrics packageMetrics = res.getDisplayMetrics();
1148a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        desiredWindowWidth = packageMetrics.widthPixels;
1149a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        desiredWindowHeight = packageMetrics.heightPixels;
1150a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    }
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ask host how big it wants to be
1155c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            if (DEBUG_ORIENTATION || DEBUG_LAYOUT) Log.v(TAG,
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Measuring " + host + " in display " + desiredWindowWidth
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + "x" + desiredWindowHeight + "...");
1158711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
1159711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            boolean goodMeasure = false;
1160a3e3c533ee4af6d9dba43b70ac421ba880992961Adam Powell            if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT) {
1161711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // On large screens, we don't want to allow dialogs to just
1162711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // stretch to fill the entire width of the screen to display
1163711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // one line of text.  First try doing the layout at a smaller
1164711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                // size to see if it will fit.
1165711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                final DisplayMetrics packageMetrics = res.getDisplayMetrics();
1166711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                res.getValue(com.android.internal.R.dimen.config_prefDialogWidth, mTmpValue, true);
1167711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                int baseSize = 0;
1168711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                if (mTmpValue.type == TypedValue.TYPE_DIMENSION) {
1169711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    baseSize = (int)mTmpValue.getDimension(packageMetrics);
1170711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                }
1171711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": baseSize=" + baseSize);
11727d3a5bcf300aea7bffb1d46f28e244ca807f5e82Dianne Hackborn                if (baseSize != 0 && desiredWindowWidth > baseSize) {
1173711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width);
1174711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height);
1175711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1176711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured ("
1177189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                            + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")");
1178189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                    if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) {
1179711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        goodMeasure = true;
1180711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    } else {
1181711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        // Didn't fit in that size... try expanding a bit.
1182711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        baseSize = (baseSize+desiredWindowWidth)/2;
1183711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": next baseSize="
1184711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                                + baseSize);
1185189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                        childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width);
1186711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1187711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured ("
1188189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                                + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")");
1189189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                        if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) {
1190711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                            if (DEBUG_DIALOG) Log.v(TAG, "Good!");
1191711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                            goodMeasure = true;
1192711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                        }
1193711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    }
1194711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                }
1195711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            }
1196711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
1197711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            if (!goodMeasure) {
1198711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width);
1199711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height);
1200711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1201aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell                if (mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight()) {
1202aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell                    windowSizeMayChange = true;
1203aa0b92ce2b51987e9c864164234fe968ab5b9311Adam Powell                }
1204711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            }
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) {
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("======================================");
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("performTraversals -- after measure");
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.debug();
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12136e81e57b526a3e23038e365414acbb9688f8e44aRomain Guy        if (attachInfo.mRecomputeGlobalAttributes && host.mAttachInfo != null) {
1214664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            //Log.i(TAG, "Computing view hierarchy attributes!");
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mRecomputeGlobalAttributes = false;
1216664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            boolean oldScreenOn = attachInfo.mKeepScreenOn;
1217664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            int oldVis = attachInfo.mSystemUiVisibility;
12189a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            boolean oldHasSystemUiListeners = attachInfo.mHasSystemUiListeners;
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mKeepScreenOn = false;
1220664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            attachInfo.mSystemUiVisibility = 0;
1221664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            attachInfo.mHasSystemUiListeners = false;
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.dispatchCollectViewAttributes(0);
122314782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato            if (attachInfo.mKeepScreenOn != oldScreenOn
122414782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato                    || attachInfo.mSystemUiVisibility != oldVis
12259a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                    || attachInfo.mHasSystemUiListeners != oldHasSystemUiListeners) {
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                params = lp;
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12299a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        if (attachInfo.mForceReportNewAttributes) {
12309a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            attachInfo.mForceReportNewAttributes = false;
12319a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            params = lp;
12329a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst || attachInfo.mViewVisibilityChanged) {
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mViewVisibilityChanged = false;
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resizeMode = mSoftInputMode &
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST;
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are in auto resize mode, then we need to determine
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // what mode to use now.
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (resizeMode == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED) {
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = attachInfo.mScrollContainers.size();
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (attachInfo.mScrollContainers.get(i).isShown()) {
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resizeMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (resizeMode == 0) {
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resizeMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN;
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((lp.softInputMode &
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST) != resizeMode) {
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lp.softInputMode = (lp.softInputMode &
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ~WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST) |
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            resizeMode;
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    params = lp;
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12598506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (params != null && (host.mPrivateFlags & View.REQUEST_TRANSPARENT_REGIONS) != 0) {
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!PixelFormat.formatHasAlpha(params.format)) {
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                params.format = PixelFormat.TRANSLUCENT;
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1266711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn        boolean windowShouldResize = mLayoutRequested && windowSizeMayChange
1267189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn            && ((mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight())
12682e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                || (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT &&
12692e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                        frame.width() < desiredWindowWidth && frame.width() != mWidth)
12702e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                || (lp.height == ViewGroup.LayoutParams.WRAP_CONTENT &&
12712e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                        frame.height() < desiredWindowHeight && frame.height() != mHeight));
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean computesInternalInsets =
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attachInfo.mTreeObserver.hasComputeInternalInsetsListeners();
1275812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean insetsPending = false;
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int relayoutResult = 0;
1278812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
1279812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy        if (mFirst || windowShouldResize || insetsChanged ||
1280812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                viewVisibilityChanged || params != null) {
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.VISIBLE) {
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this window is giving internal insets to the window
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // manager, and it is being added or changing its visibility,
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // then we want to first give the window manager "fake"
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // insets to cause it to effectively ignore the content of
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the window during layout.  This avoids it briefly causing
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // other windows to resize/move based on the raw frame of the
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, waiting until we can finish laying out this window
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // and get back to the window manager with the ultimately
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // computed insets.
1292812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                insetsPending = computesInternalInsets && (mFirst || viewVisibilityChanged);
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1295dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            if (mSurfaceHolder != null) {
1296dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mSurfaceHolder.mSurfaceLock.lock();
1297dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mDrawingAllowed = true;
1298dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            }
1299812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
1300c361da845a205ac35e724c0ca436744d483de7aaRomain Guy            boolean hwInitialized = false;
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean contentInsetsChanged = false;
130213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            boolean visibleInsetsChanged;
1303dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            boolean hadSurface = mSurface.isValid();
1304812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int fl = 0;
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (params != null) {
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fl = params.flags;
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (attachInfo.mKeepScreenOn) {
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
131214782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato                    params.subtreeSystemUiVisibility = attachInfo.mSystemUiVisibility;
13139a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                    params.hasSystemUiListeners = attachInfo.mHasSystemUiListeners;
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13158169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                if (DEBUG_LAYOUT) {
1316189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                    Log.i(TAG, "host=w:" + host.getMeasuredWidth() + ", h:" +
1317189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                            host.getMeasuredHeight() + ", params=" + params);
13188169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                }
13192a83f001fdb189f945e82e81e717ba204824b112Romain Guy
13202a83f001fdb189f945e82e81e717ba204824b112Romain Guy                final int surfaceGenerationId = mSurface.getGenerationId();
13218169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                relayoutResult = relayoutWindow(params, viewVisibility, insetsPending);
13228169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (params != null) {
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    params.flags = fl;
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_LAYOUT) Log.v(TAG, "relayout: frame=" + frame.toShortString()
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " content=" + mPendingContentInsets.toShortString()
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " visible=" + mPendingVisibleInsets.toShortString()
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " surface=" + mSurface);
13318506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1332694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                if (mPendingConfiguration.seq != 0) {
1333694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (DEBUG_CONFIGURATION) Log.v(TAG, "Visible with new config: "
1334694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            + mPendingConfiguration);
1335694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    updateConfiguration(mPendingConfiguration, !mFirst);
1336694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    mPendingConfiguration.seq = 0;
1337694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                }
1338694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                contentInsetsChanged = !mPendingContentInsets.equals(
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAttachInfo.mContentInsets);
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                visibleInsetsChanged = !mPendingVisibleInsets.equals(
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAttachInfo.mVisibleInsets);
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (contentInsetsChanged) {
1344fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                    if (mWidth > 0 && mHeight > 0 &&
1345fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mSurface != null && mSurface.isValid() &&
1346fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            !mAttachInfo.mTurnOffWindowResizeAnim &&
1347fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mAttachInfo.mHardwareRenderer != null &&
1348fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mAttachInfo.mHardwareRenderer.isEnabled() &&
1349fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mAttachInfo.mHardwareRenderer.validate() &&
1350fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            lp != null && !PixelFormat.formatHasAlpha(lp.format)) {
1351fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
1352fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        disposeResizeBuffer();
1353fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
1354fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        boolean completed = false;
135508837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                        HardwareCanvas hwRendererCanvas = mAttachInfo.mHardwareRenderer.getCanvas();
135608837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                        HardwareCanvas layerCanvas = null;
1357fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        try {
1358fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (mResizeBuffer == null) {
1359fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                mResizeBuffer = mAttachInfo.mHardwareRenderer.createHardwareLayer(
1360fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                        mWidth, mHeight, false);
1361fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            } else if (mResizeBuffer.getWidth() != mWidth ||
1362fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    mResizeBuffer.getHeight() != mHeight) {
1363fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                mResizeBuffer.resize(mWidth, mHeight);
1364fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
136508837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas = mResizeBuffer.start(hwRendererCanvas);
136608837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.setViewport(mWidth, mHeight);
136708837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.onPreDraw(null);
136808837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            final int restoreCount = layerCanvas.save();
1369fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
137008837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.drawColor(0xff000000, PorterDuff.Mode.SRC);
1371fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
1372fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            int yoff;
1373fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            final boolean scrolling = mScroller != null
1374fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    && mScroller.computeScrollOffset();
1375fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (scrolling) {
1376fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                yoff = mScroller.getCurrY();
1377fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                mScroller.abortAnimation();
1378fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            } else {
1379fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                yoff = mScrollY;
1380fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1381fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
138208837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.translate(0, -yoff);
1383fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (mTranslator != null) {
138408837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                                mTranslator.translateCanvas(layerCanvas);
1385fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1386fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
138708837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            mView.draw(layerCanvas);
1388fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
1389fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mResizeBufferStartTime = SystemClock.uptimeMillis();
1390fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mResizeBufferDuration = mView.getResources().getInteger(
1391fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    com.android.internal.R.integer.config_mediumAnimTime);
1392fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            completed = true;
1393fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
139408837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.restoreToCount(restoreCount);
1395fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        } catch (OutOfMemoryError e) {
1396fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            Log.w(TAG, "Not enough memory for content change anim buffer", e);
1397fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        } finally {
139808837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            if (layerCanvas != null) {
139908837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                                layerCanvas.onPostDraw();
1400fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1401fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (mResizeBuffer != null) {
140208837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                                mResizeBuffer.end(hwRendererCanvas);
1403fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                if (!completed) {
1404fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    mResizeBuffer.destroy();
1405fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    mResizeBuffer = null;
1406fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                }
1407fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1408fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        }
1409fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                    }
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mContentInsets.set(mPendingContentInsets);
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    host.fitSystemWindows(mAttachInfo.mContentInsets);
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Content insets changing to: "
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mContentInsets);
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visibleInsetsChanged) {
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets);
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Visible insets changing to: "
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mVisibleInsets);
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!hadSurface) {
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mSurface.isValid()) {
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are creating a new surface, then we need to
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // completely redraw it.  Also, when we get to the
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // point of drawing it we will hold off and schedule
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // a new traversal instead.  This is so we can tell the
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // window manager about all of the windows being displayed
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // before actually drawing them, so it can display then
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // all at once.
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newSurface = true;
143196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        mFullRedrawNeeded = true;
143261a6e689188cd8743905e4f7b10440c7e50823f3Jack Palevich                        mPreviousTransparentRegion.setEmpty();
14338506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        if (mAttachInfo.mHardwareRenderer != null) {
1435648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            try {
1436648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                hwInitialized = mAttachInfo.mHardwareRenderer.initialize(mHolder);
1437648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            } catch (Surface.OutOfResourcesException e) {
1438648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Log.e(TAG, "OutOfResourcesException initializing HW surface", e);
1439648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                try {
1440648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    if (!sWindowSession.outOfMemory(mWindow)) {
1441648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                        Slog.w(TAG, "No processes killed for memory; killing self");
1442648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                        Process.killProcess(Process.myPid());
1443648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    }
1444648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                } catch (RemoteException ex) {
1445648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                }
1446648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                mLayoutRequested = true;    // ask wm for a new surface next time.
1447648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                return;
1448648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (!mSurface.isValid()) {
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If the surface has been removed, then reset the scroll
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // positions.
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastScrolledFocus = null;
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mScrollY = mCurScrollY = 0;
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mScroller != null) {
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mScroller.abortAnimation();
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14597d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                    disposeResizeBuffer();
14601d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    // Our surface is gone
14611d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    if (mAttachInfo.mHardwareRenderer != null &&
14621d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                            mAttachInfo.mHardwareRenderer.isEnabled()) {
14631d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                        mAttachInfo.mHardwareRenderer.destroy(true);
14641d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    }
14652a83f001fdb189f945e82e81e717ba204824b112Romain Guy                } else if (surfaceGenerationId != mSurface.getGenerationId() &&
14662a83f001fdb189f945e82e81e717ba204824b112Romain Guy                        mSurfaceHolder == null && mAttachInfo.mHardwareRenderer != null) {
146796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    mFullRedrawNeeded = true;
1468648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    try {
1469648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        mAttachInfo.mHardwareRenderer.updateSurface(mHolder);
1470648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    } catch (Surface.OutOfResourcesException e) {
1471648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        Log.e(TAG, "OutOfResourcesException updating HW surface", e);
1472648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        try {
1473648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            if (!sWindowSession.outOfMemory(mWindow)) {
1474648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Slog.w(TAG, "No processes killed for memory; killing self");
1475648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Process.killProcess(Process.myPid());
1476648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
1477648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        } catch (RemoteException ex) {
1478648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        }
1479648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        mLayoutRequested = true;    // ask wm for a new surface next time.
1480648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        return;
1481648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    }
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14851d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_ORIENTATION) Log.v(
1487c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    TAG, "Relayout returned: frame=" + frame + ", surface=" + mSurface);
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowLeft = frame.left;
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowTop = frame.top;
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // !!FIXME!! This next section handles the case where we did not get the
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // window size we asked for. We should avoid this by getting a maximum size from
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the window session beforehand.
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWidth = frame.width();
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHeight = frame.height();
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1498dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            if (mSurfaceHolder != null) {
1499dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                // The app owns the surface; tell it about what is going on.
1500dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (mSurface.isValid()) {
1501dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    // XXX .copyFrom() doesn't work!
1502dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    //mSurfaceHolder.mSurface.copyFrom(mSurface);
1503dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.mSurface = mSurface;
1504dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
150530bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown                mSurfaceHolder.setSurfaceFrameSize(mWidth, mHeight);
1506dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mSurfaceHolder.mSurfaceLock.unlock();
1507dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (mSurface.isValid()) {
1508dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (!hadSurface) {
1509dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolder.ungetCallbacks();
1510dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
1511dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mIsCreating = true;
1512dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolderCallback.surfaceCreated(mSurfaceHolder);
1513dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1514dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        if (callbacks != null) {
1515dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            for (SurfaceHolder.Callback c : callbacks) {
1516dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                c.surfaceCreated(mSurfaceHolder);
1517dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            }
1518dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1519dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        surfaceChanged = true;
1520dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1521dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (surfaceChanged) {
1522dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolderCallback.surfaceChanged(mSurfaceHolder,
1523dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                lp.format, mWidth, mHeight);
1524dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1525dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        if (callbacks != null) {
1526dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            for (SurfaceHolder.Callback c : callbacks) {
1527dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                c.surfaceChanged(mSurfaceHolder, lp.format,
1528dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                        mWidth, mHeight);
1529dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            }
1530dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1531dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1532dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mIsCreating = false;
1533dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                } else if (hadSurface) {
1534dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.ungetCallbacks();
1535dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1536dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolderCallback.surfaceDestroyed(mSurfaceHolder);
1537dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (callbacks != null) {
1538dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        for (SurfaceHolder.Callback c : callbacks) {
1539dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            c.surfaceDestroyed(mSurfaceHolder);
1540dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1541dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1542dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.mSurfaceLock.lock();
154393c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    try {
154493c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                        mSurfaceHolder.mSurface = new Surface();
154593c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    } finally {
154693c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                        mSurfaceHolder.mSurfaceLock.unlock();
154793c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    }
1548dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
1549dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            }
155053389bdcdf6ffaaec533b73bc1d0abc5807ec7f6Romain Guy
155140e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase            if (mAttachInfo.mHardwareRenderer != null &&
155240e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    mAttachInfo.mHardwareRenderer.isEnabled()) {
155340e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                if (hwInitialized || windowShouldResize ||
155440e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                        mWidth != mAttachInfo.mHardwareRenderer.getWidth() ||
155540e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                        mHeight != mAttachInfo.mHardwareRenderer.getHeight()) {
155640e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    mAttachInfo.mHardwareRenderer.setup(mWidth, mHeight);
155740e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    if (!hwInitialized) {
155840e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                        mAttachInfo.mHardwareRenderer.invalidate(mHolder);
155940e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    }
15607e1160e8664a9c5c79367f4ba3c2266a39bbcef5Romain Guy                }
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1563ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (!mStopped) {
1564ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                boolean focusChangedDueToTouchMode = ensureTouchModeLocally(
15656d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        (relayoutResult&WindowManagerImpl.RELAYOUT_RES_IN_TOUCH_MODE) != 0);
1566ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                if (focusChangedDueToTouchMode || mWidth != host.getMeasuredWidth()
1567ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        || mHeight != host.getMeasuredHeight() || contentInsetsChanged) {
1568ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width);
1569ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height);
1570ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1571ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (DEBUG_LAYOUT) Log.v(TAG, "Ooops, something changed!  mWidth="
1572ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + mWidth + " measuredWidth=" + host.getMeasuredWidth()
1573ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " mHeight=" + mHeight
1574ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " measuredHeight=" + host.getMeasuredHeight()
1575ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " coveredInsetsChanged=" + contentInsetsChanged);
1576ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1577ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                     // Ask host how big it wants to be
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1579ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1580ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // Implementation of weights from WindowManager.LayoutParams
1581ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // We just grow the dimensions as needed and re-measure if
1582ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // needs be
1583ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    int width = host.getMeasuredWidth();
1584ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    int height = host.getMeasuredHeight();
1585ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    boolean measureAgain = false;
1586ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1587ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (lp.horizontalWeight > 0.0f) {
1588ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        width += (int) ((mWidth - width) * lp.horizontalWeight);
1589ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width,
1590ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                MeasureSpec.EXACTLY);
1591ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        measureAgain = true;
1592ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1593ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (lp.verticalWeight > 0.0f) {
1594ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        height += (int) ((mHeight - height) * lp.verticalWeight);
1595ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height,
1596ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                MeasureSpec.EXACTLY);
1597ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        measureAgain = true;
1598ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1599ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1600ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (measureAgain) {
1601ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        if (DEBUG_LAYOUT) Log.v(TAG,
1602ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                "And hey let's measure once more: width=" + width
1603ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                + " height=" + height);
1604ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        host.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1605ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1606ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1607ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    mLayoutRequested = true;
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1612ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        final boolean didLayout = mLayoutRequested && !mStopped;
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean triggerGlobalLayoutListener = didLayout
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || attachInfo.mRecomputeGlobalAttributes;
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (didLayout) {
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutRequested = false;
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrollMayChange = true;
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_ORIENTATION || DEBUG_LAYOUT) Log.v(
1619c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                TAG, "Laying out " + host + " to (" +
1620189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                host.getMeasuredWidth() + ", " + host.getMeasuredHeight() + ")");
162113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            long startTime = 0L;
16225429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy            if (ViewDebug.DEBUG_PROFILE_LAYOUT) {
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                startTime = SystemClock.elapsedRealtime();
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1625189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn            host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
162743a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato            if (false && ViewDebug.consistencyCheckEnabled) {
162813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                if (!host.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_LAYOUT)) {
162913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                    throw new IllegalStateException("The view hierarchy is an inconsistent state,"
163013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                            + "please refer to the logs with the tag "
163113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                            + ViewDebug.CONSISTENCY_LOG_TAG + " for more infomation.");
163213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                }
163313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            }
163413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy
16355429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy            if (ViewDebug.DEBUG_PROFILE_LAYOUT) {
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(60001, SystemClock.elapsedRealtime() - startTime);
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // By this point all views have been sized and positionned
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We can compute the transparent area
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((host.mPrivateFlags & View.REQUEST_TRANSPARENT_REGIONS) != 0) {
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // start out transparent
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // TODO: AVOID THAT CALL BY CACHING THE RESULT?
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.getLocationInWindow(mTmpLocation);
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTransparentRegion.set(mTmpLocation[0], mTmpLocation[1],
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTmpLocation[0] + host.mRight - host.mLeft,
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTmpLocation[1] + host.mBottom - host.mTop);
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.gatherTransparentRegion(mTransparentRegion);
165164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (mTranslator != null) {
165264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateRegionInWindowToScreen(mTransparentRegion);
165364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                }
165464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mTransparentRegion.equals(mPreviousTransparentRegion)) {
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mPreviousTransparentRegion.set(mTransparentRegion);
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // reconfigure window manager
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sWindowSession.setTransparentRegion(mWindow, mTransparentRegion);
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException e) {
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) {
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("======================================");
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("performTraversals -- after setFrame");
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.debug();
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (triggerGlobalLayoutListener) {
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mRecomputeGlobalAttributes = false;
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mTreeObserver.dispatchOnGlobalLayout();
1675eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
1676eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            if (AccessibilityManager.getInstance(host.mContext).isEnabled()) {
1677eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                postSendWindowContentChangedCallback();
1678eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            }
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (computesInternalInsets) {
1682fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Clear the original insets.
1683fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            final ViewTreeObserver.InternalInsetsInfo insets = attachInfo.mGivenInternalInsets;
1684fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            insets.reset();
1685fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1686fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Compute new insets in place.
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mTreeObserver.dispatchOnComputeInternalInsets(insets);
1688fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1689fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Tell the window manager.
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (insetsPending || !mLastGivenInsets.equals(insets)) {
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastGivenInsets.set(insets);
1692fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1693fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                // Translate insets to screen coordinates if needed.
1694fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Rect contentInsets;
1695fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Rect visibleInsets;
1696fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Region touchableRegion;
1697fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                if (mTranslator != null) {
1698fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    contentInsets = mTranslator.getTranslatedContentInsets(insets.contentInsets);
1699fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    visibleInsets = mTranslator.getTranslatedVisibleInsets(insets.visibleInsets);
1700fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    touchableRegion = mTranslator.getTranslatedTouchableArea(insets.touchableRegion);
1701fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                } else {
1702fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    contentInsets = insets.contentInsets;
1703fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    visibleInsets = insets.visibleInsets;
1704fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    touchableRegion = insets.touchableRegion;
1705fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                }
1706fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sWindowSession.setInsets(mWindow, insets.mTouchableInsets,
1709fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                            contentInsets, visibleInsets, touchableRegion);
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17148506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst) {
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // handle first focus request
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: mView.hasFocus()="
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mView.hasFocus());
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView != null) {
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mView.hasFocus()) {
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView.requestFocus(View.FOCUS_FORWARD);
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFocusedView = mRealFocusedView = mView.findFocus();
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: requested focused view="
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mFocusedView);
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRealFocusedView = mView.findFocus();
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: existing focused view="
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mRealFocusedView);
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = false;
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWillDrawSoon = false;
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNewSurfaceNeeded = false;
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewVisibility = viewVisibility;
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mHasWindowFocus) {
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean imTarget = WindowManager.LayoutParams
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .mayUseInputMethod(mWindowAttributes.flags);
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imTarget != mLastWasImTarget) {
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWasImTarget = imTarget;
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InputMethodManager imm = InputMethodManager.peekInstance();
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (imm != null && imTarget) {
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imm.startGettingWindowFocus(mView);
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imm.onWindowFocus(mView, mView.findFocus(),
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mWindowAttributes.softInputMode,
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !mHasHadWindowFocus, mWindowAttributes.flags);
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17528506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
175396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        // Remember if we must report the next draw.
175496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if ((relayoutResult & WindowManagerImpl.RELAYOUT_RES_FIRST_TIME) != 0) {
175596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mReportNextDraw = true;
175696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
175796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
1758ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy        boolean cancelDraw = attachInfo.mTreeObserver.dispatchOnPreDraw() ||
1759ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy                viewVisibility != View.VISIBLE;
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
176161158c621d0834d6d4e1e0310596d9b7a1071178Chet Haase        if (!cancelDraw && !newSurface) {
1762d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            if (mPendingTransitions != null && mPendingTransitions.size() > 0) {
1763d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                for (int i = 0; i < mPendingTransitions.size(); ++i) {
1764d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                    mPendingTransitions.get(i).startChangingAnimations();
1765d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                }
1766d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                mPendingTransitions.clear();
1767d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            }
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
176996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            performDraw();
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1771d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            // End any pending transitions on this non-visible window
1772d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            if (mPendingTransitions != null && mPendingTransitions.size() > 0) {
1773d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                for (int i = 0; i < mPendingTransitions.size(); ++i) {
1774d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                    mPendingTransitions.get(i).endChangingAnimations();
1775d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                }
1776d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                mPendingTransitions.clear();
1777d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            }
177861158c621d0834d6d4e1e0310596d9b7a1071178Chet Haase
1779ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy            if (viewVisibility == View.VISIBLE) {
1780ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy                // Try again
1781ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy                scheduleTraversals();
1782ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy            }
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestTransparentRegion(View child) {
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the test below should not fail unless someone is messing with us
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == child) {
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mView.mPrivateFlags |= View.REQUEST_TRANSPARENT_REGIONS;
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Need to make sure we re-evaluate the window attributes next
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // time around, to ensure the window has the correct format.
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = true;
1794f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy            mWindowAttributesChangesFlag = 0;
17951bd80ad7fdf71e437fa650f02366664c27b66b46Mathias Agopian            requestLayout();
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Figures out the measure spec for the root view in a window based on it's
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layout params.
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param windowSize
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            The available width or height of the window
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rootDimension
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            The layout params for one dimension (width or height) of the
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            window.
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The measure spec to use to measure the root view.
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1812a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy    private static int getRootMeasureSpec(int windowSize, int rootDimension) {
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int measureSpec;
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (rootDimension) {
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1816980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy        case ViewGroup.LayoutParams.MATCH_PARENT:
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window can't resize. Force root view to be windowSize.
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY);
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case ViewGroup.LayoutParams.WRAP_CONTENT:
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window can resize. Set max size for root view.
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST);
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window wants to be an exact size. Force root view to be that size.
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY);
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return measureSpec;
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18320f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    int mHardwareYOffset;
18330f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    int mResizeAlpha;
18340f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    final Paint mResizePaint = new Paint();
18350f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
18367d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    public void onHardwarePreDraw(HardwareCanvas canvas) {
18370f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        canvas.translate(0, -mHardwareYOffset);
18380f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
18390f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
18407d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    public void onHardwarePostDraw(HardwareCanvas canvas) {
18417d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
18420f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            mResizePaint.setAlpha(mResizeAlpha);
18437d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            canvas.drawHardwareLayer(mResizeBuffer, 0.0f, mHardwareYOffset, mResizePaint);
18440f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
18450f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
18460f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
1847ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    /**
1848ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     * @hide
1849ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     */
1850ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    void outputDisplayList(View view) {
1851ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        if (mAttachInfo != null && mAttachInfo.mHardwareCanvas != null) {
1852ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            DisplayList displayList = view.getDisplayList();
1853ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            if (displayList != null) {
185459a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mAttachInfo.mHardwareCanvas.outputDisplayList(displayList);
185559a12cae208790dd202656f50a40a53ef49baeebRomain Guy            }
185659a12cae208790dd202656f50a40a53ef49baeebRomain Guy        }
185759a12cae208790dd202656f50a40a53ef49baeebRomain Guy    }
185859a12cae208790dd202656f50a40a53ef49baeebRomain Guy
185959a12cae208790dd202656f50a40a53ef49baeebRomain Guy    /**
186059a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * @see #PROPERTY_PROFILE_RENDERING
186159a12cae208790dd202656f50a40a53ef49baeebRomain Guy     */
186259a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private void profileRendering(boolean enabled) {
186359a12cae208790dd202656f50a40a53ef49baeebRomain Guy        if (mProfileRendering) {
186459a12cae208790dd202656f50a40a53ef49baeebRomain Guy            mRenderProfilingEnabled = enabled;
186559a12cae208790dd202656f50a40a53ef49baeebRomain Guy            if (mRenderProfiler == null) {
186659a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler = new Thread(new Runnable() {
186759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    @Override
186859a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    public void run() {
186959a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        Log.d(TAG, "Starting profiling thread");
187059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        while (mRenderProfilingEnabled) {
187159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            mAttachInfo.mHandler.post(new Runnable() {
187259a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                @Override
187359a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                public void run() {
187459a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                    mDirty.set(0, 0, mWidth, mHeight);
187559a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                    scheduleTraversals();
187659a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                }
187759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            });
187859a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            try {
187959a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                // TODO: This should use vsync when we get an API
188059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                Thread.sleep(15);
188159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            } catch (InterruptedException e) {
188259a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                Log.d(TAG, "Exiting profiling thread");
188359a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            }
188459a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        }
188559a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    }
188659a12cae208790dd202656f50a40a53ef49baeebRomain Guy                }, "Rendering Profiler");
188759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler.start();
188859a12cae208790dd202656f50a40a53ef49baeebRomain Guy            } else {
188959a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler.interrupt();
189059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler = null;
1891ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
1892ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
1893ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
1894ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
18952f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    /**
18962f2022afa1eb85018368398bd150e9575fc099c9Chet Haase     * Called from draw() when DEBUG_FPS is enabled
18972f2022afa1eb85018368398bd150e9575fc099c9Chet Haase     */
18982f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private void trackFPS() {
18992f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        // Tracks frames per second drawn. First value in a series of draws may be bogus
19002f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        // because it down not account for the intervening idle time
19012f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        long nowTime = System.currentTimeMillis();
19022f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        if (mFpsStartTime < 0) {
19032f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            mFpsStartTime = mFpsPrevTime = nowTime;
19042f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            mFpsNumFrames = 0;
19052f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        } else {
19062f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            ++mFpsNumFrames;
19072f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            String thisHash = Integer.toHexString(System.identityHashCode(this));
19082f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            long frameTime = nowTime - mFpsPrevTime;
19092f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            long totalTime = nowTime - mFpsStartTime;
19102f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            Log.v(TAG, "0x" + thisHash + "\tFrame time:\t" + frameTime);
19112f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            mFpsPrevTime = nowTime;
19122f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            if (totalTime > 1000) {
19132f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                float fps = (float) mFpsNumFrames * 1000 / totalTime;
19142f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                Log.v(TAG, "0x" + thisHash + "\tFPS:\t" + fps);
19152f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                mFpsStartTime = nowTime;
19162f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                mFpsNumFrames = 0;
19172f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            }
19182f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        }
19192f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    }
19202f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
192196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    private void performDraw() {
1922006f0e41abca961bade88908d7ef56ae63c429fbCraig Mautner        if (!mAttachInfo.mScreenOn && !mReportNextDraw) {
1923006f0e41abca961bade88908d7ef56ae63c429fbCraig Mautner            return;
1924006f0e41abca961bade88908d7ef56ae63c429fbCraig Mautner        }
19257e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy
192696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        final long drawStartTime;
192796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (ViewDebug.DEBUG_LATENCY) {
192896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            drawStartTime = System.nanoTime();
192996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            if (mLastDrawFinishedTimeNanos != 0) {
193096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                Log.d(ViewDebug.DEBUG_LATENCY_TAG, "Starting draw(); it has been "
193196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        + ((drawStartTime - mLastDrawFinishedTimeNanos) * 0.000001f)
193296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        + "ms since the last draw finished.");
193396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            } else {
193496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                Log.d(ViewDebug.DEBUG_LATENCY_TAG, "Starting draw().");
193596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            }
193696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
193796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
193896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        final boolean fullRedrawNeeded = mFullRedrawNeeded;
193996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        mFullRedrawNeeded = false;
1940481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown
1941481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        Trace.traceBegin(Trace.TRACE_TAG_VIEW, "draw");
1942481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        try {
1943481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            draw(fullRedrawNeeded);
1944481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        } finally {
1945481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            Trace.traceEnd(Trace.TRACE_TAG_VIEW);
1946481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        }
194796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
194896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (ViewDebug.DEBUG_LATENCY) {
194996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            long now = System.nanoTime();
195096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            Log.d(ViewDebug.DEBUG_LATENCY_TAG, "performDraw() took "
195196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    + ((now - drawStartTime) * 0.000001f)
195296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    + "ms.");
195396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mLastDrawFinishedTimeNanos = now;
195496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
195596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
195696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (mReportNextDraw) {
195796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mReportNextDraw = false;
195896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
195996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            if (LOCAL_LOGV) {
196096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                Log.v(TAG, "FINISHED DRAWING: " + mWindowAttributes.getTitle());
196196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            }
196296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            if (mSurfaceHolder != null && mSurface.isValid()) {
196396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mSurfaceHolderCallback.surfaceRedrawNeeded(mSurfaceHolder);
196496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
196596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                if (callbacks != null) {
196696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    for (SurfaceHolder.Callback c : callbacks) {
196796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        if (c instanceof SurfaceHolder.Callback2) {
196896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                            ((SurfaceHolder.Callback2)c).surfaceRedrawNeeded(
196996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                                    mSurfaceHolder);
197096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        }
197196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    }
197296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                }
197396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            }
197496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            try {
197596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                sWindowSession.finishDrawing(mWindow);
197696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            } catch (RemoteException e) {
197796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            }
197896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
197996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    }
198096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void draw(boolean fullRedrawNeeded) {
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface surface = mSurface;
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (surface == null || !surface.isValid()) {
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19872f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        if (DEBUG_FPS) {
19882f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            trackFPS();
19892f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        }
19902f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
19912a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        if (!sFirstDrawComplete) {
19922a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            synchronized (sFirstDrawHandlers) {
19932a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                sFirstDrawComplete = true;
1994812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                final int count = sFirstDrawHandlers.size();
1995812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                for (int i = 0; i< count; i++) {
1996a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mHandler.post(sFirstDrawHandlers.get(i));
19972a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                }
19982a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            }
19992a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        }
200059a12cae208790dd202656f50a40a53ef49baeebRomain Guy
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scrollToRectOrFocus(null, false);
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mViewScrollChanged) {
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mViewScrollChanged = false;
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mTreeObserver.dispatchOnScrollChanged();
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20078506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int yoff;
20090f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        boolean animating = mScroller != null && mScroller.computeScrollOffset();
20100f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        if (animating) {
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            yoff = mScroller.getCurrY();
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            yoff = mScrollY;
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurScrollY != yoff) {
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurScrollY = yoff;
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fullRedrawNeeded = true;
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
201996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
202096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        final float appScale = mAttachInfo.mApplicationScale;
202196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        final boolean scalingRequired = mAttachInfo.mScalingRequired;
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20230f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        int resizeAlpha = 0;
20247d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
20257d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            long deltaTime = SystemClock.uptimeMillis() - mResizeBufferStartTime;
20267d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            if (deltaTime < mResizeBufferDuration) {
20277d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                float amt = deltaTime/(float) mResizeBufferDuration;
20280f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                amt = mResizeInterpolator.getInterpolation(amt);
20290f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                animating = true;
20300f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                resizeAlpha = 255 - (int)(amt*255);
20310f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            } else {
20327d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                disposeResizeBuffer();
20330f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            }
20340f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
20350f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
203696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        final Rect dirty = mDirty;
2037dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        if (mSurfaceHolder != null) {
2038dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // The app owns the surface, we won't draw.
2039dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            dirty.setEmpty();
20400f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            if (animating) {
20410f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                if (mScroller != null) {
20420f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    mScroller.abortAnimation();
20430f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                }
20447d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                disposeResizeBuffer();
20450f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            }
2046dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return;
2047dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
204858ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy
204958ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy        if (fullRedrawNeeded) {
205058ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy            mAttachInfo.mIgnoreDirtyState = true;
2051c3166e15f8898a2ba66fb177efbddb1d0edf6140Romain Guy            dirty.set(0, 0, (int) (mWidth * appScale + 0.5f), (int) (mHeight * appScale + 0.5f));
205258ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy        }
2053ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_ORIENTATION || DEBUG_DRAW) {
2055c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            Log.v(TAG, "Draw " + mView + "/"
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mWindowAttributes.getTitle()
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": dirty={" + dirty.left + "," + dirty.top
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + "," + dirty.right + "," + dirty.bottom + "} surface="
20599189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                    + surface + " surface.isValid()=" + surface.isValid() + ", appScale:" +
20609189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                    appScale + ", width=" + mWidth + ", height=" + mHeight);
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2063a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian        if (!dirty.isEmpty() || mIsAnimating) {
20647e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
206596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                // Draw with hardware renderer.
206696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mIsAnimating = false;
206796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mHardwareYOffset = yoff;
206896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mResizeAlpha = resizeAlpha;
2069fea12b87f2988f20ea87314c4a1b47e1a0f4d95eRomain Guy
207096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mCurrentDirty.set(dirty);
207196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mCurrentDirty.union(mPreviousDirty);
207296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mPreviousDirty.set(dirty);
207396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                dirty.setEmpty();
207496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
207596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                if (mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this,
207696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        animating ? null : mCurrentDirty)) {
207796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    mPreviousDirty.set(0, 0, mWidth, mHeight);
20784e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                }
207996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            } else {
208096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                // Draw with software renderer.
208196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                Canvas canvas;
208296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                try {
208396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    int left = dirty.left;
208496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    int top = dirty.top;
208596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    int right = dirty.right;
208696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    int bottom = dirty.bottom;
208796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
208896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    final long lockCanvasStartTime;
208996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    if (ViewDebug.DEBUG_LATENCY) {
209096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        lockCanvasStartTime = System.nanoTime();
209196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    }
20924e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
209396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    canvas = mSurface.lockCanvas(dirty);
2094a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian
209596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    if (ViewDebug.DEBUG_LATENCY) {
209696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        long now = System.nanoTime();
209796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        Log.d(ViewDebug.DEBUG_LATENCY_TAG, "- lockCanvas() took "
209896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                                + ((now - lockCanvasStartTime) * 0.000001f) + "ms");
209996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    }
21004e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
210196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    if (left != dirty.left || top != dirty.top || right != dirty.right ||
210296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                            bottom != dirty.bottom) {
210396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        mAttachInfo.mIgnoreDirtyState = true;
210496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    }
2105a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian
210696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    // TODO: Do this in native
210796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    canvas.setDensity(mDensity);
210896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                } catch (Surface.OutOfResourcesException e) {
210996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    Log.e(TAG, "OutOfResourcesException locking surface", e);
211096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    try {
211196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        if (!sWindowSession.outOfMemory(mWindow)) {
211296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                            Slog.w(TAG, "No processes killed for memory; killing self");
211396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                            Process.killProcess(Process.myPid());
211496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        }
211596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    } catch (RemoteException ex) {
2116648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    }
211796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    mLayoutRequested = true;    // ask wm for a new surface next time.
211896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    return;
211996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                } catch (IllegalArgumentException e) {
212096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    Log.e(TAG, "IllegalArgumentException locking surface", e);
212196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    // Don't assume this is due to out of memory, it could be
212296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    // something else, and if it is something else then we could
212396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    // kill stuff (or ourself) for no reason.
212496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    mLayoutRequested = true;    // ask wm for a new surface next time.
212596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    return;
2126648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                }
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
212896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                try {
2129a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    if (DEBUG_ORIENTATION || DEBUG_DRAW) {
2130c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                        Log.v(TAG, "Surface " + surface + " drawing to bitmap w="
2131a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                + canvas.getWidth() + ", h=" + canvas.getHeight());
2132a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        //canvas.drawARGB(255, 255, 0, 0);
2133a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
213596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    long startTime = 0L;
21365429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy                    if (ViewDebug.DEBUG_PROFILE_DRAWING) {
2137a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        startTime = SystemClock.elapsedRealtime();
2138a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2140a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // If this bitmap's format includes an alpha channel, we
2141a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // need to clear it before drawing so that the child will
2142a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // properly re-composite its drawing on a transparent
2143a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // background. This automatically respects the clip/dirty region
2144a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // or
2145a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // If we are applying an offset, we need to clear the area
2146a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // where the offset doesn't appear to avoid having garbage
2147a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    // left in the blank areas.
2148a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    if (!canvas.isOpaque() || yoff != 0) {
2149a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        canvas.drawColor(0, PorterDuff.Mode.CLEAR);
2150a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2152a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    dirty.setEmpty();
2153a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    mIsAnimating = false;
2154a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    mAttachInfo.mDrawingTime = SystemClock.uptimeMillis();
2155a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    mView.mPrivateFlags |= View.DRAWN;
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2157a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    if (DEBUG_DRAW) {
2158a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        Context cxt = mView.getContext();
2159a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        Log.i(TAG, "Drawing: package:" + cxt.getPackageName() +
2160a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                ", metrics=" + cxt.getResources().getDisplayMetrics() +
2161a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                ", compatibilityInfo=" + cxt.getResources().getCompatibilityInfo());
2162a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
2163a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    try {
2164a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        canvas.translate(0, -yoff);
2165a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        if (mTranslator != null) {
2166a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                            mTranslator.translateCanvas(canvas);
2167a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        }
2168a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        canvas.setScreenDensity(scalingRequired
2169a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                                ? DisplayMetrics.DENSITY_DEVICE : 0);
217002ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy                        mAttachInfo.mSetIgnoreDirtyState = false;
217195db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown
217295db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown                        final long drawStartTime;
217395db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown                        if (ViewDebug.DEBUG_LATENCY) {
217495db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown                            drawStartTime = System.nanoTime();
217595db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown                        }
217695db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown
2177a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        mView.draw(canvas);
217895db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown
217995db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown                        if (ViewDebug.DEBUG_LATENCY) {
218095db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown                            long now = System.nanoTime();
218195db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown                            Log.d(ViewDebug.DEBUG_LATENCY_TAG, "- draw() took "
218295db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown                                    + ((now - drawStartTime) * 0.000001f) + "ms");
218395db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown                        }
2184a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    } finally {
218502ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy                        if (!mAttachInfo.mSetIgnoreDirtyState) {
2186ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                            // Only clear the flag if it was not set during the mView.draw() call
2187ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                            mAttachInfo.mIgnoreDirtyState = false;
2188ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase                        }
2189a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                    }
21908169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
219143a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato                    if (false && ViewDebug.consistencyCheckEnabled) {
2192a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        mView.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_DRAWING);
21938169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                    }
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21955429e1d1026db8922478b715672e6c0703bbf4a9Romain Guy                    if (ViewDebug.DEBUG_PROFILE_DRAWING) {
2196a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian                        EventLog.writeEvent(60000, SystemClock.elapsedRealtime() - startTime);
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
219896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                } finally {
219996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    final long unlockCanvasAndPostStartTime;
220096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    if (ViewDebug.DEBUG_LATENCY) {
220196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        unlockCanvasAndPostStartTime = System.nanoTime();
220296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    }
220395db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown
220496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    surface.unlockCanvasAndPost(canvas);
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
220696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    if (ViewDebug.DEBUG_LATENCY) {
220796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        long now = System.nanoTime();
220896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        Log.d(ViewDebug.DEBUG_LATENCY_TAG, "- unlockCanvasAndPost() took "
220996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                                + ((now - unlockCanvasAndPostStartTime) * 0.000001f) + "ms");
221096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    }
221195db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown
221296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    if (LOCAL_LOGV) {
221396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        Log.v(TAG, "Surface " + surface + " unlockCanvasAndPost");
221496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    }
221595db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown                }
221695db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown            }
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22188506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
22190f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        if (animating) {
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFullRedrawNeeded = true;
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
222551e4d4db296c252641161b39e98f49acebc46062Romain Guy    void invalidateDisplayLists() {
222651e4d4db296c252641161b39e98f49acebc46062Romain Guy        final ArrayList<DisplayList> displayLists = mDisplayLists;
222751e4d4db296c252641161b39e98f49acebc46062Romain Guy        final int count = displayLists.size();
222851e4d4db296c252641161b39e98f49acebc46062Romain Guy
222951e4d4db296c252641161b39e98f49acebc46062Romain Guy        for (int i = 0; i < count; i++) {
223051e4d4db296c252641161b39e98f49acebc46062Romain Guy            displayLists.get(i).invalidate();
223151e4d4db296c252641161b39e98f49acebc46062Romain Guy        }
223251e4d4db296c252641161b39e98f49acebc46062Romain Guy
223351e4d4db296c252641161b39e98f49acebc46062Romain Guy        displayLists.clear();
223451e4d4db296c252641161b39e98f49acebc46062Romain Guy    }
223551e4d4db296c252641161b39e98f49acebc46062Romain Guy
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean scrollToRectOrFocus(Rect rectangle, boolean immediate) {
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View.AttachInfo attachInfo = mAttachInfo;
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect ci = attachInfo.mContentInsets;
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect vi = attachInfo.mVisibleInsets;
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int scrollY = 0;
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean handled = false;
22428506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (vi.left > ci.left || vi.top > ci.top
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || vi.right > ci.right || vi.bottom > ci.bottom) {
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We'll assume that we aren't going to change the scroll
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // offset, since we want to avoid that unless it is actually
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // going to make the focus visible...  otherwise we scroll
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // all over the place.
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrollY = mScrollY;
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We can be called for two different situations: during a draw,
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // to update the scroll position if the focus has changed (in which
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // case 'rectangle' is null), or in response to a
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // requestChildRectangleOnScreen() call (in which case 'rectangle'
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // is non-null and we just want to scroll to whatever that
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // rectangle is).
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View focus = mRealFocusedView;
2257e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy
2258e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            // When in touch mode, focus points to the previously focused view,
2259e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            // which may have been removed from the view hierarchy. The following
2260b71193bffc1d2ec60efd987300e2e85e678aa6f0Joe Onorato            // line checks whether the view is still in our hierarchy.
2261b71193bffc1d2ec60efd987300e2e85e678aa6f0Joe Onorato            if (focus == null || focus.mAttachInfo != mAttachInfo) {
2262e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy                mRealFocusedView = null;
2263e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy                return false;
2264e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            }
2265e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focus != mLastScrolledFocus) {
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If the focus has changed, then ignore any requests to scroll
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to a rectangle; first we want to make sure the entire focus
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // view is visible.
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rectangle = null;
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Eval scroll: focus=" + focus
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " rectangle=" + rectangle + " ci=" + ci
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " vi=" + vi);
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focus == mLastScrolledFocus && !mScrollMayChange
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && rectangle == null) {
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Optimization: if the focus hasn't changed since last
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // time, and no layout has happened, then just leave things
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // as they are.
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Keeping scroll y="
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + mScrollY + " vi=" + vi.toShortString());
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (focus != null) {
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We need to determine if the currently focused view is
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // within the visible part of the window and, if not, apply
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // a pan so it can be seen.
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastScrolledFocus = focus;
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScrollMayChange = false;
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Need to scroll?");
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Try to find the rectangle from the focus view.
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (focus.getGlobalVisibleRect(mVisRect, null)) {
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Root w="
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mView.getWidth() + " h=" + mView.getHeight()
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " ci=" + ci.toShortString()
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " vi=" + vi.toShortString());
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (rectangle == null) {
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        focus.getFocusedRect(mTempRect);
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Focus " + focus
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": focusRect=" + mTempRect.toShortString());
22991c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                        if (mView instanceof ViewGroup) {
23001c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                            ((ViewGroup) mView).offsetDescendantRectToMyCoords(
23011c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                                    focus, mTempRect);
23021c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                        }
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Focus in window: focusRect="
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString()
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visRect=" + mVisRect.toShortString());
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTempRect.set(rectangle);
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Request scroll to rect: "
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString()
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visRect=" + mVisRect.toShortString());
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mTempRect.intersect(mVisRect)) {
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Focus window visible rect: "
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString());
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mTempRect.height() >
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                (mView.getHeight()-vi.top-vi.bottom)) {
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If the focus simply is not going to fit, then
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // best is probably just to leave things as-is.
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Too tall; leaving scrollY=" + scrollY);
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if ((mTempRect.top-scrollY) < vi.top) {
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            scrollY -= vi.top - (mTempRect.top-scrollY);
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Top covered; scrollY=" + scrollY);
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if ((mTempRect.bottom-scrollY)
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                > (mView.getHeight()-vi.bottom)) {
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            scrollY += (mTempRect.bottom-scrollY)
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    - (mView.getHeight()-vi.bottom);
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Bottom covered; scrollY=" + scrollY);
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        handled = true;
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23408506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scrollY != mScrollY) {
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Pan scroll changed: old="
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mScrollY + " , new=" + scrollY);
23447d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            if (!immediate && mResizeBuffer == null) {
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mScroller == null) {
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mScroller = new Scroller(mView.getContext());
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScroller.startScroll(0, mScrollY, 0, scrollY-mScrollY);
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (mScroller != null) {
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScroller.abortAnimation();
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrollY = scrollY;
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23548506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return handled;
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23578506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestChildFocus(View child, View focused) {
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
2360b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov
2361b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        if (DEBUG_INPUT_RESIZE) {
2362b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov            Log.v(TAG, "Request child focus: focus now " + focused);
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2364b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov
2365b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(mOldFocusedView, focused);
2366b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        scheduleTraversals();
2367b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFocusedView = mRealFocusedView = focused;
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearChildFocus(View child) {
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2374b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        if (DEBUG_INPUT_RESIZE) {
2375b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov            Log.v(TAG, "Clearing child focus");
2376b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        }
2377b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov
2378b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        mOldFocusedView = mFocusedView;
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2380b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        // Invoke the listener only if there is no view to take focus
2381b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        if (focusSearch(null, View.FOCUS_FORWARD) == null) {
2382b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov            mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(mOldFocusedView, null);
238373eb97f628b298c7bd032aa9db11dadf05f5b539Amith Yamasani        }
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2385b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        mFocusedView = mRealFocusedView = null;
2386b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov    }
238773eb97f628b298c7bd032aa9db11dadf05f5b539Amith Yamasani
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void focusableViewAvailable(View v) {
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23911c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy        if (mView != null) {
23921c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            if (!mView.hasFocus()) {
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                v.requestFocus();
23941c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            } else {
23951c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // the one case where will transfer focus away from the current one
23961c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // is if the current view is a view group that prefers to give focus
23971c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // to its children first AND the view is a descendant of it.
23981c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                mFocusedView = mView.findFocus();
23991c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                boolean descendantsHaveDibsOnFocus =
24001c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                        (mFocusedView instanceof ViewGroup) &&
24011c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                            (((ViewGroup) mFocusedView).getDescendantFocusability() ==
24021c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                                    ViewGroup.FOCUS_AFTER_DESCENDANTS);
24031c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                if (descendantsHaveDibsOnFocus && isViewDescendantOf(v, mFocusedView)) {
24041c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                    // If a view gets the focus, the listener will be invoked from requestChildFocus()
24051c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                    v.requestFocus();
24061c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                }
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void recomputeViewAttributes(View child) {
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == child) {
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mRecomputeGlobalAttributes = true;
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mWillDrawSoon) {
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduleTraversals();
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchDetachedFromWindow() {
242290fc03bc493fc2c984599b198b9d50bc387134f2Romain Guy        if (mView != null && mView.mAttachInfo != null) {
242316260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            if (mAttachInfo.mHardwareRenderer != null &&
242416260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy                    mAttachInfo.mHardwareRenderer.isEnabled()) {
242516260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy                mAttachInfo.mHardwareRenderer.validate();
242616260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            }
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mView.dispatchDetachedFromWindow();
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityInteractionConnectionManager.ensureNoConnection();
24318643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager.removeAccessibilityStateChangeListener(
24328643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAccessibilityInteractionConnectionManager);
2433eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        removeSendWindowContentChangedCallback();
24348643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
2435a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy        destroyHardwareRenderer();
2436a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView = null;
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mRootView = null;
24395583dc630f861dd9a3006390db227f9296007e00Mathias Agopian        mAttachInfo.mSurface = null;
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24410586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        mSurface.release();
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2443cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (mInputQueueCallback != null && mInputQueue != null) {
2444cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mInputQueueCallback.onInputQueueDestroyed(mInputQueue);
2445cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mInputQueueCallback = null;
2446cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mInputQueue = null;
244732cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        } else if (mInputEventReceiver != null) {
244832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            mInputEventReceiver.dispose();
244932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            mInputEventReceiver = null;
245046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sWindowSession.remove(mWindow);
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2455349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
245600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // Dispose the input channel after removing the window so the Window Manager
245700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // doesn't interpret the input channel being closed as an abnormal termination.
245800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (mInputChannel != null) {
245900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputChannel.dispose();
246000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputChannel = null;
2461349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        }
246296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
24634a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        unscheduleFrame();
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24658506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2466694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    void updateConfiguration(Configuration config, boolean force) {
2467694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        if (DEBUG_CONFIGURATION) Log.v(TAG,
2468694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                "Applying new config to window "
2469694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                + mWindowAttributes.getTitle()
2470694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                + ": " + config);
24715fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
24725fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatibilityInfo ci = mCompatibilityInfo.getIfNeeded();
24735fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (ci != null) {
24745fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            config = new Configuration(config);
24755fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            ci.applyToConfiguration(config);
24765fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
24775fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
2478694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        synchronized (sConfigCallbacks) {
2479694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            for (int i=sConfigCallbacks.size()-1; i>=0; i--) {
2480694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                sConfigCallbacks.get(i).onConfigurationChanged(config);
2481694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            }
2482694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        }
2483694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        if (mView != null) {
2484694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // At this point the resources have been updated to
2485694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // have the most recent config, whatever that is.  Use
2486694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // the on in them which may be newer.
24871c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            config = mView.getResources().getConfiguration();
2488694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            if (force || mLastConfiguration.diff(config) != 0) {
2489694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mLastConfiguration.setTo(config);
2490694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mView.dispatchConfigurationChanged(config);
2491694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            }
2492694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        }
2493694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    }
2494694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return true if child is an ancestor of parent, (or equal to the parent).
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean isViewDescendantOf(View child, View parent) {
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (child == parent) {
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ViewParent theParent = child.getParent();
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (theParent instanceof ViewGroup) && isViewDescendantOf((View) theParent, parent);
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2507cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy    private static void forceLayout(View view) {
2508cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        view.forceLayout();
2509cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        if (view instanceof ViewGroup) {
2510cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            ViewGroup group = (ViewGroup) view;
2511cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            final int count = group.getChildCount();
2512cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            for (int i = 0; i < count; i++) {
2513cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                forceLayout(group.getChildAt(i));
2514cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            }
2515cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        }
2516cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy    }
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2518a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_INVALIDATE = 1;
2519a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_INVALIDATE_RECT = 2;
2520a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DIE = 3;
2521a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_RESIZED = 4;
2522a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_RESIZED_REPORT = 5;
2523a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_WINDOW_FOCUS_CHANGED = 6;
2524a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_KEY = 7;
2525a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_APP_VISIBILITY = 8;
2526a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_GET_NEW_SURFACE = 9;
2527a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_IME_FINISHED_EVENT = 10;
2528a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_KEY_FROM_IME = 11;
2529a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_FINISH_INPUT_CONNECTION = 12;
2530a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_CHECK_FOCUS = 13;
2531a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_CLOSE_SYSTEM_DIALOGS = 14;
2532a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_DRAG_EVENT = 15;
2533a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_DRAG_LOCATION_EVENT = 16;
2534a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_SYSTEM_UI_VISIBILITY = 17;
2535a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_UPDATE_CONFIGURATION = 18;
2536a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_PERFORM_ACCESSIBILITY_ACTION = 19;
2537a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID = 20;
2538a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID = 21;
2539a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT = 22;
2540a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_PROCESS_INPUT_EVENTS = 23;
2541bb9908b828a8cfd5965553be66faa6af89973697Romain Guy    private final static int MSG_DISPATCH_SCREEN_STATE = 24;
254251e4d4db296c252641161b39e98f49acebc46062Romain Guy    private final static int MSG_INVALIDATE_DISPLAY_LIST = 25;
2543a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
2544a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    final class ViewRootHandler extends Handler {
2545a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        @Override
2546a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        public String getMessageName(Message message) {
2547a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            switch (message.what) {
2548a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_INVALIDATE:
2549a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_INVALIDATE";
2550a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_INVALIDATE_RECT:
2551a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_INVALIDATE_RECT";
2552a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DIE:
2553a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DIE";
2554a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_RESIZED:
2555a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_RESIZED";
2556a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_RESIZED_REPORT:
2557a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_RESIZED_REPORT";
2558a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_WINDOW_FOCUS_CHANGED:
2559a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_WINDOW_FOCUS_CHANGED";
2560a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_KEY:
2561a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_KEY";
2562a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_APP_VISIBILITY:
2563a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_APP_VISIBILITY";
2564a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_GET_NEW_SURFACE:
2565a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_GET_NEW_SURFACE";
2566a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_IME_FINISHED_EVENT:
2567a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_IME_FINISHED_EVENT";
2568a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_KEY_FROM_IME:
2569a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_KEY_FROM_IME";
2570a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_FINISH_INPUT_CONNECTION:
2571a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_FINISH_INPUT_CONNECTION";
2572a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_CHECK_FOCUS:
2573a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_CHECK_FOCUS";
2574a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_CLOSE_SYSTEM_DIALOGS:
2575a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_CLOSE_SYSTEM_DIALOGS";
2576a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_DRAG_EVENT:
2577a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_DRAG_EVENT";
2578a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_DRAG_LOCATION_EVENT:
2579a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_DRAG_LOCATION_EVENT";
2580a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_SYSTEM_UI_VISIBILITY:
2581a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_SYSTEM_UI_VISIBILITY";
2582a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_UPDATE_CONFIGURATION:
2583a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_UPDATE_CONFIGURATION";
2584a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_PERFORM_ACCESSIBILITY_ACTION:
2585a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_PERFORM_ACCESSIBILITY_ACTION";
2586a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID:
2587a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID";
2588a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID:
2589a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID";
2590a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT:
2591a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT";
2592a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_PROCESS_INPUT_EVENTS:
2593a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_PROCESS_INPUT_EVENTS";
259451e4d4db296c252641161b39e98f49acebc46062Romain Guy                case MSG_DISPATCH_SCREEN_STATE:
259551e4d4db296c252641161b39e98f49acebc46062Romain Guy                    return "MSG_DISPATCH_SCREEN_STATE";
259651e4d4db296c252641161b39e98f49acebc46062Romain Guy                case MSG_INVALIDATE_DISPLAY_LIST:
259751e4d4db296c252641161b39e98f49acebc46062Romain Guy                    return "MSG_INVALIDATE_DISPLAY_LIST";
2598a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            }
2599a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            return super.getMessageName(message);
2600a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        }
260164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
2602a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        @Override
2603a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        public void handleMessage(Message msg) {
2604a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            switch (msg.what) {
2605a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_INVALIDATE:
2606a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                ((View) msg.obj).invalidate();
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2608a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_INVALIDATE_RECT:
2609a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                final View.AttachInfo.InvalidateInfo info = (View.AttachInfo.InvalidateInfo) msg.obj;
2610a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                info.target.invalidate(info.left, info.top, info.right, info.bottom);
2611a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                info.release();
2612a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2613a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_IME_FINISHED_EVENT:
2614a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                handleImeFinishedEvent(msg.arg1, msg.arg2 != 0);
2615a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2616a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_PROCESS_INPUT_EVENTS:
2617a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                mProcessInputEventsScheduled = false;
2618a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                doProcessInputEvents();
2619a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2620a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_APP_VISIBILITY:
2621a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                handleAppVisibility(msg.arg1 != 0);
2622a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2623a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_GET_NEW_SURFACE:
2624a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                handleGetNewSurface();
2625a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2626a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_RESIZED:
2627a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                ResizedInfo ri = (ResizedInfo)msg.obj;
2628a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
2629a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mWinFrame.width() == msg.arg1 && mWinFrame.height() == msg.arg2
2630a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        && mPendingContentInsets.equals(ri.coveredInsets)
2631a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        && mPendingVisibleInsets.equals(ri.visibleInsets)
2632a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        && ((ResizedInfo)msg.obj).newConfig == null) {
2633a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    break;
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2635a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                // fall through...
2636a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_RESIZED_REPORT:
2637a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mAdded) {
2638a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    Configuration config = ((ResizedInfo)msg.obj).newConfig;
2639a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (config != null) {
2640a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        updateConfiguration(config, false);
2641a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    }
2642a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mWinFrame.left = 0;
2643a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mWinFrame.right = msg.arg1;
2644a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mWinFrame.top = 0;
2645a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mWinFrame.bottom = msg.arg2;
2646a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mPendingContentInsets.set(((ResizedInfo)msg.obj).coveredInsets);
2647a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mPendingVisibleInsets.set(((ResizedInfo)msg.obj).visibleInsets);
2648a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (msg.what == MSG_RESIZED_REPORT) {
2649a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        mReportNextDraw = true;
2650a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    }
2651cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy
2652a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (mView != null) {
2653a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        forceLayout(mView);
2654a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    }
2655a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    requestLayout();
2656cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                }
2657a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2658a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_WINDOW_FOCUS_CHANGED: {
2659a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mAdded) {
2660a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    boolean hasWindowFocus = msg.arg1 != 0;
2661a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mAttachInfo.mHasWindowFocus = hasWindowFocus;
266259a12cae208790dd202656f50a40a53ef49baeebRomain Guy
2663a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    profileRendering(hasWindowFocus);
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2665a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (hasWindowFocus) {
2666a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        boolean inTouchMode = msg.arg2 != 0;
2667a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        ensureTouchModeLocally(inTouchMode);
2668a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
2669a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        if (mAttachInfo.mHardwareRenderer != null &&
2670a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                mSurface != null && mSurface.isValid()) {
2671a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                            mFullRedrawNeeded = true;
2672648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            try {
2673a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                mAttachInfo.mHardwareRenderer.initializeIfNeeded(mWidth, mHeight,
2674a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                        mHolder);
2675a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                            } catch (Surface.OutOfResourcesException e) {
2676a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                Log.e(TAG, "OutOfResourcesException locking surface", e);
2677a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                try {
2678a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                    if (!sWindowSession.outOfMemory(mWindow)) {
2679a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                        Slog.w(TAG, "No processes killed for memory; killing self");
2680a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                        Process.killProcess(Process.myPid());
2681a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                    }
2682a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                } catch (RemoteException ex) {
2683648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                }
2684a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                // Retry in a bit.
2685a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                sendMessageDelayed(obtainMessage(msg.what, msg.arg1, msg.arg2), 500);
2686a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                return;
2687648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
2688648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        }
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26908506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2691a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mLastWasImTarget = WindowManager.LayoutParams
2692a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                            .mayUseInputMethod(mWindowAttributes.flags);
26938506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2694a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    InputMethodManager imm = InputMethodManager.peekInstance();
2695a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (mView != null) {
2696a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        if (hasWindowFocus && imm != null && mLastWasImTarget) {
2697a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                            imm.startGettingWindowFocus(mView);
2698a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        }
2699a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        mAttachInfo.mKeyDispatchState.reset();
2700a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        mView.dispatchWindowFocusChanged(hasWindowFocus);
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
270275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2703a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    // Note: must be done after the focus change callbacks,
2704a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    // so all of the view state is set up correctly.
2705a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (hasWindowFocus) {
2706a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        if (imm != null && mLastWasImTarget) {
2707a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                            imm.onWindowFocus(mView, mView.findFocus(),
2708a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                    mWindowAttributes.softInputMode,
2709a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                    !mHasHadWindowFocus, mWindowAttributes.flags);
2710a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        }
2711a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        // Clear the forward bit.  We can just do this directly, since
2712a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        // the window manager doesn't care about it.
2713a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        mWindowAttributes.softInputMode &=
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
2715a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        ((WindowManager.LayoutParams)mView.getLayoutParams())
2716a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                .softInputMode &=
2717a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                    ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
2718a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        mHasHadWindowFocus = true;
2719a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    }
272075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
27210d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    if (hasWindowFocus && mView != null && mAccessibilityManager.isEnabled()) {
27220d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                        mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
2723a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    }
272475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                }
2725a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2726a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DIE:
2727a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                doDie();
2728a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2729a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_KEY: {
2730a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                KeyEvent event = (KeyEvent)msg.obj;
2731a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                enqueueInputEvent(event, null, 0, true);
2732a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2733a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_KEY_FROM_IME: {
2734a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (LOCAL_LOGV) Log.v(
2735a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    TAG, "Dispatching key "
2736a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    + msg.obj + " from IME to " + mView);
2737a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                KeyEvent event = (KeyEvent)msg.obj;
2738a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if ((event.getFlags()&KeyEvent.FLAG_FROM_SYSTEM) != 0) {
2739a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    // The IME is trying to say this event is from the
2740a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    // system!  Bad bad bad!
2741a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    //noinspection UnusedAssignment
2742a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    event = KeyEvent.changeFlags(event, event.getFlags() & ~KeyEvent.FLAG_FROM_SYSTEM);
2743a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
2744a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                enqueueInputEvent(event, null, QueuedInputEvent.FLAG_DELIVER_POST_IME, true);
2745a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2746a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_FINISH_INPUT_CONNECTION: {
2747a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                InputMethodManager imm = InputMethodManager.peekInstance();
2748a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (imm != null) {
2749a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    imm.reportFinishInputConnection((InputConnection)msg.obj);
2750a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
2751a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2752a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_CHECK_FOCUS: {
2753a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                InputMethodManager imm = InputMethodManager.peekInstance();
2754a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (imm != null) {
2755a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    imm.checkFocus();
2756a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
2757a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2758a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_CLOSE_SYSTEM_DIALOGS: {
2759a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mView != null) {
2760a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mView.onCloseSystemDialogs((String)msg.obj);
2761a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
2762a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2763a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_DRAG_EVENT:
2764a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_DRAG_LOCATION_EVENT: {
2765a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                DragEvent event = (DragEvent)msg.obj;
2766a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                event.mLocalState = mLocalDragState;    // only present when this app called startDrag()
2767a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                handleDragEvent(event);
2768a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2769a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_SYSTEM_UI_VISIBILITY: {
2770a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                handleDispatchSystemUiVisibilityChanged((SystemUiVisibilityInfo)msg.obj);
2771a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2772a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_UPDATE_CONFIGURATION: {
2773a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                Configuration config = (Configuration)msg.obj;
2774a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (config.isOtherSeqNewer(mLastConfiguration)) {
2775a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    config = mLastConfiguration;
2776a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
2777a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                updateConfiguration(config, false);
2778a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2779a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID: {
2780a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mView != null) {
2781a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    getAccessibilityInteractionController()
2782a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        .findAccessibilityNodeInfoByAccessibilityIdUiThread(msg);
2783a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
2784a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2785a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_PERFORM_ACCESSIBILITY_ACTION: {
2786a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mView != null) {
2787a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    getAccessibilityInteractionController()
2788a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        .perfromAccessibilityActionUiThread(msg);
2789a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
2790a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2791a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID: {
2792a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mView != null) {
2793a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    getAccessibilityInteractionController()
2794a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        .findAccessibilityNodeInfoByViewIdUiThread(msg);
2795a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
2796a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2797a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT: {
2798a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mView != null) {
2799a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    getAccessibilityInteractionController()
2800a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        .findAccessibilityNodeInfosByTextUiThread(msg);
2801a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
2802a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
2803bb9908b828a8cfd5965553be66faa6af89973697Romain Guy            case MSG_DISPATCH_SCREEN_STATE: {
28047e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy                if (mView != null) {
2805bb9908b828a8cfd5965553be66faa6af89973697Romain Guy                    handleScreenStateChange(msg.arg1 == 1);
28067e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy                }
28077e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            } break;
280851e4d4db296c252641161b39e98f49acebc46062Romain Guy            case MSG_INVALIDATE_DISPLAY_LIST: {
280951e4d4db296c252641161b39e98f49acebc46062Romain Guy                invalidateDisplayLists();
281051e4d4db296c252641161b39e98f49acebc46062Romain Guy            } break;
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
281451e4d4db296c252641161b39e98f49acebc46062Romain Guy
2815a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    final ViewRootHandler mHandler = new ViewRootHandler();
28168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Something in the current window tells us we need to change the touch mode.  For
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * example, we are not in touch mode, and the user touches the screen.
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the touch mode has changed, tell the window manager, and handle it locally.
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inTouchMode Whether we want to be in touch mode.
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the touch mode changed and focus changed was changed as a result
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean ensureTouchMode(boolean inTouchMode) {
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) Log.d("touchmode", "ensureTouchMode(" + inTouchMode + "), current "
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "touch mode is " + mAttachInfo.mInTouchMode);
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mInTouchMode == inTouchMode) return false;
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // tell the window manager
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sWindowSession.setInTouchMode(inTouchMode);
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(e);
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // handle the change
28392d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy        return ensureTouchModeLocally(inTouchMode);
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Ensure that the touch mode for this window is set, and if it is changing,
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * take the appropriate action.
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inTouchMode Whether we want to be in touch mode.
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the touch mode changed and focus changed was changed as a result
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28482d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy    private boolean ensureTouchModeLocally(boolean inTouchMode) {
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) Log.d("touchmode", "ensureTouchModeLocally(" + inTouchMode + "), current "
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "touch mode is " + mAttachInfo.mInTouchMode);
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mInTouchMode == inTouchMode) return false;
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mInTouchMode = inTouchMode;
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mTreeObserver.dispatchOnTouchModeChanged(inTouchMode);
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28572d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy        return (inTouchMode) ? enterTouchMode() : leaveTouchMode();
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean enterTouchMode() {
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null) {
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView.hasFocus()) {
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // note: not relying on mFocusedView here because this could
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // be when the window is first being added, and mFocused isn't
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // set yet.
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final View focused = mView.findFocus();
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (focused != null && !focused.isFocusableInTouchMode()) {
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ViewGroup ancestorToTakeFocus =
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            findAncestorToTakeFocusInTouchMode(focused);
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ancestorToTakeFocus != null) {
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // there is an ancestor that wants focus after its descendants that
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // is focusable in touch mode.. give it focus
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return ancestorToTakeFocus.requestFocus();
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // nothing appropriate to have focus in touch mode, clear it out
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mView.unFocus();
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(focused, null);
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFocusedView = null;
2880b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov                        mOldFocusedView = null;
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return true;
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Find an ancestor of focused that wants focus after its descendants and is
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focusable in touch mode.
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param focused The currently focused view.
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return An appropriate view, or null if no such view exists.
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2896a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy    private static ViewGroup findAncestorToTakeFocusInTouchMode(View focused) {
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewParent parent = focused.getParent();
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (parent instanceof ViewGroup) {
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ViewGroup vgParent = (ViewGroup) parent;
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (vgParent.getDescendantFocusability() == ViewGroup.FOCUS_AFTER_DESCENDANTS
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && vgParent.isFocusableInTouchMode()) {
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return vgParent;
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (vgParent.isRootNamespace()) {
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parent = vgParent.getParent();
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean leaveTouchMode() {
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null) {
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView.hasFocus()) {
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // i learned the hard way to not trust mFocusedView :)
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedView = mView.findFocus();
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!(mFocusedView instanceof ViewGroup)) {
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // some view has focus, let it keep it
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (((ViewGroup)mFocusedView).getDescendantFocusability() !=
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ViewGroup.FOCUS_AFTER_DESCENDANTS) {
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // some view group has focus, and doesn't prefer its children
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // over itself for focus, so let them keep it.
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // find the best view to give focus to in this brave new non-touch-mode
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // world
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View focused = focusSearch(null, View.FOCUS_DOWN);
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focused != null) {
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return focused.requestFocus(View.FOCUS_DOWN);
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29394952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverInputEvent(QueuedInputEvent q) {
29404e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
29414952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mDeliverTimeNanos = System.nanoTime();
29424e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
29434e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
2944481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        Trace.traceBegin(Trace.TRACE_TAG_VIEW, "deliverInputEvent");
2945481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        try {
2946481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            if (q.mEvent instanceof KeyEvent) {
2947481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                deliverKeyEvent(q);
29484952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            } else {
2949481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                final int source = q.mEvent.getSource();
2950481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) {
2951481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                    deliverPointerEvent(q);
2952481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                } else if ((source & InputDevice.SOURCE_CLASS_TRACKBALL) != 0) {
2953481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                    deliverTrackballEvent(q);
2954481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                } else {
2955481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                    deliverGenericMotionEvent(q);
2956481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                }
29574952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
2958481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        } finally {
2959481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            Trace.traceEnd(Trace.TRACE_TAG_VIEW);
29604952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
29614952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    }
29624952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
29634952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverPointerEvent(QueuedInputEvent q) {
29644952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final MotionEvent event = (MotionEvent)q.mEvent;
29657564d62a773857b2f46405d22f296edb3530d88eJeff Brown        final boolean isTouchEvent = event.isTouchEvent();
296621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
29677564d62a773857b2f46405d22f296edb3530d88eJeff Brown            if (isTouchEvent) {
296821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                mInputEventConsistencyVerifier.onTouchEvent(event, 0);
296921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            } else {
297021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                mInputEventConsistencyVerifier.onGenericMotionEvent(event, 0);
297121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            }
297221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
297321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
29743915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If there is no view, then the event will not be handled.
29753915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
29764952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, false);
29773915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
29783915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
29793915bb845b032dc184dba5e60970b803390ca3edJeff Brown
29803915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Translate the pointer event for compatibility, if needed.
298100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (mTranslator != null) {
298200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mTranslator.translateEventInScreenToAppWindow(event);
298300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29857564d62a773857b2f46405d22f296edb3530d88eJeff Brown        // Enter touch mode on down or scroll.
29867564d62a773857b2f46405d22f296edb3530d88eJeff Brown        final int action = event.getAction();
29877564d62a773857b2f46405d22f296edb3530d88eJeff Brown        if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_SCROLL) {
29883915bb845b032dc184dba5e60970b803390ca3edJeff Brown            ensureTouchMode(true);
29893915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
299000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
29913915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Offset the scroll position.
29923915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mCurScrollY != 0) {
29933915bb845b032dc184dba5e60970b803390ca3edJeff Brown            event.offsetLocation(0, mCurScrollY);
29943915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
29953915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (MEASURE_LATENCY) {
299633bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            lt.sample("A Dispatching PointerEvents", System.nanoTime() - event.getEventTimeNano());
29973915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
29983915bb845b032dc184dba5e60970b803390ca3edJeff Brown
29993915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Remember the touch position for possible drag-initiation.
30007564d62a773857b2f46405d22f296edb3530d88eJeff Brown        if (isTouchEvent) {
30017564d62a773857b2f46405d22f296edb3530d88eJeff Brown            mLastTouchPoint.x = event.getRawX();
30027564d62a773857b2f46405d22f296edb3530d88eJeff Brown            mLastTouchPoint.y = event.getRawY();
30037564d62a773857b2f46405d22f296edb3530d88eJeff Brown        }
30043915bb845b032dc184dba5e60970b803390ca3edJeff Brown
30053915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Dispatch touch to view hierarchy.
300633bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        boolean handled = mView.dispatchPointerEvent(event);
30073915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (MEASURE_LATENCY) {
300833bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            lt.sample("B Dispatched PointerEvents ", System.nanoTime() - event.getEventTimeNano());
30093915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
30103915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (handled) {
30114952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
30123915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
30133915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
30143915bb845b032dc184dba5e60970b803390ca3edJeff Brown
30153915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Pointer event was unhandled.
30164952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        finishInputEvent(q, false);
301700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown    }
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30194952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverTrackballEvent(QueuedInputEvent q) {
30204952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final MotionEvent event = (MotionEvent)q.mEvent;
302121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
302221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onTrackballEvent(event, 0);
302321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
302421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
30253915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If there is no view, then the event will not be handled.
30263915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
30274952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, false);
30283915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30313915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Deliver the trackball event to the view.
30323915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView.dispatchTrackballEvent(event)) {
30333915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // If we reach this, we delivered a trackball event to mView and
30343915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // mView consumed it. Because we will not translate the trackball
30353915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // event into a key event, touch mode will not exit, so we exit
30363915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // touch mode here.
30373915bb845b032dc184dba5e60970b803390ca3edJeff Brown            ensureTouchMode(false);
30383915bb845b032dc184dba5e60970b803390ca3edJeff Brown
30394952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
30403915bb845b032dc184dba5e60970b803390ca3edJeff Brown            mLastTrackballTime = Integer.MIN_VALUE;
30413915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
30423915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
30433915bb845b032dc184dba5e60970b803390ca3edJeff Brown
30443915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Translate the trackball event into DPAD keys and try to deliver those.
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final TrackballAxis x = mTrackballAxisX;
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final TrackballAxis y = mTrackballAxisY;
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long curTime = SystemClock.uptimeMillis();
30493915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if ((mLastTrackballTime + MAX_TRACKBALL_DELAY) < curTime) {
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // It has been too long since the last movement,
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // so restart at the beginning.
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            x.reset(0);
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            y.reset(0);
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTrackballTime = curTime;
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
305700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final int action = event.getAction();
305849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        final int metaState = event.getMetaState();
305900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        switch (action) {
306000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case MotionEvent.ACTION_DOWN:
306100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
306200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
3063f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(curTime, curTime,
306449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER, 0, metaState,
306549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
30664952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        InputDevice.SOURCE_KEYBOARD));
306700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                break;
306800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case MotionEvent.ACTION_UP:
306900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
307000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
3071f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(curTime, curTime,
307249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER, 0, metaState,
307349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
30744952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        InputDevice.SOURCE_KEYBOARD));
307500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                break;
307600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
307800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (DEBUG_TRACKBALL) Log.v(TAG, "TB X=" + x.position + " step="
307900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + x.step + " dir=" + x.dir + " acc=" + x.acceleration
308000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " move=" + event.getX()
308100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " / Y=" + y.position + " step="
308200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + y.step + " dir=" + y.dir + " acc=" + y.acceleration
308300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " move=" + event.getY());
308400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final float xOff = x.collect(event.getX(), event.getEventTime(), "X");
308500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final float yOff = y.collect(event.getY(), event.getEventTime(), "Y");
308600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
308700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // Generate DPAD events based on the trackball movement.
308800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // We pick the axis that has moved the most as the direction of
308900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // the DPAD.  When we generate DPAD events for one axis, then the
309000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // other axis is reset -- we don't want to perform DPAD jumps due
309100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // to slight movements in the trackball when making major movements
309200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // along the other axis.
309300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        int keycode = 0;
309400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        int movement = 0;
309500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        float accel = 1;
309600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (xOff > yOff) {
309700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            movement = x.generate((2/event.getXPrecision()));
309800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement != 0) {
309900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                keycode = movement > 0 ? KeyEvent.KEYCODE_DPAD_RIGHT
310000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        : KeyEvent.KEYCODE_DPAD_LEFT;
310100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                accel = x.acceleration;
310200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
310300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
310400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        } else if (yOff > 0) {
310500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            movement = y.generate((2/event.getYPrecision()));
310600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement != 0) {
310700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                keycode = movement > 0 ? KeyEvent.KEYCODE_DPAD_DOWN
310800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        : KeyEvent.KEYCODE_DPAD_UP;
310900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                accel = y.acceleration;
311000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
311100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
311200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
311300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
311400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (keycode != 0) {
311500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement < 0) movement = -movement;
311600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            int accelMovement = (int)(movement * accel);
311700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (DEBUG_TRACKBALL) Log.v(TAG, "Move: movement=" + movement
311800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    + " accelMovement=" + accelMovement
311900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    + " accel=" + accel);
312000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (accelMovement > movement) {
312100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (DEBUG_TRACKBALL) Log.v("foo", "Delivering fake DPAD: "
312200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        + keycode);
312300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                movement--;
312449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                int repeatCount = accelMovement - movement;
3125f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(curTime, curTime,
312649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_MULTIPLE, keycode, repeatCount, metaState,
312749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
31284952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        InputDevice.SOURCE_KEYBOARD));
312900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
313000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            while (movement > 0) {
313100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (DEBUG_TRACKBALL) Log.v("foo", "Delivering fake DPAD: "
313200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        + keycode);
313300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                movement--;
313400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                curTime = SystemClock.uptimeMillis();
3135f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(curTime, curTime,
313649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_DOWN, keycode, 0, metaState,
313749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
31384952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        InputDevice.SOURCE_KEYBOARD));
3139f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(curTime, curTime,
314049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_UP, keycode, 0, metaState,
314149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
31424952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        InputDevice.SOURCE_KEYBOARD));
31434952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
314400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mLastTrackballTime = curTime;
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31463915bb845b032dc184dba5e60970b803390ca3edJeff Brown
31473915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Unfortunately we can't tell whether the application consumed the keys, so
31483915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // we always consider the trackball event handled.
31494952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        finishInputEvent(q, true);
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31524952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverGenericMotionEvent(QueuedInputEvent q) {
31534952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final MotionEvent event = (MotionEvent)q.mEvent;
315421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
315521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onGenericMotionEvent(event, 0);
315621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
315721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
3158cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int source = event.getSource();
3159cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final boolean isJoystick = (source & InputDevice.SOURCE_CLASS_JOYSTICK) != 0;
3160cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3161cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        // If there is no view, then the event will not be handled.
3162cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (mView == null || !mAdded) {
3163cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (isJoystick) {
3164cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                updateJoystickDirection(event, false);
3165cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
31664952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, false);
3167cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return;
3168cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3169cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3170cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        // Deliver the event to the view.
3171cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (mView.dispatchGenericMotionEvent(event)) {
3172cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (isJoystick) {
3173cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                updateJoystickDirection(event, false);
3174cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
31754952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
3176cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return;
3177cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3178cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3179cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (isJoystick) {
3180cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            // Translate the joystick event into DPAD keys and try to deliver those.
3181cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            updateJoystickDirection(event, true);
31824952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
3183cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else {
31844952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, false);
3185cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3186cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3187cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3188cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private void updateJoystickDirection(MotionEvent event, boolean synthesizeNewKeys) {
3189cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final long time = event.getEventTime();
3190cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int metaState = event.getMetaState();
3191cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int deviceId = event.getDeviceId();
3192cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int source = event.getSource();
31936f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
31946f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        int xDirection = joystickAxisValueToDirection(event.getAxisValue(MotionEvent.AXIS_HAT_X));
31956f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        if (xDirection == 0) {
31966f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            xDirection = joystickAxisValueToDirection(event.getX());
31976f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
31986f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
31996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        int yDirection = joystickAxisValueToDirection(event.getAxisValue(MotionEvent.AXIS_HAT_Y));
32006f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        if (yDirection == 0) {
32016f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            yDirection = joystickAxisValueToDirection(event.getY());
32026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
3203cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3204cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (xDirection != mLastJoystickXDirection) {
3205cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (mLastJoystickXKeyCode != 0) {
3206f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(time, time,
3207cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_UP, mLastJoystickXKeyCode, 0, metaState,
32084952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source));
3209cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickXKeyCode = 0;
3210cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3211cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3212cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            mLastJoystickXDirection = xDirection;
3213cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3214cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (xDirection != 0 && synthesizeNewKeys) {
3215cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickXKeyCode = xDirection > 0
3216cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        ? KeyEvent.KEYCODE_DPAD_RIGHT : KeyEvent.KEYCODE_DPAD_LEFT;
3217f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(time, time,
3218cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_DOWN, mLastJoystickXKeyCode, 0, metaState,
32194952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source));
3220cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3221cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3222cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3223cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (yDirection != mLastJoystickYDirection) {
3224cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (mLastJoystickYKeyCode != 0) {
3225f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(time, time,
3226cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_UP, mLastJoystickYKeyCode, 0, metaState,
32274952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source));
3228cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickYKeyCode = 0;
3229cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3230cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3231cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            mLastJoystickYDirection = yDirection;
3232cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3233cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (yDirection != 0 && synthesizeNewKeys) {
3234cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickYKeyCode = yDirection > 0
3235cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        ? KeyEvent.KEYCODE_DPAD_DOWN : KeyEvent.KEYCODE_DPAD_UP;
3236f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(time, time,
3237cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_DOWN, mLastJoystickYKeyCode, 0, metaState,
32384952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source));
3239cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3240cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3241cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3242cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3243cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private static int joystickAxisValueToDirection(float value) {
3244cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (value >= 0.5f) {
3245cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return 1;
3246cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else if (value <= -0.5f) {
3247cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return -1;
3248cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else {
3249cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return 0;
3250cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3251cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3252cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32544e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * Returns true if the key is used for keyboard navigation.
32554e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @param keyEvent The key event.
32564e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @return True if the key is used for keyboard navigation.
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32584e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown    private static boolean isNavigationKey(KeyEvent keyEvent) {
32594e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        switch (keyEvent.getKeyCode()) {
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_LEFT:
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_RIGHT:
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_UP:
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_DOWN:
32644e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_DPAD_CENTER:
32654e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_PAGE_UP:
32664e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_PAGE_DOWN:
32674e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_MOVE_HOME:
32684e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_MOVE_END:
32694e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_TAB:
32704e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_SPACE:
32714e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_ENTER:
32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32784e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * Returns true if the key is used for typing.
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keyEvent The key event.
32804e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @return True if the key is used for typing.
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32824e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown    private static boolean isTypingKey(KeyEvent keyEvent) {
32834e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        return keyEvent.getUnicodeChar() > 0;
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32874e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * See if the key event means we should leave touch mode (and leave touch mode if so).
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event.
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether this key event should be consumed (meaning the act of
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   leaving touch mode alone is considered the event).
32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean checkForLeavingTouchModeAndConsume(KeyEvent event) {
32934e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Only relevant in touch mode.
32944e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (!mAttachInfo.mInTouchMode) {
32954e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            return false;
32964e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        }
32974e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown
32984e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Only consider leaving touch mode on DOWN or MULTIPLE actions, never on UP.
329951a6bee6719820d09595f474264fcb833eff470aAdam Powell        final int action = event.getAction();
330051a6bee6719820d09595f474264fcb833eff470aAdam Powell        if (action != KeyEvent.ACTION_DOWN && action != KeyEvent.ACTION_MULTIPLE) {
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33034e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown
33044e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Don't leave touch mode if the IME told us not to.
33054e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if ((event.getFlags() & KeyEvent.FLAG_KEEP_TOUCH_MODE) != 0) {
33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33094e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // If the key can be used for keyboard navigation then leave touch mode
33104e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // and select a focused view if needed (in ensureTouchMode).
33114e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // When a new focused view is selected, we consume the navigation key because
33124e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // navigation doesn't make much sense unless a view already has focus so
33134e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // the key's purpose is to set focus.
33144e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (isNavigationKey(event)) {
33154e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            return ensureTouchMode(false);
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33184e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // If the key can be used for typing then leave touch mode
33194e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // and select a focused view if needed (in ensureTouchMode).
33204e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Always allow the view to process the typing key.
33214e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (isTypingKey(event)) {
33224e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            ensureTouchMode(false);
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33294952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverKeyEvent(QueuedInputEvent q) {
33304952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final KeyEvent event = (KeyEvent)q.mEvent;
333121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
333221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onKeyEvent(event, 0);
333321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
333421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
33354952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if ((q.mFlags & QueuedInputEvent.FLAG_DELIVER_POST_IME) == 0) {
33364952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            // If there is no view, then the event will not be handled.
33374952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (mView == null || !mAdded) {
33384952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                finishInputEvent(q, false);
33394952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                return;
33404952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
33413915bb845b032dc184dba5e60970b803390ca3edJeff Brown
33424952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (LOCAL_LOGV) Log.v(TAG, "Dispatching key " + event + " to " + mView);
33433915bb845b032dc184dba5e60970b803390ca3edJeff Brown
33444952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            // Perform predispatching before the IME.
33454952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (mView.dispatchKeyEventPreIme(event)) {
33464952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                finishInputEvent(q, true);
33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33494952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
33504952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            // Dispatch to the IME before propagating down the view hierarchy.
33514952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            // The IME will eventually call back into handleImeFinishedEvent.
33524952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (mLastWasImTarget) {
33534952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                InputMethodManager imm = InputMethodManager.peekInstance();
33544952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                if (imm != null) {
335532cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                    final int seq = event.getSequenceNumber();
33564952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                    if (DEBUG_IMF) Log.v(TAG, "Sending key event to IME: seq="
335732cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                            + seq + " event=" + event);
335832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                    imm.dispatchKeyEvent(mView.getContext(), seq, event, mInputMethodCallback);
33594952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                    return;
33604952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                }
33614952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33633915bb845b032dc184dba5e60970b803390ca3edJeff Brown
33643915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Not dispatching to IME, continue with post IME actions.
33654952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        deliverKeyEventPostIme(q);
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33684952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    void handleImeFinishedEvent(int seq, boolean handled) {
33694952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final QueuedInputEvent q = mCurrentInputEvent;
337032cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        if (q != null && q.mEvent.getSequenceNumber() == seq) {
33714952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            final KeyEvent event = (KeyEvent)q.mEvent;
33724952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (DEBUG_IMF) {
33734952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                Log.v(TAG, "IME finished event: seq=" + seq
33744952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        + " handled=" + handled + " event=" + event);
33754952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
33763915bb845b032dc184dba5e60970b803390ca3edJeff Brown            if (handled) {
33774952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                finishInputEvent(q, true);
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
33794952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                deliverKeyEventPostIme(q);
33804952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
33814952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        } else {
33824952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (DEBUG_IMF) {
33834952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                Log.v(TAG, "IME finished event: seq=" + seq
33844952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        + " handled=" + handled + ", event not found!");
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33888506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
33894952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverKeyEventPostIme(QueuedInputEvent q) {
33904952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final KeyEvent event = (KeyEvent)q.mEvent;
33914e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
33924952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mDeliverPostImeTimeNanos = System.nanoTime();
33934e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
33944e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
33953915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If the view went away, then the event will not be handled.
33963915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
33974952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, false);
33983915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
33993915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34013915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If the key's purpose is to exit touch mode then we consume it and consider it handled.
34023915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (checkForLeavingTouchModeAndConsume(event)) {
34034952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
34043915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
34053915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
34068506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
34079065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        // Make sure the fallback event policy sees all keys that will be delivered to the
34089065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        // view hierarchy.
34099065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        mFallbackEventHandler.preDispatchKeyEvent(event);
34109065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
34113915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Deliver the key to the view hierarchy.
34123915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView.dispatchKeyEvent(event)) {
34134952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
34143915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
34153915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
341686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato
3417c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown        // If the Control modifier is held, try to interpret the key as a shortcut.
34187bedf2449041a425899448cb672e91b0a5c97c62Jeff Brown        if (event.getAction() == KeyEvent.ACTION_DOWN
3419c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                && event.isCtrlPressed()
34207bedf2449041a425899448cb672e91b0a5c97c62Jeff Brown                && event.getRepeatCount() == 0
3421c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                && !KeyEvent.isModifierKey(event.getKeyCode())) {
3422c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            if (mView.dispatchKeyShortcutEvent(event)) {
34234952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                finishInputEvent(q, true);
3424c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                return;
3425c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            }
3426c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown        }
3427c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
34283915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Apply the fallback event policy.
34293915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mFallbackEventHandler.dispatchKeyEvent(event)) {
34304952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
34313915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
34323915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34343915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Handle automatic focus changes.
34353915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (event.getAction() == KeyEvent.ACTION_DOWN) {
34363915bb845b032dc184dba5e60970b803390ca3edJeff Brown            int direction = 0;
34373915bb845b032dc184dba5e60970b803390ca3edJeff Brown            switch (event.getKeyCode()) {
34383915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_LEFT:
34394e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
34404e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_LEFT;
34414e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
34423915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
34433915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_RIGHT:
34444e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
34454e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_RIGHT;
34464e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
34473915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
34483915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_UP:
34494e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
34504e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_UP;
34514e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
34523915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
34533915bb845b032dc184dba5e60970b803390ca3edJeff Brown            case KeyEvent.KEYCODE_DPAD_DOWN:
34544e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
34554e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_DOWN;
34564e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
34574e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                break;
34584e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            case KeyEvent.KEYCODE_TAB:
34594e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                if (event.hasNoModifiers()) {
34604e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_FORWARD;
34614e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
34624e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                    direction = View.FOCUS_BACKWARD;
34634e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown                }
34643915bb845b032dc184dba5e60970b803390ca3edJeff Brown                break;
34653915bb845b032dc184dba5e60970b803390ca3edJeff Brown            }
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34673915bb845b032dc184dba5e60970b803390ca3edJeff Brown            if (direction != 0) {
34683915bb845b032dc184dba5e60970b803390ca3edJeff Brown                View focused = mView != null ? mView.findFocus() : null;
34693915bb845b032dc184dba5e60970b803390ca3edJeff Brown                if (focused != null) {
34703915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    View v = focused.focusSearch(direction);
34713915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    if (v != null && v != focused) {
34723915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // do the math the get the interesting rect
34733915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // of previous focused into the coord system of
34743915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // newly focused view
34753915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        focused.getFocusedRect(mTempRect);
34763915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        if (mView instanceof ViewGroup) {
34773915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            ((ViewGroup) mView).offsetDescendantRectToMyCoords(
34783915bb845b032dc184dba5e60970b803390ca3edJeff Brown                                    focused, mTempRect);
34793915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            ((ViewGroup) mView).offsetRectIntoDescendantCoords(
34803915bb845b032dc184dba5e60970b803390ca3edJeff Brown                                    v, mTempRect);
34813915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        }
34823915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        if (v.requestFocus(direction, mTempRect)) {
34833915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            playSoundEffect(
34843915bb845b032dc184dba5e60970b803390ca3edJeff Brown                                    SoundEffectConstants.getContantForFocusDirection(direction));
34854952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                            finishInputEvent(q, true);
34863915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            return;
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34893915bb845b032dc184dba5e60970b803390ca3edJeff Brown
34903915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    // Give the focused view a last chance to handle the dpad key.
34913915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    if (mView.dispatchUnhandledMove(focused, direction)) {
34924952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        finishInputEvent(q, true);
34933915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        return;
34943915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    }
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34973915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34993915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Key was unhandled.
35004952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        finishInputEvent(q, false);
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3503a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /* drag/drop */
3504407b4e91fe7627545b8110e683953353236b4543Christopher Tate    void setLocalDragState(Object obj) {
3505407b4e91fe7627545b8110e683953353236b4543Christopher Tate        mLocalDragState = obj;
3506407b4e91fe7627545b8110e683953353236b4543Christopher Tate    }
3507407b4e91fe7627545b8110e683953353236b4543Christopher Tate
3508a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    private void handleDragEvent(DragEvent event) {
3509a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // From the root, only drag start/end/location are dispatched.  entered/exited
3510a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // are determined and dispatched by the viewgroup hierarchy, who then report
3511a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // that back here for ultimate reporting back to the framework.
3512a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (mView != null && mAdded) {
3513a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            final int what = event.mAction;
3514a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3515a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            if (what == DragEvent.ACTION_DRAG_EXITED) {
3516a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // A direct EXITED event means that the window manager knows we've just crossed
3517a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // a window boundary, so the current drag target within this one must have
3518a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // just been exited.  Send it the usual notifications and then we're done
3519a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // for now.
35209d1ab883293b047b654935b84d0803c8c383be91Chris Tate                mView.dispatchDragEvent(event);
3521a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } else {
3522a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Cache the drag description when the operation starts, then fill it in
3523a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // on subsequent calls as a convenience
3524a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if (what == DragEvent.ACTION_DRAG_STARTED) {
35259d1ab883293b047b654935b84d0803c8c383be91Chris Tate                    mCurrentDragView = null;    // Start the current-recipient tracking
3526a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    mDragDescription = event.mClipDescription;
3527a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                } else {
3528a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mClipDescription = mDragDescription;
3529a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3530a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3531a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // For events with a [screen] location, translate into window coordinates
3532a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if ((what == DragEvent.ACTION_DRAG_LOCATION) || (what == DragEvent.ACTION_DROP)) {
3533a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    mDragPoint.set(event.mX, event.mY);
3534a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mTranslator != null) {
3535a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mTranslator.translatePointInScreenToAppWindow(mDragPoint);
3536a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3537a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3538a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mCurScrollY != 0) {
3539a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragPoint.offset(0, mCurScrollY);
3540a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3541a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3542a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mX = mDragPoint.x;
3543a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mY = mDragPoint.y;
3544a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3545a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3546a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Remember who the current drag target is pre-dispatch
3547a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                final View prevDragView = mCurrentDragView;
3548a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3549a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Now dispatch the drag/drop event
3550d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                boolean result = mView.dispatchDragEvent(event);
3551a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3552a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // If we changed apparent drag target, tell the OS about it
3553a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if (prevDragView != mCurrentDragView) {
3554a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    try {
3555a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (prevDragView != null) {
3556a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            sWindowSession.dragRecipientExited(mWindow);
3557a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
3558a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (mCurrentDragView != null) {
3559a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            sWindowSession.dragRecipientEntered(mWindow);
3560a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
3561a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } catch (RemoteException e) {
3562a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.e(TAG, "Unable to note drag target change");
3563a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3564a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3565d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate
3566407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // Report the drop result when we're done
3567d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                if (what == DragEvent.ACTION_DROP) {
35681fc014fd0051a48083c6d469c2a4f22da1aa15e4Christopher Tate                    mDragDescription = null;
3569d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    try {
3570d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Log.i(TAG, "Reporting drop result: " + result);
3571d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        sWindowSession.reportDropResult(mWindow, result);
3572d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    } catch (RemoteException e) {
3573d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Log.e(TAG, "Unable to report drop result");
3574d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
3575d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                }
3576407b4e91fe7627545b8110e683953353236b4543Christopher Tate
3577407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // When the drag operation ends, release any local state object
3578407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // that may have been in use
3579407b4e91fe7627545b8110e683953353236b4543Christopher Tate                if (what == DragEvent.ACTION_DRAG_ENDED) {
3580407b4e91fe7627545b8110e683953353236b4543Christopher Tate                    setLocalDragState(null);
3581407b4e91fe7627545b8110e683953353236b4543Christopher Tate                }
3582a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
3583a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
3584a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        event.recycle();
3585a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
3586a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
35879a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public void handleDispatchSystemUiVisibilityChanged(SystemUiVisibilityInfo args) {
35889a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        if (mSeq != args.seq) {
35899a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            // The sequence has changed, so we need to update our value and make
35909a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            // sure to do a traversal afterward so the window manager is given our
35919a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            // most recent data.
35929a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            mSeq = args.seq;
35939a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            mAttachInfo.mForceReportNewAttributes = true;
35949a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            scheduleTraversals();
35959a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        }
3596664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        if (mView == null) return;
35979a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        if (args.localChanges != 0) {
35989a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            if (mAttachInfo != null) {
35999a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                mAttachInfo.mSystemUiVisibility =
3600211370fd943cf26905001b38b8b1791851b26adcRomain Guy                        (mAttachInfo.mSystemUiVisibility & ~args.localChanges) |
3601211370fd943cf26905001b38b8b1791851b26adcRomain Guy                                (args.localValue & args.localChanges);
3602211370fd943cf26905001b38b8b1791851b26adcRomain Guy                mAttachInfo.mRecomputeGlobalAttributes = true;
36039a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            }
36049a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            mView.updateLocalSystemUiVisibility(args.localValue, args.localChanges);
36059a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            scheduleTraversals();
360614782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato        }
36079a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        mView.dispatchSystemUiVisibilityChanged(args.globalVisibility);
3608664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
3609664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
36102c095f367779ef32130c72849936a2e3013c8492Christopher Tate    public void getLastTouchPoint(Point outLocation) {
36112c095f367779ef32130c72849936a2e3013c8492Christopher Tate        outLocation.x = (int) mLastTouchPoint.x;
36122c095f367779ef32130c72849936a2e3013c8492Christopher Tate        outLocation.y = (int) mLastTouchPoint.y;
36132c095f367779ef32130c72849936a2e3013c8492Christopher Tate    }
36142c095f367779ef32130c72849936a2e3013c8492Christopher Tate
36159d1ab883293b047b654935b84d0803c8c383be91Chris Tate    public void setDragFocus(View newDragTarget) {
3616a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (mCurrentDragView != newDragTarget) {
3617048691cfac42acce24d9462eca5e57ca5aa78e7dChris Tate            mCurrentDragView = newDragTarget;
3618a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
3619a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
3620a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AudioManager getAudioManager() {
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == null) {
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("getAudioManager called when there is no mView");
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAudioManager == null) {
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAudioManager = (AudioManager) mView.getContext().getSystemService(Context.AUDIO_SERVICE);
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAudioManager;
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36318643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    public AccessibilityInteractionController getAccessibilityInteractionController() {
36328643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        if (mView == null) {
36338643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            throw new IllegalStateException("getAccessibilityInteractionController"
36348643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    + " called when there is no mView");
36358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
36365ac84423a28fea4924eb1c389d647defe1c1b93cGilles Debunne        if (mAccessibilityInteractionController == null) {
36375ac84423a28fea4924eb1c389d647defe1c1b93cGilles Debunne            mAccessibilityInteractionController = new AccessibilityInteractionController();
36388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
36395ac84423a28fea4924eb1c389d647defe1c1b93cGilles Debunne        return mAccessibilityInteractionController;
36408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
36418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
364257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov    public AccessibilityNodePrefetcher getAccessibilityNodePrefetcher() {
364379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        if (mView == null) {
364457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            throw new IllegalStateException("getAccessibilityNodePrefetcher"
364579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    + " called when there is no mView");
364679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        }
364757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov        if (mAccessibilityNodePrefetcher == null) {
364857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            mAccessibilityNodePrefetcher = new AccessibilityNodePrefetcher();
364979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        }
365057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov        return mAccessibilityNodePrefetcher;
365179311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov    }
365279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov
36538169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
36548169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            boolean insetsPending) throws RemoteException {
365564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
365664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        float appScale = mAttachInfo.mApplicationScale;
36573d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        boolean restore = false;
365864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (params != null && mTranslator != null) {
3659e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            restore = true;
3660e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            params.backup();
366164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateWindowLayout(params);
36629189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        }
366364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (params != null) {
366464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            if (DBG) Log.d(TAG, "WindowLayout in layoutWindow:" + params);
36653d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        }
3666694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        mPendingConfiguration.seq = 0;
3667f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        //Log.d(TAG, ">>>>>> CALLING relayout");
3668180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn        if (params != null && mOrigWindowType != params.type) {
3669180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn            // For compatibility with old apps, don't crash here.
3670180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn            if (mTargetSdkVersion < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
3671180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                Slog.w(TAG, "Window type can not be changed after "
3672180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                        + "the window is added; ignoring change of " + mView);
3673180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                params.type = mOrigWindowType;
3674180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn            }
3675180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn        }
36768169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima        int relayoutResult = sWindowSession.relayout(
36779a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                mWindow, mSeq, params,
3678189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                (int) (mView.getMeasuredWidth() * appScale + 0.5f),
3679189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                (int) (mView.getMeasuredHeight() * appScale + 0.5f),
36806d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                viewVisibility, insetsPending ? WindowManagerImpl.RELAYOUT_INSETS_PENDING : 0,
36816d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                mWinFrame, mPendingContentInsets, mPendingVisibleInsets,
3682694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mPendingConfiguration, mSurface);
3683f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        //Log.d(TAG, "<<<<<< BACK FROM relayout");
36843d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        if (restore) {
3685e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            params.restore();
36863d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        }
368764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
368864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mTranslator != null) {
368964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWinFrame(mWinFrame);
369064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(mPendingContentInsets);
369164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(mPendingVisibleInsets);
36929189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        }
36938169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima        return relayoutResult;
36948169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    }
36958506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
36969189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    /**
36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void playSoundEffect(int effectId) {
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
370213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi        try {
370313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            final AudioManager audioManager = getAudioManager();
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
370513b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            switch (effectId) {
370613b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.CLICK:
370713b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
370813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
370913b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_DOWN:
371013b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN);
371113b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
371213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_LEFT:
371313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT);
371413b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
371513b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_RIGHT:
371613b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT);
371713b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
371813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_UP:
371913b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP);
372013b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
372113b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                default:
372213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    throw new IllegalArgumentException("unknown effect id " + effectId +
372313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                            " not defined in " + SoundEffectConstants.class.getCanonicalName());
372413b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            }
372513b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi        } catch (IllegalStateException e) {
372613b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            // Exception thrown by getAudioManager() when mView is null
372713b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            Log.e(TAG, "FATAL EXCEPTION when attempting to play sound effect: " + e);
372813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            e.printStackTrace();
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean performHapticFeedback(int effectId, boolean always) {
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sWindowSession.performHapticFeedback(mWindow, effectId, always);
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View focusSearch(View focused, int direction) {
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(mView instanceof ViewGroup)) {
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return FocusFinder.getInstance().findNextFocus((ViewGroup) mView, focused, direction);
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void debug() {
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView.debug();
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
375765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
3758211370fd943cf26905001b38b8b1791851b26adcRomain Guy    public void dumpGfxInfo(int[] info) {
375965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mView != null) {
376065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            getGfxInfo(mView, info);
376165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        } else {
376265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            info[0] = info[1] = 0;
376365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
376465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
376565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
3766a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy    private static void getGfxInfo(View view, int[] info) {
376765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        DisplayList displayList = view.mDisplayList;
376865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        info[0]++;
376965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (displayList != null) {
377065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            info[1] += displayList.getSize();
377165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
377265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
377365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (view instanceof ViewGroup) {
377465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            ViewGroup group = (ViewGroup) view;
377565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
377665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            int count = group.getChildCount();
377765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            for (int i = 0; i < count; i++) {
377865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                getGfxInfo(group.getChildAt(i), info);
377965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
378065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
378165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void die(boolean immediate) {
378494d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        if (immediate) {
378594d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn            doDie();
378694d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        } else {
3787a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            destroyHardwareRenderer();
3788a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.sendEmptyMessage(MSG_DIE);
378994d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        }
379094d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn    }
379194d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn
379294d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn    void doDie() {
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
3794b75fa30aaf03d9e425d150b452501e5df0621351Jeff Brown        if (LOCAL_LOGV) Log.v(TAG, "DIE in " + this + " of " + mSurface);
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
379616260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            if (mAdded) {
379716260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy                mAdded = false;
379816260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy                dispatchDetachedFromWindow();
379916260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            }
380016260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAdded && !mFirst) {
380229d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy                destroyHardwareRenderer();
380329d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int viewVisibility = mView.getVisibility();
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean viewVisibilityChanged = mViewVisibility != viewVisibility;
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWindowAttributesChanged || viewVisibilityChanged) {
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If layout params have been changed, first give them
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to the window manager to make sure it has the correct
38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // animation info.
38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
38118169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                        if ((relayoutWindow(mWindowAttributes, viewVisibility, false)
38126d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                                & WindowManagerImpl.RELAYOUT_RES_FIRST_TIME) != 0) {
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sWindowSession.finishDrawing(mWindow);
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException e) {
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38190586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn                mSurface.release();
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38245fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public void requestUpdateConfiguration(Configuration config) {
3825a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_UPDATE_CONFIGURATION, config);
3826a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
38275fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
38285fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
382929d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy    private void destroyHardwareRenderer() {
3830a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy        AttachInfo attachInfo = mAttachInfo;
3831a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy        HardwareRenderer hardwareRenderer = attachInfo.mHardwareRenderer;
3832a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy
3833a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy        if (hardwareRenderer != null) {
3834a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            if (mView != null) {
3835a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy                hardwareRenderer.destroyHardwareResources(mView);
3836a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            }
3837a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            hardwareRenderer.destroy(true);
3838a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            hardwareRenderer.setRequested(false);
3839a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy
3840a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            attachInfo.mHardwareRenderer = null;
3841a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            attachInfo.mHardwareAccelerated = false;
384229d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy        }
384329d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy    }
384429d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
38454952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    void dispatchImeFinishedEvent(int seq, boolean handled) {
3846a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_IME_FINISHED_EVENT);
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = seq;
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg2 = handled ? 1 : 0;
3849a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
3850a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    }
3851a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
3852a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    public void dispatchFinishInputConnection(InputConnection connection) {
3853a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_FINISH_INPUT_CONNECTION, connection);
3854a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38563d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima
38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchResized(int w, int h, Rect coveredInsets,
3858e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            Rect visibleInsets, boolean reportDraw, Configuration newConfig) {
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_LAYOUT) Log.v(TAG, "Resizing " + this + ": w=" + w
38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " h=" + h + " coveredInsets=" + coveredInsets.toShortString()
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " visibleInsets=" + visibleInsets.toShortString()
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " reportDraw=" + reportDraw);
3863a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(reportDraw ? MSG_RESIZED_REPORT :MSG_RESIZED);
386464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mTranslator != null) {
386564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(coveredInsets);
386664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(visibleInsets);
386764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            w *= mTranslator.applicationInvertedScale;
386864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            h *= mTranslator.applicationInvertedScale;
386964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        }
387064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        msg.arg1 = w;
387164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        msg.arg2 = h;
3872e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ResizedInfo ri = new ResizedInfo();
3873e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ri.coveredInsets = new Rect(coveredInsets);
3874e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ri.visibleInsets = new Rect(visibleInsets);
3875e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ri.newConfig = newConfig;
3876e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        msg.obj = ri;
3877a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38791f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
38801f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    /**
38814952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * Represents a pending input event that is waiting in a queue.
38824952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     *
38834952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * Input events are processed in serial order by the timestamp specified by
3884211370fd943cf26905001b38b8b1791851b26adcRomain Guy     * {@link InputEvent#getEventTimeNano()}.  In general, the input dispatcher delivers
38854952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * one input event to the application at a time and waits for the application
38864952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * to finish handling it before delivering the next one.
38874952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     *
38884952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * However, because the application or IME can synthesize and inject multiple
38894952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * key events at a time without going through the input dispatcher, we end up
38904952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * needing a queue on the application's side.
38911f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase     */
38924952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private static final class QueuedInputEvent {
3893211370fd943cf26905001b38b8b1791851b26adcRomain Guy        public static final int FLAG_DELIVER_POST_IME = 1;
38944952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
38954952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public QueuedInputEvent mNext;
38964952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
38974952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public InputEvent mEvent;
389832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        public InputEventReceiver mReceiver;
38994952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public int mFlags;
39004952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
39014952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // Used for latency calculations.
39024952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public long mReceiveTimeNanos;
39034952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public long mDeliverTimeNanos;
39044952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public long mDeliverPostImeTimeNanos;
39054952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    }
39064952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
39074952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private QueuedInputEvent obtainQueuedInputEvent(InputEvent event,
390832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            InputEventReceiver receiver, int flags) {
39094952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        QueuedInputEvent q = mQueuedInputEventPool;
39104952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (q != null) {
39114952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mQueuedInputEventPoolSize -= 1;
39124952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mQueuedInputEventPool = q.mNext;
39134952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mNext = null;
39144952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        } else {
39154952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q = new QueuedInputEvent();
39161f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        }
39171f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
39184952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        q.mEvent = event;
391932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        q.mReceiver = receiver;
39204952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        q.mFlags = flags;
39214952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        return q;
39224952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    }
39234952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
39244952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void recycleQueuedInputEvent(QueuedInputEvent q) {
39254952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        q.mEvent = null;
392632cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        q.mReceiver = null;
39271f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
39284952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (mQueuedInputEventPoolSize < MAX_QUEUED_INPUT_EVENT_POOL_SIZE) {
39294952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mQueuedInputEventPoolSize += 1;
39304952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mNext = mQueuedInputEventPool;
39314952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mQueuedInputEventPool = q;
39321f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        }
39331f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    }
39341f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
3935f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown    void enqueueInputEvent(InputEvent event) {
3936f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown        enqueueInputEvent(event, null, 0, false);
3937f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown    }
3938f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown
39394952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    void enqueueInputEvent(InputEvent event,
3940f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown            InputEventReceiver receiver, int flags, boolean processImmediately) {
394132cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        QueuedInputEvent q = obtainQueuedInputEvent(event, receiver, flags);
39424952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
39434952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (ViewDebug.DEBUG_LATENCY) {
39444952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mReceiveTimeNanos = System.nanoTime();
39454952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mDeliverTimeNanos = 0;
39464952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mDeliverPostImeTimeNanos = 0;
39474952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
39484952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
39494952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // Always enqueue the input event in order, regardless of its time stamp.
39504952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // We do this because the application or the IME may inject key events
39514952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // in response to touch events and we want to ensure that the injected keys
39524952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // are processed in the order they were received and we cannot trust that
39534952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // the time stamp of injected events are monotonic.
39544952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        QueuedInputEvent last = mFirstPendingInputEvent;
39554952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (last == null) {
39564952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mFirstPendingInputEvent = q;
39571f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        } else {
39584952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            while (last.mNext != null) {
39594952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                last = last.mNext;
39601f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            }
39614952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            last.mNext = q;
39621f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        }
39634952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
3964f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown        if (processImmediately) {
3965f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown            doProcessInputEvents();
3966f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown        } else {
3967f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown            scheduleProcessInputEvents();
3968f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown        }
39691f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    }
39701f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
39714952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void scheduleProcessInputEvents() {
397296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (!mProcessInputEventsScheduled) {
397396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mProcessInputEventsScheduled = true;
3974a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.sendEmptyMessage(MSG_PROCESS_INPUT_EVENTS);
39754952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
397692ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown    }
397792ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown
397896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    private void doProcessInputEvents() {
39794952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        while (mCurrentInputEvent == null && mFirstPendingInputEvent != null) {
39804952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            QueuedInputEvent q = mFirstPendingInputEvent;
39814952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mFirstPendingInputEvent = q.mNext;
39824952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mNext = null;
39834952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mCurrentInputEvent = q;
39844952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            deliverInputEvent(q);
39854952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
3986812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
39874952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // We are done processing all input events that we can process right now
39884952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // so we can clear the pending flag immediately.
398996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (mProcessInputEventsScheduled) {
399096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mProcessInputEventsScheduled = false;
3991a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.removeMessages(MSG_PROCESS_INPUT_EVENTS);
39924952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
39934952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    }
39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39954952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void finishInputEvent(QueuedInputEvent q, boolean handled) {
39964952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (q != mCurrentInputEvent) {
39974952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            throw new IllegalStateException("finished input event out of order");
39989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40004952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (ViewDebug.DEBUG_LATENCY) {
40014952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            final long now = System.nanoTime();
40024952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            final long eventTime = q.mEvent.getEventTimeNano();
40034952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            final StringBuilder msg = new StringBuilder();
40044952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append("Spent ");
40054952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append((now - q.mReceiveTimeNanos) * 0.000001f);
40064952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append("ms processing ");
40074952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (q.mEvent instanceof KeyEvent) {
40084952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                final KeyEvent  keyEvent = (KeyEvent)q.mEvent;
40094952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append("key event, action=");
40104952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append(KeyEvent.actionToString(keyEvent.getAction()));
40114952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            } else {
40124952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                final MotionEvent motionEvent = (MotionEvent)q.mEvent;
40134952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append("motion event, action=");
40144952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append(MotionEvent.actionToString(motionEvent.getAction()));
40154952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append(", historySize=");
40164952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append(motionEvent.getHistorySize());
40174952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
40184952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append(", handled=");
40194952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append(handled);
40204952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append(", received at +");
40214952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append((q.mReceiveTimeNanos - eventTime) * 0.000001f);
40224952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (q.mDeliverTimeNanos != 0) {
40234952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append("ms, delivered at +");
40244952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append((q.mDeliverTimeNanos - eventTime) * 0.000001f);
40254952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
40264952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (q.mDeliverPostImeTimeNanos != 0) {
40274952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append("ms, delivered post IME at +");
40284952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append((q.mDeliverPostImeTimeNanos - eventTime) * 0.000001f);
40294952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
40304952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append("ms, finished at +");
40314952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append((now - eventTime) * 0.000001f);
40324952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append("ms.");
40334952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            Log.d(ViewDebug.DEBUG_LATENCY_TAG, msg.toString());
40344952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
403632cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        if (q.mReceiver != null) {
403732cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            q.mReceiver.finishInputEvent(q.mEvent, handled);
403892cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown        } else {
403992cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown            q.mEvent.recycleIfNeededAfterDispatch();
4040c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40424952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        recycleQueuedInputEvent(q);
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40444952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        mCurrentInputEvent = null;
40454952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (mFirstPendingInputEvent != null) {
40464952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            scheduleProcessInputEvents();
40474952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4049cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
40504a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown    final class FrameRunnable implements Runnable {
40514a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        @Override
40524a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        public void run() {
40534a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown            mFrameScheduled = false;
40544a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown            doFrame();
40554a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        }
40564a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown    }
40574a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown    final FrameRunnable mFrameRunnable = new FrameRunnable();
40584a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown    boolean mFrameScheduled;
40594a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown
406032cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown    final class WindowInputEventReceiver extends InputEventReceiver {
406132cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        public WindowInputEventReceiver(InputChannel inputChannel, Looper looper) {
406232cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            super(inputChannel, looper);
40634952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
406432cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown
406532cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        @Override
406632cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        public void onInputEvent(InputEvent event) {
4067f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown            enqueueInputEvent(event, this, 0, true);
406832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        }
4069072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown
4070072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        @Override
4071072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        public void onBatchedInputEventPending() {
40724a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown            scheduleFrame();
4073072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        }
407432cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown    }
407532cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown    WindowInputEventReceiver mInputEventReceiver;
40764952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
40776cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    final class InvalidateOnAnimationRunnable implements Runnable {
40786cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private boolean mPosted;
40796cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private ArrayList<View> mViews = new ArrayList<View>();
40806cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private ArrayList<AttachInfo.InvalidateInfo> mViewRects =
40816cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                new ArrayList<AttachInfo.InvalidateInfo>();
40826cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private View[] mTempViews;
40836cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private AttachInfo.InvalidateInfo[] mTempViewRects;
40846cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
40856cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        public void addView(View view) {
40866cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            synchronized (this) {
40876cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mViews.add(view);
40886cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                postIfNeededLocked();
40896cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
40906cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        }
40916cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
40926cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        public void addViewRect(AttachInfo.InvalidateInfo info) {
40936cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            synchronized (this) {
40946cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mViewRects.add(info);
40956cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                postIfNeededLocked();
40966cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
40976cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        }
40986cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
40996cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        public void removeView(View view) {
41006cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            synchronized (this) {
41016cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mViews.remove(view);
41026cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
41036cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                for (int i = mViewRects.size(); i-- > 0; ) {
41046cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    AttachInfo.InvalidateInfo info = mViewRects.get(i);
41056cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    if (info.target == view) {
41066cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                        mViewRects.remove(i);
41076cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                        info.release();
41086cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    }
41096cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                }
41106cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
41116cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                if (mPosted && mViews.isEmpty() && mViewRects.isEmpty()) {
41127ae9d5faad5816f7e567ec1ec77e78d746cf7e5cJeff Brown                    mChoreographer.removeAnimationCallbacks(this, null);
41136cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    mPosted = false;
41146cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                }
41156cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
41166cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        }
41176cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
41186cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        @Override
41196cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        public void run() {
41206cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            final int viewCount;
41216cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            final int viewRectCount;
41226cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            synchronized (this) {
41236cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mPosted = false;
41246cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
41256cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                viewCount = mViews.size();
41266cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                if (viewCount != 0) {
41276cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    mTempViews = mViews.toArray(mTempViews != null
41286cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                            ? mTempViews : new View[viewCount]);
41296cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    mViews.clear();
41306cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                }
41316cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
41326cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                viewRectCount = mViewRects.size();
41336cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                if (viewRectCount != 0) {
41346cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    mTempViewRects = mViewRects.toArray(mTempViewRects != null
41356cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                            ? mTempViewRects : new AttachInfo.InvalidateInfo[viewRectCount]);
41366cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    mViewRects.clear();
41376cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                }
41386cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
41396cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
41406cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            for (int i = 0; i < viewCount; i++) {
41416cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mTempViews[i].invalidate();
41426cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
41436cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
41446cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            for (int i = 0; i < viewRectCount; i++) {
41456cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                final View.AttachInfo.InvalidateInfo info = mTempViewRects[i];
41466cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                info.target.invalidate(info.left, info.top, info.right, info.bottom);
41476cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                info.release();
41486cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
41496cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        }
41506cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
41516cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private void postIfNeededLocked() {
41526cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            if (!mPosted) {
41537ae9d5faad5816f7e567ec1ec77e78d746cf7e5cJeff Brown                mChoreographer.postAnimationCallback(this, null);
41546cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mPosted = true;
41556cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
41566cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        }
41576cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    }
41586cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    final InvalidateOnAnimationRunnable mInvalidateOnAnimationRunnable =
41596cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            new InvalidateOnAnimationRunnable();
41606cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
4161a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    public void dispatchInvalidateDelayed(View view, long delayMilliseconds) {
4162a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_INVALIDATE, view);
4163a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessageDelayed(msg, delayMilliseconds);
4164a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    }
4165a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
4166a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    public void dispatchInvalidateRectDelayed(AttachInfo.InvalidateInfo info,
4167a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            long delayMilliseconds) {
4168a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        final Message msg = mHandler.obtainMessage(MSG_INVALIDATE_RECT, info);
4169a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessageDelayed(msg, delayMilliseconds);
4170a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    }
4171a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
41726cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    public void dispatchInvalidateOnAnimation(View view) {
41736cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        mInvalidateOnAnimationRunnable.addView(view);
41746cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    }
41756cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
41766cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    public void dispatchInvalidateRectOnAnimation(AttachInfo.InvalidateInfo info) {
41776cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        mInvalidateOnAnimationRunnable.addViewRect(info);
41786cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    }
41796cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
418051e4d4db296c252641161b39e98f49acebc46062Romain Guy    public void invalidateDisplayList(DisplayList displayList) {
418151e4d4db296c252641161b39e98f49acebc46062Romain Guy        mDisplayLists.add(displayList);
418251e4d4db296c252641161b39e98f49acebc46062Romain Guy
418351e4d4db296c252641161b39e98f49acebc46062Romain Guy        mHandler.removeMessages(MSG_INVALIDATE_DISPLAY_LIST);
418451e4d4db296c252641161b39e98f49acebc46062Romain Guy        Message msg = mHandler.obtainMessage(MSG_INVALIDATE_DISPLAY_LIST);
418551e4d4db296c252641161b39e98f49acebc46062Romain Guy        mHandler.sendMessage(msg);
418651e4d4db296c252641161b39e98f49acebc46062Romain Guy    }
418751e4d4db296c252641161b39e98f49acebc46062Romain Guy
41886cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    public void cancelInvalidate(View view) {
41896cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        mHandler.removeMessages(MSG_INVALIDATE, view);
41906cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        // fixme: might leak the AttachInfo.InvalidateInfo objects instead of returning
41916cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        // them to the pool
41926cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        mHandler.removeMessages(MSG_INVALIDATE_RECT, view);
41936cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        mInvalidateOnAnimationRunnable.removeView(view);
41946cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    }
41956cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
41964952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    public void dispatchKey(KeyEvent event) {
4197a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_DISPATCH_KEY, event);
4198e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown        msg.setAsynchronous(true);
4199a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
4200a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    }
4201a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
4202a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    public void dispatchKeyFromIme(KeyEvent event) {
4203a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_DISPATCH_KEY_FROM_IME, event);
4204e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown        msg.setAsynchronous(true);
4205a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
4206cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
4207cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
42089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchAppVisibility(boolean visible) {
4209a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_DISPATCH_APP_VISIBILITY);
42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = visible ? 1 : 0;
4211a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4214bb9908b828a8cfd5965553be66faa6af89973697Romain Guy    public void dispatchScreenStateChange(boolean on) {
4215bb9908b828a8cfd5965553be66faa6af89973697Romain Guy        Message msg = mHandler.obtainMessage(MSG_DISPATCH_SCREEN_STATE);
42167e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        msg.arg1 = on ? 1 : 0;
42177e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        mHandler.sendMessage(msg);
42187e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy    }
42197e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy
42209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchGetNewSurface() {
4221a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_DISPATCH_GET_NEW_SURFACE);
4222a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
42239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) {
42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = Message.obtain();
4227a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        msg.what = MSG_WINDOW_FOCUS_CHANGED;
42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = hasFocus ? 1 : 0;
42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg2 = inTouchMode ? 1 : 0;
4230a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4233ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    public void dispatchCloseSystemDialogs(String reason) {
4234ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        Message msg = Message.obtain();
4235a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        msg.what = MSG_CLOSE_SYSTEM_DIALOGS;
4236ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        msg.obj = reason;
4237a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
4238ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    }
4239a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
4240a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    public void dispatchDragEvent(DragEvent event) {
424191e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        final int what;
424291e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        if (event.getAction() == DragEvent.ACTION_DRAG_LOCATION) {
4243a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            what = MSG_DISPATCH_DRAG_LOCATION_EVENT;
4244a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.removeMessages(what);
424591e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        } else {
4246a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            what = MSG_DISPATCH_DRAG_EVENT;
424791e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        }
4248a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(what, event);
4249a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
4250a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
4251a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
42529a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility,
42539a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            int localValue, int localChanges) {
42549a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        SystemUiVisibilityInfo args = new SystemUiVisibilityInfo();
42559a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.seq = seq;
42569a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.globalVisibility = globalVisibility;
42579a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.localValue = localValue;
42589a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.localChanges = localChanges;
4259a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(mHandler.obtainMessage(MSG_DISPATCH_SYSTEM_UI_VISIBILITY, args));
4260a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    }
4261a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
4262a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    public void dispatchCheckFocus() {
4263a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        if (!mHandler.hasMessages(MSG_CHECK_FOCUS)) {
4264a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            // This will result in a call to checkFocus() below.
4265a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.sendEmptyMessage(MSG_CHECK_FOCUS);
4266a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        }
4267664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
4268664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
426975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
4270eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * Post a callback to send a
4271eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * {@link AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED} event.
4272a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov     * This event is send at most once every
4273a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov     * {@link ViewConfiguration#getSendRecurringAccessibilityEventsInterval()}.
4274eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     */
4275eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    private void postSendWindowContentChangedCallback() {
4276a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        if (mSendWindowContentChangedAccessibilityEvent == null) {
4277a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov            mSendWindowContentChangedAccessibilityEvent =
4278a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov                new SendWindowContentChangedAccessibilityEvent();
4279a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        }
4280a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        if (!mSendWindowContentChangedAccessibilityEvent.mIsPending) {
4281a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov            mSendWindowContentChangedAccessibilityEvent.mIsPending = true;
4282a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.postDelayed(mSendWindowContentChangedAccessibilityEvent,
4283a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov                    ViewConfiguration.getSendRecurringAccessibilityEventsInterval());
4284eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
4285eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
4286eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
4287eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    /**
4288eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * Remove a posted callback to send a
4289eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * {@link AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED} event.
4290eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     */
4291eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    private void removeSendWindowContentChangedCallback() {
4292a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        if (mSendWindowContentChangedAccessibilityEvent != null) {
4293a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.removeCallbacks(mSendWindowContentChangedAccessibilityEvent);
4294eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
4295eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
4296eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
42979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean showContextMenuForChild(View originalView) {
42989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
42999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43016e34636749217654f43221885afb7a29bb5ca96aAdam Powell    public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) {
43026e34636749217654f43221885afb7a29bb5ca96aAdam Powell        return null;
43036e34636749217654f43221885afb7a29bb5ca96aAdam Powell    }
43046e34636749217654f43221885afb7a29bb5ca96aAdam Powell
43059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void createContextMenu(ContextMenu menu) {
43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void childDrawableStateChanged(View child) {
43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4311736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public boolean requestSendAccessibilityEvent(View child, AccessibilityEvent event) {
4312736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        if (mView == null) {
4313736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            return false;
4314736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        }
43158643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager.sendAccessibilityEvent(event);
4316736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        return true;
4317736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    }
4318736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
43199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void checkThread() {
43209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mThread != Thread.currentThread()) {
43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new CalledFromWrongThreadException(
43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Only the original thread that created a view hierarchy can touch its views.");
43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
4327c6cc0f8c19d9eccf408a443fa2bf668af261dcd0Joe Onorato        // ViewAncestor never intercepts touch event, so this can be a no-op
43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean requestChildRectangleOnScreen(View child, Rect rectangle,
43319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean immediate) {
43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return scrollToRectOrFocus(rectangle, immediate);
43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43348506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
4335539ee8716b4f81260bab2e9f3dc5d88d81c99985Adam Powell    public void childHasTransientStateChanged(View child, boolean hasTransientState) {
4336539ee8716b4f81260bab2e9f3dc5d88d81c99985Adam Powell        // Do nothing.
4337539ee8716b4f81260bab2e9f3dc5d88d81c99985Adam Powell    }
4338539ee8716b4f81260bab2e9f3dc5d88d81c99985Adam Powell
4339dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    class TakenSurfaceHolder extends BaseSurfaceHolder {
4340dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4341dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public boolean onAllowLockCanvas() {
4342dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return mDrawingAllowed;
4343dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4344dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4345dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4346dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void onRelayoutContainer() {
4347dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // Not currently interesting -- from changing between fixed and layout size.
4348dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4349dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4350dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setFormat(int format) {
4351dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceFormat(format);
4352dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4353dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4354dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setType(int type) {
4355dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceType(type);
4356dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4357dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4358dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4359dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void onUpdateSurface() {
4360dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // We take care of format and type changes on our own.
4361dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            throw new IllegalStateException("Shouldn't be here");
4362dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4363dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4364dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public boolean isCreating() {
4365dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return mIsCreating;
4366dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4367dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4368dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4369dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setFixedSize(int width, int height) {
4370dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            throw new UnsupportedOperationException(
4371dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    "Currently only support sizing from layout");
4372dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4373dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4374dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setKeepScreenOn(boolean screenOn) {
4375dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceKeepScreenOn(screenOn);
4376dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4377dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    }
4378dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
43799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class InputMethodCallback extends IInputMethodCallback.Stub {
43806dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        private WeakReference<ViewRootImpl> mViewAncestor;
43819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43826dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        public InputMethodCallback(ViewRootImpl viewAncestor) {
43836dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor);
43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43858506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
43869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void finishedEvent(int seq, boolean handled) {
43876dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
43888643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
43894952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                viewAncestor.dispatchImeFinishedEvent(seq, handled);
43909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43938643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void sessionCreated(IInputMethodSession session) {
43949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Stub -- not for use in the client.
43959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43978506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
43989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class W extends IWindow.Stub {
43996dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        private final WeakReference<ViewRootImpl> mViewAncestor;
44009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44016dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        W(ViewRootImpl viewAncestor) {
44026dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor);
44039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4405fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy        public void resized(int w, int h, Rect coveredInsets, Rect visibleInsets,
4406fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy                boolean reportDraw, Configuration newConfig) {
44076dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
44088643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
44098643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchResized(w, h, coveredInsets, visibleInsets, reportDraw,
44108643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        newConfig);
44119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void dispatchAppVisibility(boolean visible) {
44156dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
44168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
44178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchAppVisibility(visible);
44189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4421bb9908b828a8cfd5965553be66faa6af89973697Romain Guy        public void dispatchScreenState(boolean on) {
44227e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            final ViewRootImpl viewAncestor = mViewAncestor.get();
44237e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            if (viewAncestor != null) {
4424bb9908b828a8cfd5965553be66faa6af89973697Romain Guy                viewAncestor.dispatchScreenStateChange(on);
44257e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            }
44267e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        }
4427bb9908b828a8cfd5965553be66faa6af89973697Romain Guy
44289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void dispatchGetNewSurface() {
44296dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
44308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
44318643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchGetNewSurface();
44329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) {
44366dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
44378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
44388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.windowFocusChanged(hasFocus, inTouchMode);
44399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static int checkCallingPermission(String permission) {
44439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
44449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault().checkPermission(
44459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        permission, Binder.getCallingPid(), Binder.getCallingUid());
44469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
44479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_DENIED;
44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void executeCommand(String command, String parameters, ParcelFileDescriptor out) {
44526dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
44538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
44548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                final View view = viewAncestor.mView;
44559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (view != null) {
44569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (checkCallingPermission(Manifest.permission.DUMP) !=
44579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            PackageManager.PERMISSION_GRANTED) {
44589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw new SecurityException("Insufficient permissions to invoke"
44599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " executeCommand() from pid=" + Binder.getCallingPid()
44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ", uid=" + Binder.getCallingUid());
44619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
44629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    OutputStream clientStream = null;
44649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        clientStream = new ParcelFileDescriptor.AutoCloseOutputStream(out);
44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ViewDebug.dispatchCommand(view, command, parameters, clientStream);
44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException e) {
44689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        e.printStackTrace();
44699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } finally {
44709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (clientStream != null) {
44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                clientStream.close();
44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (IOException e) {
44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                e.printStackTrace();
44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
448172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn
4482ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        public void closeSystemDialogs(String reason) {
44836dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
44848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
44858643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchCloseSystemDialogs(reason);
4486ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            }
4487ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
4488ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn
4489bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
4490bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                boolean sync) {
449119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            if (sync) {
449219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                try {
449319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    sWindowSession.wallpaperOffsetsComplete(asBinder());
449419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                } catch (RemoteException e) {
44957580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                }
44967580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
44977580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
44988643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
44997580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        public void dispatchWallpaperCommand(String action, int x, int y,
45007580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                int z, Bundle extras, boolean sync) {
45017580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (sync) {
45027580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                try {
45037580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    sWindowSession.wallpaperCommandComplete(asBinder(), null);
45047580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                } catch (RemoteException e) {
450519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
450619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            }
450772c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        }
4508a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
4509a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        /* Drag/drop */
4510a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        public void dispatchDragEvent(DragEvent event) {
45116dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
45128643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
45138643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchDragEvent(event);
4514a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
4515a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
4516664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
45179a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        public void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility,
45189a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                int localValue, int localChanges) {
45196dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
45208643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
45219a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                viewAncestor.dispatchSystemUiVisibilityChanged(seq, globalVisibility,
45229a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                        localValue, localChanges);
4523664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            }
4524664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        }
45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Maintains state information for a single trackball axis, generating
45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * discrete (DPAD) movements based on raw trackball motion.
45309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
45319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final class TrackballAxis {
45329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum amount of acceleration we will apply.
45349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final float MAX_ACCELERATION = 20;
45368506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum amount of time (in milliseconds) between events in order
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for us to consider the user to be doing fast trackball movements,
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * and thus apply an acceleration.
45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final long FAST_MOVE_TIME = 150;
45438506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Scaling factor to the time (in milliseconds) between events to how
45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * much to multiple/divide the current acceleration.  When movement
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * is < FAST_MOVE_TIME this multiplies the acceleration; when >
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * FAST_MOVE_TIME it divides it.
45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final float ACCEL_MOVE_SCALING_FACTOR = (1.0f/40);
45518506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float position;
45539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float absPosition;
45549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float acceleration = 1;
45559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long lastMoveTime = 0;
45569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int step;
45579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int dir;
45589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nonAccelMovement;
45599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void reset(int _step) {
45619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            position = 0;
45629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            acceleration = 1;
45639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lastMoveTime = 0;
45649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            step = _step;
45659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dir = 0;
45669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
45699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Add trackball movement into the state.  If the direction of movement
45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * has been reversed, the state is reset before adding the
45719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * movement (so that you don't have to compensate for any previously
45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * collected movement before see the result of the movement in the
45739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * new direction).
45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Returns the absolute value of the amount of movement
45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * collected so far.
45779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float collect(float off, long time, String axis) {
45799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long normTime;
45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (off > 0) {
45819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = (long)(off * FAST_MOVE_TIME);
45829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (dir < 0) {
45839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " reversed to positive!");
45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    position = 0;
45859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    step = 0;
45869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = 1;
45879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastMoveTime = 0;
45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
45899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = 1;
45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (off < 0) {
45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = (long)((-off) * FAST_MOVE_TIME);
45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (dir > 0) {
45939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " reversed to negative!");
45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    position = 0;
45959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    step = 0;
45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = 1;
45979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastMoveTime = 0;
45989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
45999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = -1;
46009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
46019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = 0;
46029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46038506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
46049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The number of milliseconds between each movement that is
46059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // considered "normal" and will not result in any acceleration
46069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // or deceleration, scaled by the offset we have here.
46079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (normTime > 0) {
46089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long delta = time - lastMoveTime;
46099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lastMoveTime = time;
46109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float acc = acceleration;
46119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (delta < normTime) {
46129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // The user is scrolling rapidly, so increase acceleration.
46139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float scale = (normTime-delta) * ACCEL_MOVE_SCALING_FACTOR;
46149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (scale > 1) acc *= scale;
46159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " accelerate: off="
46169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + off + " normTime=" + normTime + " delta=" + delta
46179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " scale=" + scale + " acc=" + acc);
46189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = acc < MAX_ACCELERATION ? acc : MAX_ACCELERATION;
46199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
46209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // The user is scrolling slowly, so decrease acceleration.
46219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float scale = (delta-normTime) * ACCEL_MOVE_SCALING_FACTOR;
46229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (scale > 1) acc /= scale;
46239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " deccelerate: off="
46249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + off + " normTime=" + normTime + " delta=" + delta
46259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " scale=" + scale + " acc=" + acc);
46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = acc > 1 ? acc : 1;
46279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
46299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            position += off;
46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (absPosition = Math.abs(position));
46319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
46349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Generate the number of discrete movement events appropriate for
46359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the currently collected trackball movement.
46369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
46379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param precision The minimum movement required to generate the
46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * first discrete movement.
46399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Returns the number of discrete movements, either positive
46419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * or negative, or 0 if there is not enough trackball movement yet
46429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for a discrete movement.
46439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
46449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int generate(float precision) {
46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int movement = 0;
46469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            nonAccelMovement = 0;
46479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
46489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int dir = position >= 0 ? 1 : -1;
46499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (step) {
46509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we are going to execute the first step, then we want
46519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to do this as soon as possible instead of waiting for
46529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // a full movement, in order to make things look responsive.
46539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case 0:
46549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < precision) {
46559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
46569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
46579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
46589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        nonAccelMovement += dir;
46599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        step = 1;
46609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
46619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we have generated the first movement, then we need
46629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to wait for the second complete trackball motion before
46639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // generating the second discrete movement.
46649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case 1:
46659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < 2) {
46669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
46679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
46689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
46699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        nonAccelMovement += dir;
46709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        position += dir > 0 ? -2 : 2;
46719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        absPosition = Math.abs(position);
46729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        step = 2;
46739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
46749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // After the first two, we generate discrete movements
46759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // consistently with the trackball, applying an acceleration
46769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // if the trackball is moving quickly.  This is a simple
46779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // acceleration on top of what we already compute based
46789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // on how quickly the wheel is being turned, to apply
46799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // a longer increasing acceleration to continuous movement
46809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in one direction.
46819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    default:
46829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < 1) {
46839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
46849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
46869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        position += dir >= 0 ? -1 : 1;
46879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        absPosition = Math.abs(position);
46889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        float acc = acceleration;
46899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        acc *= 1.1f;
46909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        acceleration = acc < MAX_ACCELERATION ? acc : acceleration;
46919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
46929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
46939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (true);
46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class CalledFromWrongThreadException extends AndroidRuntimeException {
46989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CalledFromWrongThreadException(String msg) {
46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(msg);
47009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SurfaceHolder mHolder = new SurfaceHolder() {
47049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // we only need a SurfaceHolder for opengl. it would be nice
47059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to implement everything else though, especially the callback
47069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // support (opengl doesn't make use of it right now, but eventually
47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // will).
47089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface getSurface() {
47099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSurface;
47109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isCreating() {
47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
47149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void addCallback(Callback callback) {
47179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void removeCallback(Callback callback) {
47209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setFixedSize(int width, int height) {
47239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setSizeFromLayout() {
47269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setFormat(int format) {
47299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setType(int type) {
47329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setKeepScreenOn(boolean screenOn) {
47359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Canvas lockCanvas() {
47389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Canvas lockCanvas(Rect dirty) {
47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
47439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unlockCanvasAndPost(Canvas canvas) {
47469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Rect getSurfaceFrame() {
47489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
47499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
47519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static RunQueue getRunQueue() {
47539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RunQueue rq = sRunQueues.get();
47549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rq != null) {
47559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return rq;
47569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        rq = new RunQueue();
47589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sRunQueues.set(rq);
47599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return rq;
47609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47618506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
47629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4763a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown     * The run queue is used to enqueue pending work from Views when no Handler is
4764a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown     * attached.  The work is executed during the next call to performTraversals on
4765a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown     * the thread.
47669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
47679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final class RunQueue {
47699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ArrayList<HandlerAction> mActions = new ArrayList<HandlerAction>();
47709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void post(Runnable action) {
47729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            postDelayed(action, 0);
47739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void postDelayed(Runnable action, long delayMillis) {
47769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            HandlerAction handlerAction = new HandlerAction();
47779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.action = action;
47789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.delay = delayMillis;
47799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
47819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mActions.add(handlerAction);
47829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void removeCallbacks(Runnable action) {
47869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HandlerAction handlerAction = new HandlerAction();
47879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.action = action;
47889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
47909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ArrayList<HandlerAction> actions = mActions;
47919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (actions.remove(handlerAction)) {
47939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Keep going
47949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
47959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void executeActions(Handler handler) {
47999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
48009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ArrayList<HandlerAction> actions = mActions;
48019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int count = actions.size();
48029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < count; i++) {
48049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final HandlerAction handlerAction = actions.get(i);
48059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    handler.postDelayed(handlerAction.action, handlerAction.delay);
48069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
48079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
480815df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy                actions.clear();
48099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static class HandlerAction {
48139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Runnable action;
48149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long delay;
48159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
48179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public boolean equals(Object o) {
48189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (this == o) return true;
48199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (o == null || getClass() != o.getClass()) return false;
48209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                HandlerAction that = (HandlerAction) o;
48229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return !(action != null ? !action.equals(that.action) : that.action != null);
48239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
48279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int hashCode() {
48289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int result = action != null ? action.hashCode() : 0;
48299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = 31 * result + (int) (delay ^ (delay >>> 32));
48309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return result;
48319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
48368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * Class for managing the accessibility interaction connection
48378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * based on the global accessibility state.
48388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
48398643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final class AccessibilityInteractionConnectionManager
48408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            implements AccessibilityStateChangeListener {
48418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void onAccessibilityStateChanged(boolean enabled) {
48428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (enabled) {
48438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                ensureConnection();
48440d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                if (mAttachInfo != null && mAttachInfo.mHasWindowFocus) {
48450d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
48460d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    View focusedView = mView.findFocus();
48470d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    if (focusedView != null && focusedView != mView) {
48480d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                        focusedView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
48490d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    }
48500d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                }
48518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            } else {
48528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                ensureNoConnection();
48538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
48548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
48558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
48568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void ensureConnection() {
48570d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov            if (mAttachInfo != null) {
48580d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                final boolean registered =
48590d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    mAttachInfo.mAccessibilityWindowId != AccessibilityNodeInfo.UNDEFINED;
48600d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                if (!registered) {
48610d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    mAttachInfo.mAccessibilityWindowId =
48620d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                        mAccessibilityManager.addAccessibilityInteractionConnection(mWindow,
48630d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                                new AccessibilityInteractionConnection(ViewRootImpl.this));
48640d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                }
48658643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
48668643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
48678643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
48688643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void ensureNoConnection() {
48690d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov            final boolean registered =
48700d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                mAttachInfo.mAccessibilityWindowId != AccessibilityNodeInfo.UNDEFINED;
48718643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (registered) {
48720d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                mAttachInfo.mAccessibilityWindowId = AccessibilityNodeInfo.UNDEFINED;
48738643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAccessibilityManager.removeAccessibilityInteractionConnection(mWindow);
48748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
48758643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
48768643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
48778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
48788643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
48798643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * This class is an interface this ViewAncestor provides to the
48808643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * AccessibilityManagerService to the latter can interact with
48818643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * the view hierarchy in this ViewAncestor.
48828643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
4883af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov    static final class AccessibilityInteractionConnection
48848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            extends IAccessibilityInteractionConnection.Stub {
4885021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov        private final WeakReference<ViewRootImpl> mViewRootImpl;
48868643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
4887f79f476fd1e25d3d7bf77e890d064a503537e939Svetoslav Ganov        AccessibilityInteractionConnection(ViewRootImpl viewRootImpl) {
4888f79f476fd1e25d3d7bf77e890d064a503537e939Svetoslav Ganov            mViewRootImpl = new WeakReference<ViewRootImpl>(viewRootImpl);
48898643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
48908643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
4891021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov        public void findAccessibilityNodeInfoByAccessibilityId(long accessibilityNodeId,
48928bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
489357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                int prefetchFlags, int interrogatingPid, long interrogatingTid) {
4894021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            ViewRootImpl viewRootImpl = mViewRootImpl.get();
4895021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            if (viewRootImpl != null && viewRootImpl.mView != null) {
4896af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
4897021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                    .findAccessibilityNodeInfoByAccessibilityIdClientThread(accessibilityNodeId,
489857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        interactionId, callback, prefetchFlags, interrogatingPid, interrogatingTid);
489979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            } else {
490079311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                // We cannot make the call and notify the caller so it does not wait.
490179311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                try {
490279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    callback.setFindAccessibilityNodeInfosResult(null, interactionId);
490379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                } catch (RemoteException re) {
490479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    /* best effort - ignore */
490579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                }
4906601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
49078643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
49088643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
4909021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov        public void performAccessibilityAction(long accessibilityNodeId, int action,
49108bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
49118bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interogatingPid, long interrogatingTid) {
4912021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            ViewRootImpl viewRootImpl = mViewRootImpl.get();
4913021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            if (viewRootImpl != null && viewRootImpl.mView != null) {
4914af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
4915021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                    .performAccessibilityActionClientThread(accessibilityNodeId, action,
4916021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            interactionId, callback, interogatingPid, interrogatingTid);
491779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            } else {
491879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                // We cannot make the call and notify the caller so it does not
491979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                try {
492079311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    callback.setPerformAccessibilityActionResult(false, interactionId);
492179311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                } catch (RemoteException re) {
492279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    /* best effort - ignore */
492379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                }
49248643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49258643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
49268643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
492779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        public void findAccessibilityNodeInfoByViewId(long accessibilityNodeId, int viewId,
49288bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
49298bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interrogatingPid, long interrogatingTid) {
4930021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            ViewRootImpl viewRootImpl = mViewRootImpl.get();
4931021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            if (viewRootImpl != null && viewRootImpl.mView != null) {
4932af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
493379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    .findAccessibilityNodeInfoByViewIdClientThread(accessibilityNodeId, viewId,
493479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                            interactionId, callback, interrogatingPid, interrogatingTid);
493579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            } else {
493679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                // We cannot make the call and notify the caller so it does not
493779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                try {
493879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    callback.setFindAccessibilityNodeInfoResult(null, interactionId);
493979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                } catch (RemoteException re) {
494079311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    /* best effort - ignore */
494179311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                }
49428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
49448643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
494579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        public void findAccessibilityNodeInfosByText(long accessibilityNodeId, String text,
49468bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
49478bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interrogatingPid, long interrogatingTid) {
4948021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            ViewRootImpl viewRootImpl = mViewRootImpl.get();
4949021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            if (viewRootImpl != null && viewRootImpl.mView != null) {
4950af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
495179311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    .findAccessibilityNodeInfosByTextClientThread(accessibilityNodeId, text,
49528bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                            interactionId, callback, interrogatingPid, interrogatingTid);
495379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            } else {
495479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                // We cannot make the call and notify the caller so it does not
495579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                try {
495679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    callback.setFindAccessibilityNodeInfosResult(null, interactionId);
495779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                } catch (RemoteException re) {
495879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    /* best effort - ignore */
495979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                }
49608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
49618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
49628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
49638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
49658643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * Class for managing accessibility interactions initiated from the system
49668643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * and targeting the view hierarchy. A *ClientThread method is to be
49678643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * called from the interaction connection this ViewAncestor gives the
49688643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * system to talk to it and a corresponding *UiThread method that is executed
49698643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * on the UI thread.
49708643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
49718643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final class AccessibilityInteractionController {
49728643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private static final int POOL_SIZE = 5;
49738643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private ArrayList<AccessibilityNodeInfo> mTempAccessibilityNodeInfoList =
49758643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            new ArrayList<AccessibilityNodeInfo>();
49768643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        // Reusable poolable arguments for interacting with the view hierarchy
49788643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        // to fit more arguments than Message and to avoid sharing objects between
49798643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        // two messages since several threads can send messages concurrently.
49808643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private final Pool<SomeArgs> mPool = Pools.synchronizedPool(Pools.finitePool(
49818643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                new PoolableManager<SomeArgs>() {
49828643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    public SomeArgs newInstance() {
49838643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        return new SomeArgs();
49848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    }
49858643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49868643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    public void onAcquired(SomeArgs info) {
49878643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        /* do nothing */
49888643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    }
49898643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49908643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    public void onReleased(SomeArgs info) {
49918643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                        info.clear();
49928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    }
49938643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }, POOL_SIZE)
49948643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        );
49958643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49968643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public class SomeArgs implements Poolable<SomeArgs> {
49978643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            private SomeArgs mNext;
49988643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            private boolean mIsPooled;
49998643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
50008643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public Object arg1;
50018643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public Object arg2;
50028643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public int argi1;
50038643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public int argi2;
50048643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public int argi3;
50058643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
50068643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public SomeArgs getNextPoolable() {
50078643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return mNext;
50088643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
50098643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
50108643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public boolean isPooled() {
50118643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return mIsPooled;
50128643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
50138643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
50148643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public void setNextPoolable(SomeArgs args) {
50158643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mNext = args;
50168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
50178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
50188643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            public void setPooled(boolean isPooled) {
50198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mIsPooled = isPooled;
50208643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
50218643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
50228643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            private void clear() {
50238643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                arg1 = null;
50248643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                arg2 = null;
50258643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                argi1 = 0;
50268643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                argi2 = 0;
50278643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                argi3 = 0;
50288643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
50298643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
50308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
5031021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov        public void findAccessibilityNodeInfoByAccessibilityIdClientThread(
5032021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                long accessibilityNodeId, int interactionId,
503357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                IAccessibilityInteractionConnectionCallback callback, int prefetchFlags,
503457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                int interrogatingPid, long interrogatingTid) {
5035a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            Message message = mHandler.obtainMessage();
5036a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            message.what = MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID;
503757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            message.arg1 = prefetchFlags;
5038021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            SomeArgs args = mPool.acquire();
5039021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            args.argi1 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId);
5040021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            args.argi2 = AccessibilityNodeInfo.getVirtualDescendantId(accessibilityNodeId);
5041021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            args.argi3 = interactionId;
5042021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            args.arg1 = callback;
5043021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            message.obj = args;
50448bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // If the interrogation is performed by the same thread as the main UI
50458bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // thread in this process, set the message as a static reference so
50468bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // after this call completes the same thread but in the interrogating
50478bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // client can handle the message to generate the result.
50488bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            if (interrogatingPid == Process.myPid()
50498bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                    && interrogatingTid == Looper.getMainLooper().getThread().getId()) {
5050021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                AccessibilityInteractionClient.getInstanceForThread(
5051021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        interrogatingTid).setSameThreadMessage(message);
50528bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            } else {
5053a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                mHandler.sendMessage(message);
50548bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            }
50558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
50568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
50578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByAccessibilityIdUiThread(Message message) {
505857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            final int prefetchFlags = message.arg1;
5059021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            SomeArgs args = (SomeArgs) message.obj;
5060021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            final int accessibilityViewId = args.argi1;
5061021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            final int virtualDescendantId = args.argi2;
5062021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            final int interactionId = args.argi3;
50638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
5064021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) args.arg1;
5065021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            mPool.release(args);
506679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            List<AccessibilityNodeInfo> infos = mTempAccessibilityNodeInfoList;
506779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            infos.clear();
50688dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            try {
506957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                View target = null;
50700d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                if (accessibilityViewId == AccessibilityNodeInfo.UNDEFINED) {
507157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    target = ViewRootImpl.this.mView;
50720d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                } else {
507357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    target = findViewByAccessibilityId(accessibilityViewId);
507457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                }
507557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                if (target != null && target.getVisibility() == View.VISIBLE) {
507657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    getAccessibilityNodePrefetcher().prefetchAccessibilityNodeInfos(target,
507757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            virtualDescendantId, prefetchFlags, infos);
50788dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
50798dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
50808643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                try {
508179311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    callback.setFindAccessibilityNodeInfosResult(infos, interactionId);
508279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    infos.clear();
50838643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                } catch (RemoteException re) {
50848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    /* ignore - the other side will time out */
50858643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }
50868643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
50878643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
50888643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
508979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        public void findAccessibilityNodeInfoByViewIdClientThread(long accessibilityNodeId,
509079311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                int viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback,
509179311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                int interrogatingPid, long interrogatingTid) {
5092a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            Message message = mHandler.obtainMessage();
5093a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            message.what = MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID;
509479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            message.arg1 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId);
509579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            SomeArgs args = mPool.acquire();
509679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            args.argi1 = viewId;
509779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            args.argi2 = interactionId;
509879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            args.arg1 = callback;
509979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            message.obj = args;
51008bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // If the interrogation is performed by the same thread as the main UI
51018bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // thread in this process, set the message as a static reference so
51028bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // after this call completes the same thread but in the interrogating
51038bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // client can handle the message to generate the result.
51048bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            if (interrogatingPid == Process.myPid()
51058bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                    && interrogatingTid == Looper.getMainLooper().getThread().getId()) {
5106021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                AccessibilityInteractionClient.getInstanceForThread(
5107021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        interrogatingTid).setSameThreadMessage(message);
51088bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            } else {
5109a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                mHandler.sendMessage(message);
51108bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            }
51118643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
51128643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
51138643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void findAccessibilityNodeInfoByViewIdUiThread(Message message) {
511479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            final int accessibilityViewId = message.arg1;
511579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            SomeArgs args = (SomeArgs) message.obj;
511679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            final int viewId = args.argi1;
511779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            final int interactionId = args.argi2;
51188643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
511979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) args.arg1;
512079311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            mPool.release(args);
51218dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            AccessibilityNodeInfo info = null;
51228dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            try {
512379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                View root = null;
51240d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED) {
512579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    root = findViewByAccessibilityId(accessibilityViewId);
512679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                } else {
512779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    root = ViewRootImpl.this.mView;
512879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                }
512979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                if (root != null) {
513079311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    View target = root.findViewById(viewId);
513179311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    if (target != null && target.getVisibility() == View.VISIBLE) {
513279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                        info = target.createAccessibilityNodeInfo();
513379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    }
51348dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
51358dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
51368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                try {
51378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    callback.setFindAccessibilityNodeInfoResult(info, interactionId);
51388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                } catch (RemoteException re) {
51398643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    /* ignore - the other side will time out */
51408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }
51418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
51428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
51438643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
514479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        public void findAccessibilityNodeInfosByTextClientThread(long accessibilityNodeId,
514579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                String text, int interactionId,
51468bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                IAccessibilityInteractionConnectionCallback callback, int interrogatingPid,
51478bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                long interrogatingTid) {
5148a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            Message message = mHandler.obtainMessage();
5149a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            message.what = MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT;
51508643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = mPool.acquire();
51518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.arg1 = text;
5152021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            args.argi1 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId);
5153021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            args.argi2 = AccessibilityNodeInfo.getVirtualDescendantId(accessibilityNodeId);
5154021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            args.argi3 = interactionId;
51558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.arg2 = callback;
51568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.obj = args;
51578bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // If the interrogation is performed by the same thread as the main UI
51588bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // thread in this process, set the message as a static reference so
51598bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // after this call completes the same thread but in the interrogating
51608bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // client can handle the message to generate the result.
51618bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            if (interrogatingPid == Process.myPid()
51628bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                    && interrogatingTid == Looper.getMainLooper().getThread().getId()) {
5163021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                AccessibilityInteractionClient.getInstanceForThread(
5164021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        interrogatingTid).setSameThreadMessage(message);
51658bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            } else {
5166a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                mHandler.sendMessage(message);
51678bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            }
51688643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
51698643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
5170021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov        public void findAccessibilityNodeInfosByTextUiThread(Message message) {
51718643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = (SomeArgs) message.obj;
51728643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final String text = (String) args.arg1;
5173eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            final int accessibilityViewId = args.argi1;
5174021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            final int virtualDescendantId = args.argi2;
5175021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            final int interactionId = args.argi3;
51768643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
51778643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) args.arg2;
51788643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            mPool.release(args);
51798dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            List<AccessibilityNodeInfo> infos = null;
51808dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            try {
5181211370fd943cf26905001b38b8b1791851b26adcRomain Guy                View target;
51820d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                if (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED) {
5183021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                    target = findViewByAccessibilityId(accessibilityViewId);
5184eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                } else {
5185021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                    target = ViewRootImpl.this.mView;
5186eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                }
5187021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                if (target != null && target.getVisibility() == View.VISIBLE) {
5188021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                    AccessibilityNodeProvider provider = target.getAccessibilityNodeProvider();
5189021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                    if (provider != null) {
5190021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        infos = provider.findAccessibilityNodeInfosByText(text,
5191021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                virtualDescendantId);
51920d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    } else if (virtualDescendantId == AccessibilityNodeInfo.UNDEFINED) {
5193021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        ArrayList<View> foundViews = mAttachInfo.mFocusablesTempList;
5194021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        foundViews.clear();
5195021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        target.findViewsWithText(foundViews, text, View.FIND_VIEWS_WITH_TEXT
5196021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                | View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION
5197021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                | View.FIND_VIEWS_WITH_ACCESSIBILITY_NODE_PROVIDERS);
5198021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        if (!foundViews.isEmpty()) {
5199021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            infos = mTempAccessibilityNodeInfoList;
5200021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            infos.clear();
5201021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            final int viewCount = foundViews.size();
5202021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            for (int i = 0; i < viewCount; i++) {
5203021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                View foundView = foundViews.get(i);
5204021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                if (foundView.getVisibility() == View.VISIBLE) {
5205021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    provider = foundView.getAccessibilityNodeProvider();
5206021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    if (provider != null) {
5207021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                        List<AccessibilityNodeInfo> infosFromProvider =
5208021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                            provider.findAccessibilityNodeInfosByText(text,
5209021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                                    virtualDescendantId);
5210021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                        if (infosFromProvider != null) {
5211021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                            infos.addAll(infosFromProvider);
5212021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                        }
5213021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    } else  {
5214021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                        infos.add(foundView.createAccessibilityNodeInfo());
5215021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    }
5216021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                }
5217021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            }
5218021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        }
5219ea1da3d2e61625afcc7753ba2e03c5d2fb565daeSvetoslav Ganov                    }
5220021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                }
52218dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
52228dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                try {
52238dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    callback.setFindAccessibilityNodeInfosResult(infos, interactionId);
52248dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                } catch (RemoteException re) {
52258dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    /* ignore - the other side will time out */
52268dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
52278643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
52288643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
52298643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
5230021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov        public void performAccessibilityActionClientThread(long accessibilityNodeId, int action,
52318bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
52328bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interogatingPid, long interrogatingTid) {
5233a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            Message message = mHandler.obtainMessage();
5234a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            message.what = MSG_PERFORM_ACCESSIBILITY_ACTION;
5235021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            message.arg1 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId);
5236021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            message.arg2 = AccessibilityNodeInfo.getVirtualDescendantId(accessibilityNodeId);
52378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = mPool.acquire();
5238021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            args.argi1 = action;
5239021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            args.argi2 = interactionId;
52408643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            args.arg1 = callback;
52418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            message.obj = args;
52428bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // If the interrogation is performed by the same thread as the main UI
52438bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // thread in this process, set the message as a static reference so
52448bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // after this call completes the same thread but in the interrogating
52458bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            // client can handle the message to generate the result.
52468bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            if (interogatingPid == Process.myPid()
52478bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                    && interrogatingTid == Looper.getMainLooper().getThread().getId()) {
5248021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                AccessibilityInteractionClient.getInstanceForThread(
5249021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        interrogatingTid).setSameThreadMessage(message);
52508bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            } else {
5251a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                mHandler.sendMessage(message);
52528bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            }
52538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
52548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
52558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void perfromAccessibilityActionUiThread(Message message) {
5256021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            final int accessibilityViewId = message.arg1;
5257021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            final int virtualDescendantId = message.arg2;
52588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            SomeArgs args = (SomeArgs) message.obj;
5259021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            final int action = args.argi1;
5260021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            final int interactionId = args.argi2;
52618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            final IAccessibilityInteractionConnectionCallback callback =
52628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                (IAccessibilityInteractionConnectionCallback) args.arg1;
52638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            mPool.release(args);
52648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            boolean succeeded = false;
52658643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            try {
5266021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                View target = findViewByAccessibilityId(accessibilityViewId);
5267021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                if (target != null && target.getVisibility() == View.VISIBLE) {
5268021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                    AccessibilityNodeProvider provider = target.getAccessibilityNodeProvider();
5269021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                    if (provider != null) {
5270021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        succeeded = provider.performAccessibilityAction(action,
5271021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                virtualDescendantId);
52720d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    } else if (virtualDescendantId == AccessibilityNodeInfo.UNDEFINED) {
5273021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        switch (action) {
5274021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            case AccessibilityNodeInfo.ACTION_FOCUS: {
5275021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                if (!target.hasFocus()) {
5276021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    // Get out of touch mode since accessibility
5277021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    // wants to move focus around.
5278021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    ensureTouchMode(false);
5279021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    succeeded = target.requestFocus();
5280021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                }
5281021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            } break;
5282021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            case AccessibilityNodeInfo.ACTION_CLEAR_FOCUS: {
5283021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                if (target.hasFocus()) {
5284021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    target.clearFocus();
5285021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    succeeded = !target.isFocused();
5286021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                }
5287021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            } break;
5288021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            case AccessibilityNodeInfo.ACTION_SELECT: {
5289021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                if (!target.isSelected()) {
5290021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    target.setSelected(true);
5291021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    succeeded = target.isSelected();
5292021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                }
5293021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            } break;
5294021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            case AccessibilityNodeInfo.ACTION_CLEAR_SELECTION: {
5295021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                if (target.isSelected()) {
5296021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    target.setSelected(false);
5297021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                    succeeded = !target.isSelected();
5298021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                                }
5299021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                            } break;
5300021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                        }
5301021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                    }
53028dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
53038dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov            } finally {
53048dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                try {
53058dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    callback.setPerformAccessibilityActionResult(succeeded, interactionId);
53068dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                } catch (RemoteException re) {
53078dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                    /* ignore - the other side will time out */
53088dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
53098643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
53108643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
53118643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
53128643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        private View findViewByAccessibilityId(int accessibilityId) {
53136dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            View root = ViewRootImpl.this.mView;
53148643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (root == null) {
53158643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                return null;
53168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
53172cdedffcfa5594f9d516fa235d5edf4d4f92c21dSvetoslav Ganov            View foundView = root.findViewByAccessibilityId(accessibilityId);
53182cdedffcfa5594f9d516fa235d5edf4d4f92c21dSvetoslav Ganov            if (foundView != null && foundView.getVisibility() != View.VISIBLE) {
53190b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov                return null;
53200b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov            }
53210b0a41d8e26eaf0f1d9d922621494daf40964a9aSvetoslav Ganov            return foundView;
53228643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
53238643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
5324eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
5325a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov    private class SendWindowContentChangedAccessibilityEvent implements Runnable {
5326a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        public volatile boolean mIsPending;
5327a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov
5328eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        public void run() {
5329eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            if (mView != null) {
533082e236d72ac197d6673d0b4d484fe5f0b9436731Svetoslav Ganov                mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
5331a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov                mIsPending = false;
5332eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            }
5333eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
5334eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
533579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov
533679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov    /**
533779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov     * This class encapsulates a prefetching strategy for the accessibility APIs for
533857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov     * querying window content. It is responsible to prefetch a batch of
533957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov     * AccessibilityNodeInfos in addition to the one for a requested node.
534079311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov     */
534157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov    class AccessibilityNodePrefetcher {
534279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov
534357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov        private static final int MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE = 50;
534479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov
534557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov        public void prefetchAccessibilityNodeInfos(View view, int virtualViewId, int prefetchFlags,
534657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                List<AccessibilityNodeInfo> outInfos) {
534757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider();
534857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            if (provider == null) {
534957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                AccessibilityNodeInfo root = view.createAccessibilityNodeInfo();
535057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                if (root != null) {
535157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    outInfos.add(root);
535257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
535357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        prefetchPredecessorsOfRealNode(view, outInfos);
535457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
535557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
535657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        prefetchSiblingsOfRealNode(view, outInfos);
535757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
535857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
535957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        prefetchDescendantsOfRealNode(view, outInfos);
536057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
536157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                }
536257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            } else {
536357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                AccessibilityNodeInfo root = provider.createAccessibilityNodeInfo(virtualViewId);
536457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                if (root != null) {
536557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    outInfos.add(root);
536657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_PREDECESSORS) != 0) {
536757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        prefetchPredecessorsOfVirtualNode(root, view, provider, outInfos);
536857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
536957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_SIBLINGS) != 0) {
537057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        prefetchSiblingsOfVirtualNode(root, view, provider, outInfos);
537157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
537257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    if ((prefetchFlags & AccessibilityNodeInfo.FLAG_PREFETCH_DESCENDANTS) != 0) {
537357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        prefetchDescendantsOfVirtualNode(root, provider, outInfos);
537457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
537557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                }
537679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            }
537779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        }
537879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov
537957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov        private void prefetchPredecessorsOfRealNode(View view,
538057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                List<AccessibilityNodeInfo> outInfos) {
538157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            ViewParent parent = view.getParent();
538257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            while (parent instanceof View
538357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    && outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
538457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                View parentView = (View) parent;
538557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                final long parentNodeId = AccessibilityNodeInfo.makeNodeId(
538657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        parentView.getAccessibilityViewId(), AccessibilityNodeInfo.UNDEFINED);
538757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                AccessibilityNodeInfo info = parentView.createAccessibilityNodeInfo();
538857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                if (info != null) {
538957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    outInfos.add(info);
539057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                }
539157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                parent = parent.getParent();
539279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            }
539379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        }
539479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov
539557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov        private void prefetchSiblingsOfRealNode(View current,
539679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                List<AccessibilityNodeInfo> outInfos) {
539757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            ViewParent parent = current.getParent();
539857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            if (parent instanceof ViewGroup) {
539957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                ViewGroup parentGroup = (ViewGroup) parent;
540057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                final int childCount = parentGroup.getChildCount();
540157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                for (int i = 0; i < childCount; i++) {
540257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    View child = parentGroup.getChildAt(i);
540357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    if (outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE
540457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            && child.getAccessibilityViewId() != current.getAccessibilityViewId()
540557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            && child.getVisibility() == View.VISIBLE) {
540657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        final long childNodeId = AccessibilityNodeInfo.makeNodeId(
540757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                child.getAccessibilityViewId(), AccessibilityNodeInfo.UNDEFINED);
540857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        AccessibilityNodeInfo info = null;
540957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        AccessibilityNodeProvider provider = child.getAccessibilityNodeProvider();
541057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        if (provider == null) {
541157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            info = child.createAccessibilityNodeInfo();
541257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        } else {
541357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            info = provider.createAccessibilityNodeInfo(
541457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                    AccessibilityNodeInfo.UNDEFINED);
541557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        }
541657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        if (info != null) {
541757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            outInfos.add(info);
541857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        }
541957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
542057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                }
542157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            }
542279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        }
542379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov
542457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov        private void prefetchDescendantsOfRealNode(View root,
542557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                List<AccessibilityNodeInfo> outInfos) {
542657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            if (root instanceof ViewGroup) {
542757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                ViewGroup rootGroup = (ViewGroup) root;
542857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                HashMap<View, AccessibilityNodeInfo> addedChildren =
542957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    new HashMap<View, AccessibilityNodeInfo>();
543057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                final int childCount = rootGroup.getChildCount();
543157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                for (int i = 0; i < childCount; i++) {
543257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    View child = rootGroup.getChildAt(i);
543357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    if (child.getVisibility() == View.VISIBLE
543457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            && outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
543557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        final long childNodeId = AccessibilityNodeInfo.makeNodeId(
543657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                child.getAccessibilityViewId(), AccessibilityNodeInfo.UNDEFINED);
543757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        AccessibilityNodeProvider provider = child.getAccessibilityNodeProvider();
543857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        if (provider == null) {
543957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            AccessibilityNodeInfo info = child.createAccessibilityNodeInfo();
544057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            if (info != null) {
544157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                outInfos.add(info);
544257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                addedChildren.put(child, null);
544357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            }
544457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        } else {
544557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            AccessibilityNodeInfo info = provider.createAccessibilityNodeInfo(
544657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                   AccessibilityNodeInfo.UNDEFINED);
544757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            if (info != null) {
544857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                outInfos.add(info);
544957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                addedChildren.put(child, info);
545057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            }
545157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        }
545257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
545357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                }
545457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                if (outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
545557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    for (Map.Entry<View, AccessibilityNodeInfo> entry : addedChildren.entrySet()) {
545657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        View addedChild = entry.getKey();
545757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        AccessibilityNodeInfo virtualRoot = entry.getValue();
545857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        if (virtualRoot == null) {
545957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            prefetchDescendantsOfRealNode(addedChild, outInfos);
546057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        } else {
546157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            AccessibilityNodeProvider provider =
546257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                addedChild.getAccessibilityNodeProvider();
546357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            prefetchDescendantsOfVirtualNode(virtualRoot, provider, outInfos);
546457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        }
546557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
546657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                }
546779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            }
546879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        }
546979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov
547057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov        private void prefetchPredecessorsOfVirtualNode(AccessibilityNodeInfo root,
547157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                View providerHost, AccessibilityNodeProvider provider,
547279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                List<AccessibilityNodeInfo> outInfos) {
547357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            long parentNodeId = root.getParentNodeId();
547457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            int accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId(parentNodeId);
547557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            while (accessibilityViewId != AccessibilityNodeInfo.UNDEFINED) {
547657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                final int virtualDescendantId =
547757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    AccessibilityNodeInfo.getVirtualDescendantId(parentNodeId);
547857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                if (virtualDescendantId != AccessibilityNodeInfo.UNDEFINED
547957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        || accessibilityViewId == providerHost.getAccessibilityViewId()) {
548057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    AccessibilityNodeInfo parent = provider.createAccessibilityNodeInfo(
548157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            virtualDescendantId);
548257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    if (parent != null) {
548357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        outInfos.add(parent);
548457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
548557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    parentNodeId = parent.getParentNodeId();
548657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    accessibilityViewId = AccessibilityNodeInfo.getAccessibilityViewId(
548757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            parentNodeId);
548857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                } else {
548957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    prefetchPredecessorsOfRealNode(providerHost, outInfos);
549057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    return;
549157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                }
549279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            }
549379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        }
549479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov
549557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov        private void prefetchSiblingsOfVirtualNode(AccessibilityNodeInfo current, View providerHost,
549657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                AccessibilityNodeProvider provider, List<AccessibilityNodeInfo> outInfos) {
549757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            final long parentNodeId = current.getParentNodeId();
549857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            final int parentAccessibilityViewId =
549957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                AccessibilityNodeInfo.getAccessibilityViewId(parentNodeId);
550057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            final int parentVirtualDescendantId =
550157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                AccessibilityNodeInfo.getVirtualDescendantId(parentNodeId);
550257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            if (parentVirtualDescendantId != AccessibilityNodeInfo.UNDEFINED
550357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    || parentAccessibilityViewId == providerHost.getAccessibilityViewId()) {
550457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                AccessibilityNodeInfo parent =
550557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    provider.createAccessibilityNodeInfo(parentVirtualDescendantId);
550657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                if (parent != null) {
550757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    SparseLongArray childNodeIds = parent.getChildNodeIds();
550857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    final int childCount = childNodeIds.size();
550957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    for (int i = 0; i < childCount; i++) {
551057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        final long childNodeId = childNodeIds.get(i);
551157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        if (childNodeId != current.getSourceNodeId()
551257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                && outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
551357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            final int childVirtualDescendantId =
551457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                AccessibilityNodeInfo.getVirtualDescendantId(childNodeId);
551557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            AccessibilityNodeInfo child = provider.createAccessibilityNodeInfo(
551657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                    childVirtualDescendantId);
551757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            if (child != null) {
551857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                                outInfos.add(child);
551957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            }
552057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        }
552157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
552257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                }
552357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            } else {
552457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                prefetchSiblingsOfRealNode(providerHost, outInfos);
552557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            }
552657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov        }
552757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov
552857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov        private void prefetchDescendantsOfVirtualNode(AccessibilityNodeInfo root,
552957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                AccessibilityNodeProvider provider, List<AccessibilityNodeInfo> outInfos) {
553057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            SparseLongArray childNodeIds = root.getChildNodeIds();
553157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            final int initialOutInfosSize = outInfos.size();
553257c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            final int childCount = childNodeIds.size();
553357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            for (int i = 0; i < childCount; i++) {
553457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                if (outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
553557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    final long childNodeId = childNodeIds.get(i);
553657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    AccessibilityNodeInfo child = provider.createAccessibilityNodeInfo(
553757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                            AccessibilityNodeInfo.getVirtualDescendantId(childNodeId));
553857c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    if (child != null) {
553957c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                        outInfos.add(child);
554057c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    }
554157c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                }
554279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            }
554357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov            if (outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) {
554457c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                final int addedChildCount = outInfos.size() - initialOutInfosSize;
554557c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                for (int i = 0; i < addedChildCount; i++) {
554657c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    AccessibilityNodeInfo child = outInfos.get(initialOutInfosSize + i);
554757c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                    prefetchDescendantsOfVirtualNode(child, provider, outInfos);
554879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                }
554979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            }
555079311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        }
555179311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov    }
55529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5553