ViewRootImpl.java revision dddcd22b7ea56b1d3e31f2bbc35c80cb047de879
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;
404213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganovimport android.graphics.drawable.Drawable;
416b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.media.AudioManager;
426b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Binder;
436b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Bundle;
446b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Debug;
456b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Handler;
466b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.LatencyTimer;
476b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Looper;
486b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.Message;
496b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.ParcelFileDescriptor;
507e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guyimport android.os.PowerManager;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
526b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.RemoteException;
536b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.os.SystemClock;
5459a12cae208790dd202656f50a40a53ef49baeebRomain Guyimport android.os.SystemProperties;
55481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brownimport android.os.Trace;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AndroidRuntimeException;
579189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshimaimport android.util.DisplayMetrics;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
596b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport android.util.Log;
60949dbf7629eacfa02f267ade4643c98aef8e42a9Chet Haaseimport android.util.Slog;
61711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackbornimport android.util.TypedValue;
62a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brownimport android.view.View.AttachInfo;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.MeasureSpec;
6475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEvent;
6575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
668643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
678643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo;
68021078554b902179442a345a9d080a165c3b5139Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeProvider;
698643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.IAccessibilityInteractionConnection;
708643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.view.accessibility.IAccessibilityInteractionConnectionCallback;
710f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackbornimport android.view.animation.AccelerateDecelerateInterpolator;
720f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackbornimport android.view.animation.Interpolator;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputConnection;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.Scroller;
768643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
774213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganovimport com.android.internal.R;
7886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport com.android.internal.policy.PolicyManager;
796b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.BaseSurfaceHolder;
806b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.IInputMethodCallback;
816b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.IInputMethodSession;
826b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport com.android.internal.view.RootViewSurfaceTaker;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
866b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyimport java.lang.ref.WeakReference;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
884213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganovimport java.util.HashSet;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The top of a view hierarchy, implementing the needed protocol between View
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the WindowManager.  This is for the most part an internal implementation
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * detail of {@link WindowManagerImpl}.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
97812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy@SuppressWarnings({"EmptyCatchBlock", "PointlessBooleanExpression"})
98a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brownpublic final class ViewRootImpl implements ViewParent,
994a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks {
10070a3f677bf015d8641f41d149b76d362bb2b801cDianne Hackborn    private static final String TAG = "ViewRootImpl";
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DBG = false;
102812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy    private static final boolean LOCAL_LOGV = false;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @noinspection PointlessBooleanExpression*/
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_DRAW = false || LOCAL_LOGV;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_LAYOUT = false || LOCAL_LOGV;
106711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn    private static final boolean DEBUG_DIALOG = false || LOCAL_LOGV;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_INPUT_RESIZE = false || LOCAL_LOGV;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_ORIENTATION = false || LOCAL_LOGV;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_TRACKBALL = false || LOCAL_LOGV;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG_IMF = false || LOCAL_LOGV;
111694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    private static final boolean DEBUG_CONFIGURATION = false || LOCAL_LOGV;
1122f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private static final boolean DEBUG_FPS = false;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11451e4d4db296c252641161b39e98f49acebc46062Romain Guy    private static final boolean USE_RENDER_THREAD = false;
11551e4d4db296c252641161b39e98f49acebc46062Romain Guy
11659a12cae208790dd202656f50a40a53ef49baeebRomain Guy    /**
11759a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * Set this system property to true to force the view hierarchy to render
11859a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * at 60 Hz. This can be used to measure the potential framerate.
11959a12cae208790dd202656f50a40a53ef49baeebRomain Guy     */
12059a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private static final String PROPERTY_PROFILE_RENDERING = "viewancestor.profile_rendering";
12159a12cae208790dd202656f50a40a53ef49baeebRomain Guy
12253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    private static final boolean MEASURE_LATENCY = false;
12353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    private static LatencyTimer lt;
12453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Maximum time we allow the user to roll the trackball enough to generate
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a key event, before resetting the counters.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int MAX_TRACKBALL_DELAY = 250;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static IWindowSession sWindowSession;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final Object mStaticInit = new Object();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean mInitialized = false;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final ThreadLocal<RunQueue> sRunQueues = new ThreadLocal<RunQueue>();
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1382a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    static final ArrayList<Runnable> sFirstDrawHandlers = new ArrayList<Runnable>();
1392a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    static boolean sFirstDrawComplete = false;
1402a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn
141e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    static final ArrayList<ComponentCallbacks> sConfigCallbacks
142e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            = new ArrayList<ComponentCallbacks>();
14359a12cae208790dd202656f50a40a53ef49baeebRomain Guy
144211370fd943cf26905001b38b8b1791851b26adcRomain Guy    private static boolean sUseRenderThread = false;
145211370fd943cf26905001b38b8b1791851b26adcRomain Guy    private static boolean sRenderThreadQueried = false;
146211370fd943cf26905001b38b8b1791851b26adcRomain Guy    private static final Object[] sRenderThreadQueryLock = new Object[0];
147211370fd943cf26905001b38b8b1791851b26adcRomain Guy
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastTrackballTime = 0;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final TrackballAxis mTrackballAxisX = new TrackballAxis();
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final TrackballAxis mTrackballAxisY = new TrackballAxis();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
152cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickXDirection;
153cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickYDirection;
154cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickXKeyCode;
155cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    int mLastJoystickYKeyCode;
156cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final int[] mTmpLocation = new int[2];
1588506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
159711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn    final TypedValue mTmpValue = new TypedValue();
160711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final InputMethodCallback mInputMethodCallback;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Thread mThread;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowLeaked mLocation;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowManager.LayoutParams mWindowAttributes = new WindowManager.LayoutParams();
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final W mWindow;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
170180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn    final int mTargetSdkVersion;
171180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn
1729a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    int mSeq;
1739a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mView;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mFocusedView;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mRealFocusedView;  // this is not set to null in touch mode
177b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov    View mOldFocusedView;
1784213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
1794213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    View mAccessibilityFocusedHost;
1804213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    AccessibilityNodeInfo mAccessibilityFocusedVirtualView;
1814213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mViewVisibility;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAppVisible = true;
184180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn    int mOrigWindowType = -1;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
186ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    // Set to true if the owner of this window is in the stopped state,
187ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    // so the window should no longer be active.
188ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    boolean mStopped = false;
189ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1905fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    boolean mLastInCompatMode = false;
1915fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
192d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    SurfaceHolder.Callback2 mSurfaceHolderCallback;
193dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    BaseSurfaceHolder mSurfaceHolder;
194dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    boolean mIsCreating;
195dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    boolean mDrawingAllowed;
196dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Region mTransparentRegion;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Region mPreviousTransparentRegion;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mWidth;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mHeight;
2027d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    Rect mDirty;
2037d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    final Rect mCurrentDirty = new Rect();
2047d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    final Rect mPreviousDirty = new Rect();
205bb93d5598daa3312318c29401815bddf1df8c4deRomain Guy    boolean mIsAnimating;
2068506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
20764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    CompatibilityInfo.Translator mTranslator;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final View.AttachInfo mAttachInfo;
21046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    InputChannel mInputChannel;
2111e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn    InputQueue.Callback mInputQueueCallback;
2121e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn    InputQueue mInputQueue;
21386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato    FallbackEventHandler mFallbackEventHandler;
21496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    Choreographer mChoreographer;
215a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mTempRect; // used in the transaction to not thrash the heap.
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mVisRect; // used to retrieve visible rect of focused view.
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mTraversalScheduled;
220e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown    int mTraversalBarrier;
2214e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    long mLastTraversalFinishedTimeNanos;
22296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    long mLastDrawFinishedTimeNanos;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWillDrawSoon;
2243a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    boolean mFitSystemWindowsRequested;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLayoutRequested;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFirst;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mReportNextDraw;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFullRedrawNeeded;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mNewSurfaceNeeded;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mHasHadWindowFocus;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mLastWasImTarget;
23212d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn    boolean mWindowsAnimating;
2331f59e5c19bf72f88eed6f8de08b0a879d999f61cRomain Guy    boolean mIsDrawing;
2343a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    int mLastSystemUiVisibility;
2354952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
2364952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    // Pool of queued input events.
2374952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private static final int MAX_QUEUED_INPUT_EVENT_POOL_SIZE = 10;
2384952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private QueuedInputEvent mQueuedInputEventPool;
2394952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private int mQueuedInputEventPoolSize;
2404952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
2414952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    // Input event queue.
2424952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    QueuedInputEvent mFirstPendingInputEvent;
2434952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    QueuedInputEvent mCurrentInputEvent;
24496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    boolean mProcessInputEventsScheduled;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mWindowAttributesChanged = false;
247f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy    int mWindowAttributesChangesFlag = 0;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These can be accessed by any thread, must be protected with a lock.
2505583dc630f861dd9a3006390db227f9296007e00Mathias Agopian    // Surface can never be reassigned or cleared (use Surface.clear()).
2515583dc630f861dd9a3006390db227f9296007e00Mathias Agopian    private final Surface mSurface = new Surface();
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAdded;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAddedTouchMode;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2565fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    CompatibilityInfoHolder mCompatibilityInfo;
2575fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ int mAddNesting;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are accessed by multiple threads.
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mWinFrame; // frame given by window manager.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mPendingVisibleInsets = new Rect();
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Rect mPendingContentInsets = new Rect();
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ViewTreeObserver.InternalInsetsInfo mLastGivenInsets
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new ViewTreeObserver.InternalInsetsInfo();
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2683a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    final Rect mFitSystemWindowsInsets = new Rect();
2693a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
270694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    final Configuration mLastConfiguration = new Configuration();
271694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    final Configuration mPendingConfiguration = new Configuration();
27259a12cae208790dd202656f50a40a53ef49baeebRomain Guy
273e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    class ResizedInfo {
2743556c9a8068497d0de8964fd3be719c68eae1f00Dianne Hackborn        Rect contentInsets;
275e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Rect visibleInsets;
276e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        Configuration newConfig;
277e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
278e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScrollMayChange;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mSoftInputMode;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mLastScrolledFocus;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mScrollY;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mCurScrollY;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Scroller mScroller;
2857d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    HardwareLayer mResizeBuffer;
2867d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    long mResizeBufferStartTime;
2877d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    int mResizeBufferDuration;
2880f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    static final Interpolator mResizeInterpolator = new AccelerateDecelerateInterpolator();
289cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    private ArrayList<LayoutTransition> mPendingTransitions;
2908506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2918506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy    final ViewConfiguration mViewConfiguration;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
293a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /* Drag/drop */
294a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    ClipDescription mDragDescription;
295a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    View mCurrentDragView;
2967fb8b565f9cd2ec6a63ff4d8a89f98f68a1a138cChristopher Tate    volatile Object mLocalDragState;
297a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    final PointF mDragPoint = new PointF();
2982c095f367779ef32130c72849936a2e3013c8492Christopher Tate    final PointF mLastTouchPoint = new PointF();
29959a12cae208790dd202656f50a40a53ef49baeebRomain Guy
30059a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private boolean mProfileRendering;
30159a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private Thread mRenderProfiler;
30259a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private volatile boolean mRenderProfilingEnabled;
303a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3042f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    // Variables to track frames per second, enabled via DEBUG_FPS flag
3052f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private long mFpsStartTime = -1;
3062f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private long mFpsPrevTime = -1;
3072f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private int mFpsNumFrames;
3082f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
30951e4d4db296c252641161b39e98f49acebc46062Romain Guy    private final ArrayList<DisplayList> mDisplayLists = new ArrayList<DisplayList>(24);
31051e4d4db296c252641161b39e98f49acebc46062Romain Guy
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * see {@link #playSoundEffect(int)}
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AudioManager mAudioManager;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3168643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final AccessibilityManager mAccessibilityManager;
3178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
3185ac84423a28fea4924eb1c389d647defe1c1b93cGilles Debunne    AccessibilityInteractionController mAccessibilityInteractionController;
3198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
3208643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    AccessibilityInteractionConnectionManager mAccessibilityInteractionConnectionManager;
3218643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
322a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov    SendWindowContentChangedAccessibilityEvent mSendWindowContentChangedAccessibilityEvent;
323eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
3244213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    HashSet<View> mTempHashSet;
32579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov
32611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn    private final int mDensity;
327b08013c312e3d849029a2f4c11889274c00f438dAdam Powell
32821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /**
32921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * Consistency verifier for debugging purposes.
33021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     */
33121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    protected final InputEventConsistencyVerifier mInputEventConsistencyVerifier =
33221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            InputEventConsistencyVerifier.isInstrumentationEnabled() ?
33321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                    new InputEventConsistencyVerifier(this, 0) : null;
33421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
3354c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    public static IWindowSession getWindowSession(Looper mainLooper) {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStaticInit) {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mInitialized) {
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
3394c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn                    InputMethodManager imm = InputMethodManager.getInstance(mainLooper);
340c38fa1f63674971f9ac6ced1a449fb81026b62f7Chet Haase                    IWindowManager windowManager = Display.getWindowManager();
341c38fa1f63674971f9ac6ced1a449fb81026b62f7Chet Haase                    sWindowSession = windowManager.openSession(
34244bc17c6b517aef35a390c81b5aa79c4f284f744Dianne Hackborn                            imm.getClient(), imm.getInputContext());
343c38fa1f63674971f9ac6ced1a449fb81026b62f7Chet Haase                    float animatorScale = windowManager.getAnimationScale(2);
344c38fa1f63674971f9ac6ced1a449fb81026b62f7Chet Haase                    ValueAnimator.setDurationScale(animatorScale);
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInitialized = true;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3494c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn            return sWindowSession;
3504c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        }
3514c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn    }
3529a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn
3539a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    static final class SystemUiVisibilityInfo {
3549a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int seq;
3559a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int globalVisibility;
3569a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int localValue;
3579a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        int localChanges;
3589a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    }
3594c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
3606dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn    public ViewRootImpl(Context context) {
3614c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        super();
3624c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn
363812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy        if (MEASURE_LATENCY) {
364812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy            if (lt == null) {
365812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                lt = new LatencyTimer(100, 1000);
366812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy            }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3694c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // Initialize the statics when this class is first instantiated. This is
3704c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // done here instead of in the static block because Zygote does not
3714c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        // allow the spawning of threads.
3724c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3Dianne Hackborn        getWindowSession(context.getMainLooper());
3738643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThread = Thread.currentThread();
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocation = new WindowLeaked(null);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLocation.fillInStackTrace();
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWidth = -1;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeight = -1;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDirty = new Rect();
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTempRect = new Rect();
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVisRect = new Rect();
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWinFrame = new Rect();
383fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy        mWindow = new W(this);
384180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn        mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInputMethodCallback = new InputMethodCallback(this);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewVisibility = View.GONE;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTransparentRegion = new Region();
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPreviousTransparentRegion = new Region();
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = true; // true for the first time the view is added
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAdded = false;
3918643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager = AccessibilityManager.getInstance(context);
3928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityInteractionConnectionManager =
3938643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            new AccessibilityInteractionConnectionManager();
39400d0c14a0fe8e6dff8dd3e230ee4b61dd275f860Svetoslav Ganov        mAccessibilityManager.addAccessibilityStateChangeListener(
39500d0c14a0fe8e6dff8dd3e230ee4b61dd275f860Svetoslav Ganov                mAccessibilityInteractionConnectionManager);
396a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mAttachInfo = new View.AttachInfo(sWindowSession, mWindow, this, mHandler, this);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewConfiguration = ViewConfiguration.get(context);
39811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        mDensity = context.getResources().getDisplayMetrics().densityDpi;
39986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato        mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context);
40059a12cae208790dd202656f50a40a53ef49baeebRomain Guy        mProfileRendering = Boolean.parseBoolean(
40159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                SystemProperties.get(PROPERTY_PROFILE_RENDERING, "false"));
40296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        mChoreographer = Choreographer.getInstance();
4037e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy
4047e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
4057e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        mAttachInfo.mScreenOn = powerManager.isScreenOn();
406a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        loadSystemProperties();
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409211370fd943cf26905001b38b8b1791851b26adcRomain Guy    /**
410211370fd943cf26905001b38b8b1791851b26adcRomain Guy     * @return True if the application requests the use of a separate render thread,
411211370fd943cf26905001b38b8b1791851b26adcRomain Guy     *         false otherwise
412211370fd943cf26905001b38b8b1791851b26adcRomain Guy     */
413211370fd943cf26905001b38b8b1791851b26adcRomain Guy    private static boolean isRenderThreadRequested(Context context) {
41451e4d4db296c252641161b39e98f49acebc46062Romain Guy        if (USE_RENDER_THREAD) {
41551e4d4db296c252641161b39e98f49acebc46062Romain Guy            synchronized (sRenderThreadQueryLock) {
41651e4d4db296c252641161b39e98f49acebc46062Romain Guy                if (!sRenderThreadQueried) {
41751e4d4db296c252641161b39e98f49acebc46062Romain Guy                    final PackageManager packageManager = context.getPackageManager();
41851e4d4db296c252641161b39e98f49acebc46062Romain Guy                    final String packageName = context.getApplicationInfo().packageName;
41951e4d4db296c252641161b39e98f49acebc46062Romain Guy                    try {
42051e4d4db296c252641161b39e98f49acebc46062Romain Guy                        ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName,
42151e4d4db296c252641161b39e98f49acebc46062Romain Guy                                PackageManager.GET_META_DATA);
42251e4d4db296c252641161b39e98f49acebc46062Romain Guy                        if (applicationInfo.metaData != null) {
42351e4d4db296c252641161b39e98f49acebc46062Romain Guy                            sUseRenderThread = applicationInfo.metaData.getBoolean(
42451e4d4db296c252641161b39e98f49acebc46062Romain Guy                                    "android.graphics.renderThread", false);
42551e4d4db296c252641161b39e98f49acebc46062Romain Guy                        }
42651e4d4db296c252641161b39e98f49acebc46062Romain Guy                    } catch (PackageManager.NameNotFoundException e) {
42751e4d4db296c252641161b39e98f49acebc46062Romain Guy                    } finally {
42851e4d4db296c252641161b39e98f49acebc46062Romain Guy                        sRenderThreadQueried = true;
429211370fd943cf26905001b38b8b1791851b26adcRomain Guy                    }
430211370fd943cf26905001b38b8b1791851b26adcRomain Guy                }
43151e4d4db296c252641161b39e98f49acebc46062Romain Guy                return sUseRenderThread;
432211370fd943cf26905001b38b8b1791851b26adcRomain Guy            }
43351e4d4db296c252641161b39e98f49acebc46062Romain Guy        } else {
43451e4d4db296c252641161b39e98f49acebc46062Romain Guy            return false;
435211370fd943cf26905001b38b8b1791851b26adcRomain Guy        }
436211370fd943cf26905001b38b8b1791851b26adcRomain Guy    }
437211370fd943cf26905001b38b8b1791851b26adcRomain Guy
4382a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    public static void addFirstDrawHandler(Runnable callback) {
4392a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        synchronized (sFirstDrawHandlers) {
4402a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            if (!sFirstDrawComplete) {
4412a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                sFirstDrawHandlers.add(callback);
4422a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            }
4432a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        }
4442a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn    }
4452a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn
446e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    public static void addConfigCallback(ComponentCallbacks callback) {
447e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        synchronized (sConfigCallbacks) {
448e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            sConfigCallbacks.add(callback);
449e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        }
450e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
451e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // FIXME for perf testing only
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mProfile = false;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to profile the next traversal call.
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * FIXME for perf testing only. Remove eventually
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void profile() {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProfile = true;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether we are in touch mode. Calling this method triggers an IPC
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call and should be avoided whenever possible.
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True, if the device is in touch mode, false otherwise.
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static boolean isInTouchMode() {
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mInitialized) {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sWindowSession.getInTouchMode();
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We have one child
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
484e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView == null) {
4878169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                mView = view;
48886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                mFallbackEventHandler.setView(view);
4899189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                mWindowAttributes.copyFrom(attrs);
4901ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                attrs = mWindowAttributes;
491791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov
492791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                setAccessibilityFocusedHost(null);
493791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov
494dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (view instanceof RootViewSurfaceTaker) {
495dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolderCallback =
496dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            ((RootViewSurfaceTaker)view).willYouTakeTheSurface();
497dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (mSurfaceHolderCallback != null) {
498dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolder = new TakenSurfaceHolder();
499289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn                        mSurfaceHolder.setFormat(PixelFormat.UNKNOWN);
500dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
501dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
5021aec9a2212dd76e47ce0215006e5415b6430b54fRomain Guy
5035fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                CompatibilityInfo compatibilityInfo = mCompatibilityInfo.get();
504589cebe2d58591403de4a77077941c0454bc91bcMitsuru Oshima                mTranslator = compatibilityInfo.getTranslator();
50538ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
506856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy                // If the application owns the surface, don't enable hardware acceleration
507856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy                if (mSurfaceHolder == null) {
508211370fd943cf26905001b38b8b1791851b26adcRomain Guy                    enableHardwareAcceleration(mView.getContext(), attrs);
50938ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima                }
51038ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima
511e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima                boolean restore = false;
51235b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                if (mTranslator != null) {
513856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy                    mSurface.setCompatibilityTranslator(mTranslator);
514e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima                    restore = true;
51564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    attrs.backup();
51664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateWindowLayout(attrs);
5179189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                }
51864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (DEBUG_LAYOUT) Log.d(TAG, "WindowLayout in setView:" + attrs);
51964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
5201ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                if (!compatibilityInfo.supportsScreen()) {
5211ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                    attrs.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
5225fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    mLastInCompatMode = true;
5231ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima                }
5241ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSoftInputMode = attrs.softInputMode;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWindowAttributesChanged = true;
527f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy                mWindowAttributesChangesFlag = WindowManager.LayoutParams.EVERYTHING_CHANGED;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mRootView = view;
52935b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                mAttachInfo.mScalingRequired = mTranslator != null;
53064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                mAttachInfo.mApplicationScale =
53164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        mTranslator == null ? 1.0f : mTranslator.applicationScale;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (panelParentView != null) {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mPanelParentWindowToken
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            = panelParentView.getApplicationWindowToken();
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAdded = true;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int res; /* = WindowManagerImpl.ADD_OKAY; */
5388506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Schedule the first layout -before- adding to the window
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // manager, to make sure we do the relayout before receiving
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // any other events from the system.
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout();
543cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if ((mWindowAttributes.inputFeatures
544cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) {
545cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    mInputChannel = new InputChannel();
546cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                }
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
548180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                    mOrigWindowType = mWindowAttributes.type;
5493a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    mAttachInfo.mRecomputeGlobalAttributes = true;
5503a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    collectViewAttributes();
5519a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                    res = sWindowSession.add(mWindow, mSeq, mWindowAttributes,
55246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                            getHostVisibility(), mAttachInfo.mContentInsets,
55346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                            mInputChannel);
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAdded = false;
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView = null;
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mRootView = null;
55846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    mInputChannel = null;
55986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                    mFallbackEventHandler.setView(null);
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unscheduleTraversals();
561791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                    setAccessibilityFocusedHost(null);
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException("Adding window failed", e);
56364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                } finally {
56464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    if (restore) {
56564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        attrs.restore();
56664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
56846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
56964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (mTranslator != null) {
57064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateRectInScreenToAppWindow(mAttachInfo.mContentInsets);
5719189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingContentInsets.set(mAttachInfo.mContentInsets);
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingVisibleInsets.set(0, 0, 0, 0);
574711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                if (DEBUG_LAYOUT) Log.v(TAG, "Added window " + mWindow);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (res < WindowManagerImpl.ADD_OKAY) {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView = null;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mRootView = null;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAdded = false;
57986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato                    mFallbackEventHandler.setView(null);
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    unscheduleTraversals();
581791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                    setAccessibilityFocusedHost(null);
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (res) {
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_BAD_APP_TOKEN:
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN:
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- token " + attrs.token
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is not valid; is your activity running?");
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_NOT_APP_TOKEN:
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- token " + attrs.token
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is not for an application");
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_APP_EXITING:
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- app for token " + attrs.token
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " is exiting");
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_DUPLICATE_ADD:
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window -- window " + mWindow
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " has already been added");
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_STARTING_NOT_NEEDED:
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Silently ignore -- we would have just removed it
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // right away, anyway.
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return;
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_MULTIPLE_SINGLETON:
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window " + mWindow +
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                " -- another window of this type already exists");
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case WindowManagerImpl.ADD_PERMISSION_DENIED:
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new WindowManagerImpl.BadTokenException(
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Unable to add window " + mWindow +
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                " -- permission denied for this window type");
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException(
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Unable to add window -- unknown error code " + res);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
61646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
61700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (view instanceof RootViewSurfaceTaker) {
61800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    mInputQueueCallback =
61900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        ((RootViewSurfaceTaker)view).willYouTakeTheInputQueue();
62000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                }
621cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (mInputChannel != null) {
622cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    if (mInputQueueCallback != null) {
623cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        mInputQueue = new InputQueue(mInputChannel);
624cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                        mInputQueueCallback.onInputQueueCreated(mInputQueue);
625cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    } else {
62632cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                        mInputEventReceiver = new WindowInputEventReceiver(mInputChannel,
62732cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                                Looper.myLooper());
628cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    }
62946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                }
6308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                view.assignParent(this);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAddedTouchMode = (res&WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE) != 0;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAppVisible = (res&WindowManagerImpl.ADD_FLAG_APP_VISIBLE) != 0;
6348643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
6358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                if (mAccessibilityManager.isEnabled()) {
6368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    mAccessibilityInteractionConnectionManager.ensureConnection();
6378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }
6384213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
6394213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                if (view.getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
6404213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
6414213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                }
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6468ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    void destroyHardwareResources() {
64765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mAttachInfo.mHardwareRenderer != null) {
64865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer.isEnabled()) {
64965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                mAttachInfo.mHardwareRenderer.destroyLayers(mView);
65065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
65165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            mAttachInfo.mHardwareRenderer.destroy(false);
65265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
65365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
65465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
65531f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy    void terminateHardwareResources() {
65631f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy        if (mAttachInfo.mHardwareRenderer != null) {
65731f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy            mAttachInfo.mHardwareRenderer.destroyHardwareResources(mView);
65831f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy            mAttachInfo.mHardwareRenderer.destroy(false);
65931f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy        }
66031f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy    }
66131f2c2e94656530fbf6282803e62edb47e9a894dRomain Guy
66265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void destroyHardwareLayers() {
66365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mThread != Thread.currentThread()) {
66465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer != null &&
66565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    mAttachInfo.mHardwareRenderer.isEnabled()) {
666c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                HardwareRenderer.trimMemory(ComponentCallbacks2.TRIM_MEMORY_MODERATE);
66765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
66865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        } else {
66965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            if (mAttachInfo.mHardwareRenderer != null &&
67065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                    mAttachInfo.mHardwareRenderer.isEnabled()) {
67165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                mAttachInfo.mHardwareRenderer.destroyLayers(mView);
67265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
6736d7475d666baefaa3ba9f0dcee25238739454241Romain Guy        }
6746d7475d666baefaa3ba9f0dcee25238739454241Romain Guy    }
6756d7475d666baefaa3ba9f0dcee25238739454241Romain Guy
676ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    public void attachFunctor(int functor) {
677ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy        if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
678ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy            mAttachInfo.mHardwareRenderer.attachFunctor(mAttachInfo, functor);
679ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy        }
680ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    }
681ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy
682ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    public void detachFunctor(int functor) {
683ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy        if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
684ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy            mAttachInfo.mHardwareRenderer.detachFunctor(functor);
685ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy        }
686ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    }
687ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy
688211370fd943cf26905001b38b8b1791851b26adcRomain Guy    private void enableHardwareAcceleration(Context context, WindowManager.LayoutParams attrs) {
6897eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        mAttachInfo.mHardwareAccelerated = false;
6907eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        mAttachInfo.mHardwareAccelerationRequested = false;
6914f6aff386045000c2c03b903c7109cb42092b7eaRomain Guy
692856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy        // Don't enable hardware acceleration when the application is in compatibility mode
693856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy        if (mTranslator != null) return;
694856d4e1a872b5aed6792b33e0360554cb3d19eedRomain Guy
6957eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn        // Try to enable hardware acceleration if requested
6961b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller        final boolean hardwareAccelerated =
6971b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller                (attrs.flags & WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0;
6981b365921e88b14857d8e0826e221c371d25f6cb2Jim Miller
699566c33105a76c6a02333db8b775721990bc6cca4Romain Guy        if (hardwareAccelerated) {
7001af23a32d879db330eb5a08b21090ec60b604a32Romain Guy            if (!HardwareRenderer.isAvailable()) {
7011af23a32d879db330eb5a08b21090ec60b604a32Romain Guy                return;
7021af23a32d879db330eb5a08b21090ec60b604a32Romain Guy            }
7031af23a32d879db330eb5a08b21090ec60b604a32Romain Guy
7045d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // Persistent processes (including the system) should not do
7055d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // accelerated rendering on low-end devices.  In that case,
7065d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // sRendererDisabled will be set.  In addition, the system process
7075d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // itself should never do accelerated rendering.  In that case, both
7085d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // sRendererDisabled and sSystemRendererDisabled are set.  When
7095d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // sSystemRendererDisabled is set, PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED
7105d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // can be used by code on the system process to escape that and enable
7115d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            // HW accelerated drawing.  (This is basically for the lock screen.)
7125d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn
7135d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            final boolean fakeHwAccelerated = (attrs.privateFlags &
7145d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                    WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED) != 0;
7155d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            final boolean forceHwAccelerated = (attrs.privateFlags &
7165d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                    WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED) != 0;
7175d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn
7185d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            if (!HardwareRenderer.sRendererDisabled || (HardwareRenderer.sSystemRendererDisabled
7195d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                    && forceHwAccelerated)) {
720ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                // Don't enable hardware acceleration when we're not on the main thread
721211370fd943cf26905001b38b8b1791851b26adcRomain Guy                if (!HardwareRenderer.sSystemRendererDisabled &&
722211370fd943cf26905001b38b8b1791851b26adcRomain Guy                        Looper.getMainLooper() != Looper.myLooper()) {
723211370fd943cf26905001b38b8b1791851b26adcRomain Guy                    Log.w(HardwareRenderer.LOG_TAG, "Attempting to initialize hardware "
724ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                            + "acceleration outside of the main thread, aborting");
725ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                    return;
726ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy                }
727ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy
72851e4d4db296c252641161b39e98f49acebc46062Romain Guy                final boolean renderThread = isRenderThreadRequested(context);
729211370fd943cf26905001b38b8b1791851b26adcRomain Guy                if (renderThread) {
730211370fd943cf26905001b38b8b1791851b26adcRomain Guy                    Log.i(HardwareRenderer.LOG_TAG, "Render threat initiated");
731211370fd943cf26905001b38b8b1791851b26adcRomain Guy                }
732211370fd943cf26905001b38b8b1791851b26adcRomain Guy
733b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                if (mAttachInfo.mHardwareRenderer != null) {
734b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                    mAttachInfo.mHardwareRenderer.destroy(true);
735211370fd943cf26905001b38b8b1791851b26adcRomain Guy                }
736211370fd943cf26905001b38b8b1791851b26adcRomain Guy
737211370fd943cf26905001b38b8b1791851b26adcRomain Guy                final boolean translucent = attrs.format != PixelFormat.OPAQUE;
738b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                mAttachInfo.mHardwareRenderer = HardwareRenderer.createGlRenderer(2, translucent);
7397eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                mAttachInfo.mHardwareAccelerated = mAttachInfo.mHardwareAccelerationRequested
7407eec10e6c99c30d5ee061fec08ac89ad4254ac32Dianne Hackborn                        = mAttachInfo.mHardwareRenderer != null;
741211370fd943cf26905001b38b8b1791851b26adcRomain Guy
7425d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn            } else if (fakeHwAccelerated) {
7435d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // The window had wanted to use hardware acceleration, but this
7445d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // is not allowed in its process.  By setting this flag, it can
7455d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // still render as if it was accelerated.  This is basically for
7465d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // the preview windows the window manager shows for launching
7475d927c2d8e832fcfcb0154c8741f896001141ef4Dianne Hackborn                // applications, so they will look more like the app being launched.
74807213e6d8895af10951851435adf96a779863f6cDianne Hackborn                mAttachInfo.mHardwareAccelerationRequested = true;
749e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy            }
750e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy        }
751e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    }
752e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getView() {
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mView;
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final WindowLeaked getLocation() {
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLocation;
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setLayoutParams(WindowManager.LayoutParams attrs, boolean newView) {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            int oldSoftInputMode = mWindowAttributes.softInputMode;
7645a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            // preserve compatible window flag if exists.
7655a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            int compatibleWindowFlag =
7665a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima                mWindowAttributes.flags & WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
7673fe38c0e73e520c6c38454a41a4cffa16faaf67dCraig Mautner            // transfer over system UI visibility values as they carry current state.
7683fe38c0e73e520c6c38454a41a4cffa16faaf67dCraig Mautner            attrs.systemUiVisibility = mWindowAttributes.systemUiVisibility;
7693fe38c0e73e520c6c38454a41a4cffa16faaf67dCraig Mautner            attrs.subtreeSystemUiVisibility = mWindowAttributes.subtreeSystemUiVisibility;
770f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy            mWindowAttributesChangesFlag = mWindowAttributes.copyFrom(attrs);
7715a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima            mWindowAttributes.flags |= compatibleWindowFlag;
7725a2b91dc14e4c92e91c6abcc795f54ac98ee5866Mitsuru Oshima
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newView) {
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSoftInputMode = attrs.softInputMode;
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout();
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
777105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            // Don't lose the mode we last auto-computed.
778105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if ((attrs.softInputMode&WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
779105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED) {
780105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mWindowAttributes.softInputMode = (mWindowAttributes.softInputMode
781105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        & ~WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST)
782105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        | (oldSoftInputMode
783105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                                & WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST);
784105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = true;
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void handleAppVisibility(boolean visible) {
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAppVisible != visible) {
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAppVisible = visible;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void handleGetNewSurface() {
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNewSurfaceNeeded = true;
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullRedrawNeeded = true;
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scheduleTraversals();
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
803bb9908b828a8cfd5965553be66faa6af89973697Romain Guy    void handleScreenStateChange(boolean on) {
8047e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        if (on != mAttachInfo.mScreenOn) {
8057e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            mAttachInfo.mScreenOn = on;
806bb9908b828a8cfd5965553be66faa6af89973697Romain Guy            if (mView != null) {
807bb9908b828a8cfd5965553be66faa6af89973697Romain Guy                mView.dispatchScreenStateChanged(on ? View.SCREEN_STATE_ON : View.SCREEN_STATE_OFF);
808bb9908b828a8cfd5965553be66faa6af89973697Romain Guy            }
8097e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            if (on) {
8107e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy                mFullRedrawNeeded = true;
8117e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy                scheduleTraversals();
8127e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            }
8137e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        }
8147e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy    }
8157e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8193a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    public void requestFitSystemWindows() {
8203a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        checkThread();
8213a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        mFitSystemWindowsRequested = true;
8223a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        scheduleTraversals();
8233a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
8243a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
8253a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    /**
8263a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn     * {@inheritDoc}
8273a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn     */
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestLayout() {
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutRequested = true;
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scheduleTraversals();
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isLayoutRequested() {
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLayoutRequested;
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
841cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy    void invalidate() {
842cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        mDirty.set(0, 0, mWidth, mHeight);
843cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        scheduleTraversals();
844cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy    }
845cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
846a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    void invalidateWorld(View view) {
847a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        view.invalidate();
848a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        if (view instanceof ViewGroup) {
849a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            ViewGroup parent = (ViewGroup)view;
850a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            for (int i=0; i<parent.getChildCount(); i++) {
851a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                invalidateWorld(parent.getChildAt(i));
852a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            }
853a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        }
854a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    }
855a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void invalidateChild(View child, Rect dirty) {
857cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        invalidateChildInParent(null, dirty);
858cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy    }
859cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
860cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy    public ViewParent invalidateChildInParent(int[] location, Rect dirty) {
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
86264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (DEBUG_DRAW) Log.v(TAG, "Invalidate child: " + dirty);
863cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
86470d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase        if (dirty == null) {
86570d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase            invalidate();
866cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy            return null;
86770d4ba15b1f0c1133c5aabc86de828b41e482fffChet Haase        }
868cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
86964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mCurScrollY != 0 || mTranslator != null) {
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTempRect.set(dirty);
8711e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            dirty = mTempRect;
8728169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            if (mCurScrollY != 0) {
873cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy                dirty.offset(0, -mCurScrollY);
8748169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            }
87564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            if (mTranslator != null) {
8761e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy                mTranslator.translateRectInAppWindowToScreen(dirty);
8771e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            }
8781e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy            if (mAttachInfo.mScalingRequired) {
8791e09597512fd7e6c62ea00e4f0a93d305717ca79Romain Guy                dirty.inset(-1, -1);
8808169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            }
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
882cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
883cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        final Rect localDirty = mDirty;
884cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        if (!localDirty.isEmpty() && !localDirty.contains(dirty)) {
88502ccac69fd1c0a03c24c5f3ace0ad4bed337b1fdRomain Guy            mAttachInfo.mSetIgnoreDirtyState = true;
8867d695945801b8e6a051440731b500ff109e4b5abRomain Guy            mAttachInfo.mIgnoreDirtyState = true;
8877d695945801b8e6a051440731b500ff109e4b5abRomain Guy        }
888cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
889cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        // Add the new dirty rect to the current one
890cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        localDirty.union(dirty.left, dirty.top, dirty.right, dirty.bottom);
891cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        // Intersect with the bounds of the window to skip
892cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        // updates that lie outside of the visible region
8937b2f8b8fb7064a1d3b6d942b978c30c24c9d7299Romain Guy        final float appScale = mAttachInfo.mApplicationScale;
8947b2f8b8fb7064a1d3b6d942b978c30c24c9d7299Romain Guy        localDirty.intersect(0, 0,
8957b2f8b8fb7064a1d3b6d942b978c30c24c9d7299Romain Guy                (int) (mWidth * appScale + 0.5f), (int) (mHeight * appScale + 0.5f));
896cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mWillDrawSoon) {
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scheduleTraversals();
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
900cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy
901cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy        return null;
9020d9275e565551eed57297627188aa39f3897a50bRomain Guy    }
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
904ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    void setStopped(boolean stopped) {
905ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        if (mStopped != stopped) {
906ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            mStopped = stopped;
907ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (!stopped) {
908ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                scheduleTraversals();
909ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            }
910ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn        }
911ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn    }
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
913cfef12374c15b11b3c2a1041582be9728152e15dRomain Guy    public ViewParent getParent() {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima    public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) {
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (child != mView) {
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("child is not mine, honest!");
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Note: don't apply scroll offset, because we want to know its
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // visibility in the virtual canvas being given to the view hierarchy.
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return r.intersect(0, 0, mWidth, mHeight);
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void bringChildToFront(View child) {
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int getHostVisibility() {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAppVisible ? mView.getVisibility() : View.GONE;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9328506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
9337d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    void disposeResizeBuffer() {
9347d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
9357d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            mResizeBuffer.destroy();
9367d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            mResizeBuffer = null;
9370f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
9380f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
9390f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
940cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    /**
941cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * Add LayoutTransition to the list of transitions to be started in the next traversal.
942cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * This list will be cleared after the transitions on the list are start()'ed. These
943cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * transitionsa re added by LayoutTransition itself when it sets up animations. The setup
944cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * happens during the layout phase of traversal, which we want to complete before any of the
945cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * animations are started (because those animations may side-effect properties that layout
946cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * depends upon, like the bounding rectangles of the affected views). So we add the transition
947cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * to the list and it is started just prior to starting the drawing phase of traversal.
948cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     *
949cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * @param transition The LayoutTransition to be started on the next traversal.
950cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     *
951cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     * @hide
952cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase     */
953cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    public void requestTransitionStart(LayoutTransition transition) {
954cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase        if (mPendingTransitions == null || !mPendingTransitions.contains(transition)) {
955cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            if (mPendingTransitions == null) {
956cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase                 mPendingTransitions = new ArrayList<LayoutTransition>();
957cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            }
958cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase            mPendingTransitions.add(transition);
959cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase        }
960cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase    }
961cca2c9807206f320bd41bf8656a227e4f249e4baChet Haase
962ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    void scheduleTraversals() {
963ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        if (!mTraversalScheduled) {
964ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mTraversalScheduled = true;
965ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mTraversalBarrier = mHandler.getLooper().postSyncBarrier();
966ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mChoreographer.postCallback(
967ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                    Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
968330314c6fb7c178c0f0da65d6aa8c9e7d3004568Jeff Brown            scheduleConsumeBatchedInput();
96996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
970ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    }
97196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
972ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    void unscheduleTraversals() {
973ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        if (mTraversalScheduled) {
974ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mTraversalScheduled = false;
975ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mHandler.getLooper().removeSyncBarrier(mTraversalBarrier);
976ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mChoreographer.removeCallbacks(
977ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                    Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
97896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
979ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    }
98096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
981ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    void doTraversal() {
982ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        if (mTraversalScheduled) {
983ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mTraversalScheduled = false;
984ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mHandler.getLooper().removeSyncBarrier(mTraversalBarrier);
98596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
986ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            if (mProfile) {
987ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                Debug.startMethodTracing("ViewAncestor");
988ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            }
98996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
990ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            final long traversalStartTime;
991ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            if (ViewDebug.DEBUG_LATENCY) {
992ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                traversalStartTime = System.nanoTime();
993ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                if (mLastTraversalFinishedTimeNanos != 0) {
994ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                    Log.d(ViewDebug.DEBUG_LATENCY_TAG, "Starting performTraversals(); it has been "
995ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                            + ((traversalStartTime - mLastTraversalFinishedTimeNanos) * 0.000001f)
996ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                            + "ms since the last traversals finished.");
997ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                } else {
998ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                    Log.d(ViewDebug.DEBUG_LATENCY_TAG, "Starting performTraversals().");
999ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                }
1000ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            }
1001ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown
1002ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            Trace.traceBegin(Trace.TRACE_TAG_VIEW, "performTraversals");
1003ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            try {
1004ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                performTraversals();
1005ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            } finally {
1006ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                Trace.traceEnd(Trace.TRACE_TAG_VIEW);
1007ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            }
1008ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown
1009ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            if (ViewDebug.DEBUG_LATENCY) {
1010ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                long now = System.nanoTime();
1011ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                Log.d(ViewDebug.DEBUG_LATENCY_TAG, "performTraversals() took "
1012ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                        + ((now - traversalStartTime) * 0.000001f)
1013ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                        + "ms.");
1014ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                mLastTraversalFinishedTimeNanos = now;
1015ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            }
1016ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown
1017ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            if (mProfile) {
1018ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                Debug.stopMethodTracing();
1019ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                mProfile = false;
1020ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            }
102196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
102296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    }
102396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
10243a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    private boolean collectViewAttributes() {
10253a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        final View.AttachInfo attachInfo = mAttachInfo;
10263a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (attachInfo.mRecomputeGlobalAttributes) {
10273a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            //Log.i(TAG, "Computing view hierarchy attributes!");
10283a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            attachInfo.mRecomputeGlobalAttributes = false;
10293a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            boolean oldScreenOn = attachInfo.mKeepScreenOn;
10303a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            int oldVis = attachInfo.mSystemUiVisibility;
10313a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            boolean oldHasSystemUiListeners = attachInfo.mHasSystemUiListeners;
10323a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            attachInfo.mKeepScreenOn = false;
10333a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            attachInfo.mSystemUiVisibility = 0;
10343a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            attachInfo.mHasSystemUiListeners = false;
10353a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            mView.dispatchCollectViewAttributes(attachInfo, 0);
1036139e5aa1da51b27231ab36344cf2d0dafab23f1eDianne Hackborn            attachInfo.mSystemUiVisibility &= ~attachInfo.mDisabledSystemUiVisibility;
10373a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            if (attachInfo.mKeepScreenOn != oldScreenOn
10383a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    || attachInfo.mSystemUiVisibility != oldVis
10393a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    || attachInfo.mHasSystemUiListeners != oldHasSystemUiListeners) {
10403a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                WindowManager.LayoutParams params = mWindowAttributes;
10413a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                if (attachInfo.mKeepScreenOn) {
10423a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
10433a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                }
10443a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                params.subtreeSystemUiVisibility = attachInfo.mSystemUiVisibility;
10453a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                params.hasSystemUiListeners = attachInfo.mHasSystemUiListeners;
10463a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                mView.dispatchWindowSystemUiVisiblityChanged(attachInfo.mSystemUiVisibility);
10473a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                return true;
10483a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
10493a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
10503a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        return false;
10513a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
10523a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
10533a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    private boolean measureHierarchy(final View host, final WindowManager.LayoutParams lp,
10543a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            final Resources res, final int desiredWindowWidth, final int desiredWindowHeight) {
10553a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        int childWidthMeasureSpec;
10563a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        int childHeightMeasureSpec;
10573a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        boolean windowSizeMayChange = false;
10583a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
10593a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (DEBUG_ORIENTATION || DEBUG_LAYOUT) Log.v(TAG,
10603a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                "Measuring " + host + " in display " + desiredWindowWidth
10613a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                + "x" + desiredWindowHeight + "...");
10623a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
10633a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        boolean goodMeasure = false;
10643a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT) {
10653a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            // On large screens, we don't want to allow dialogs to just
10663a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            // stretch to fill the entire width of the screen to display
10673a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            // one line of text.  First try doing the layout at a smaller
10683a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            // size to see if it will fit.
10693a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            final DisplayMetrics packageMetrics = res.getDisplayMetrics();
10703a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            res.getValue(com.android.internal.R.dimen.config_prefDialogWidth, mTmpValue, true);
10713a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            int baseSize = 0;
10723a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            if (mTmpValue.type == TypedValue.TYPE_DIMENSION) {
10733a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                baseSize = (int)mTmpValue.getDimension(packageMetrics);
10743a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
10753a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": baseSize=" + baseSize);
10763a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            if (baseSize != 0 && desiredWindowWidth > baseSize) {
10773a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width);
10783a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height);
1079c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown                performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
10803a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured ("
10813a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                        + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")");
10823a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) {
10833a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    goodMeasure = true;
10843a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                } else {
10853a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    // Didn't fit in that size... try expanding a bit.
10863a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    baseSize = (baseSize+desiredWindowWidth)/2;
10873a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": next baseSize="
10883a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                            + baseSize);
10893a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width);
1090c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown                    performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
10913a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured ("
10923a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                            + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")");
10933a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) {
10943a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                        if (DEBUG_DIALOG) Log.v(TAG, "Good!");
10953a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                        goodMeasure = true;
10963a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    }
10973a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                }
10983a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
10993a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
11003a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
11013a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (!goodMeasure) {
11023a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width);
11033a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height);
1104c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown            performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
11053a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            if (mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight()) {
11063a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                windowSizeMayChange = true;
11073a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
11083a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
11093a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
11103a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (DBG) {
11113a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            System.out.println("======================================");
11123a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            System.out.println("performTraversals -- after measure");
11133a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            host.debug();
11143a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
11153a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
11163a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        return windowSizeMayChange;
11173a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn    }
11183a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void performTraversals() {
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // cache mView since it is used so much below...
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View host = mView;
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) {
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("======================================");
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("performTraversals");
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.debug();
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (host == null || !mAdded)
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWillDrawSoon = true;
1133711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn        boolean windowSizeMayChange = false;
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean newSurface = false;
1135dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        boolean surfaceChanged = false;
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManager.LayoutParams lp = mWindowAttributes;
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int desiredWindowWidth;
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int desiredWindowHeight;
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View.AttachInfo attachInfo = mAttachInfo;
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int viewVisibility = getHostVisibility();
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean viewVisibilityChanged = mViewVisibility != viewVisibility
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || mNewSurfaceNeeded;
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManager.LayoutParams params = null;
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWindowAttributesChanged) {
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = false;
1150dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            surfaceChanged = true;
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            params = lp;
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11535fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatibilityInfo compatibilityInfo = mCompatibilityInfo.get();
11545fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (compatibilityInfo.supportsScreen() == mLastInCompatMode) {
11555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            params = lp;
115696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mFullRedrawNeeded = true;
11575fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            mLayoutRequested = true;
11585fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            if (mLastInCompatMode) {
11595fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                params.flags &= ~WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
11605fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                mLastInCompatMode = false;
11615fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            } else {
11625fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                params.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
11635fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                mLastInCompatMode = true;
11645fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            }
11655fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
1166f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy
1167f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy        mWindowAttributesChangesFlag = 0;
1168f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy
116964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        Rect frame = mWinFrame;
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst) {
117196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mFullRedrawNeeded = true;
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLayoutRequested = true;
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1174a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            if (lp.type == WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL) {
1175a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                // NOTE -- system code, won't try to do compat mode.
1176a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                Display disp = WindowManagerImpl.getDefault().getDefaultDisplay();
1177bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                Point size = new Point();
1178bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                disp.getRealSize(size);
1179bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                desiredWindowWidth = size.x;
1180bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                desiredWindowHeight = size.y;
1181a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            } else {
1182a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                DisplayMetrics packageMetrics =
1183a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    mView.getContext().getResources().getDisplayMetrics();
1184a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                desiredWindowWidth = packageMetrics.widthPixels;
1185a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                desiredWindowHeight = packageMetrics.heightPixels;
1186a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn            }
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // For the very first time, tell the view hierarchy that it
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // is attached to the window.  Note that at this point the surface
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // object is not initialized to its backing store, but soon it
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // will be (assuming the window is visible).
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mSurface = mSurface;
1193c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // We used to use the following condition to choose 32 bits drawing caches:
1194c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // PixelFormat.hasAlpha(lp.format) || lp.format == PixelFormat.RGBX_8888
1195c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            // However, windows are now always 32 bits by default, so choose 32 bits
1196c5d55863ec0290370a17d37d06feab743626b12fRomain Guy            attachInfo.mUse32BitDrawingCache = true;
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mHasWindowFocus = false;
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowVisibility = viewVisibility;
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mRecomputeGlobalAttributes = false;
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            viewVisibilityChanged = false;
1201694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            mLastConfiguration.setTo(host.getResources().getConfiguration());
12023a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            mLastSystemUiVisibility = mAttachInfo.mSystemUiVisibility;
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.dispatchAttachedToWindow(attachInfo, 0);
12043a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            mFitSystemWindowsInsets.set(mAttachInfo.mContentInsets);
12053a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            host.fitSystemWindows(mFitSystemWindowsInsets);
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Screen on initialized: " + attachInfo.mKeepScreenOn);
120775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
120964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            desiredWindowWidth = frame.width();
121064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            desiredWindowHeight = frame.height();
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (desiredWindowWidth != mWidth || desiredWindowHeight != mHeight) {
1212c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                if (DEBUG_ORIENTATION) Log.v(TAG,
121364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                        "View " + host + " resized to: " + frame);
121496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mFullRedrawNeeded = true;
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLayoutRequested = true;
1216711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                windowSizeMayChange = true;
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (viewVisibilityChanged) {
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowVisibility = viewVisibility;
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            host.dispatchWindowVisibilityChanged(viewVisibility);
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility != View.VISIBLE || mNewSurfaceNeeded) {
122465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                destroyHardwareResources();
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.GONE) {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // After making a window gone, we will count it as being
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // shown for the first time the next time it gets focus.
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHasHadWindowFocus = false;
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1233b78c284bd535f48207750e5a406474ea22381eddChet Haase        // Execute enqueued actions on every traversal in case a detached view enqueued an action
1234b78c284bd535f48207750e5a406474ea22381eddChet Haase        getRunQueue().executeActions(attachInfo.mHandler);
1235b78c284bd535f48207750e5a406474ea22381eddChet Haase
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean insetsChanged = false;
12378506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
12383a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        boolean layoutRequested = mLayoutRequested && !mStopped;
12393a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (layoutRequested) {
124015df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy
1241711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn            final Resources res = mView.getContext().getResources();
1242711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mFirst) {
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // make sure touch mode code executes by setting cached value
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to opposite of the added touch mode.
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mInTouchMode = !mAddedTouchMode;
12472d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy                ensureTouchModeLocally(mAddedTouchMode);
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1249fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                if (!mPendingContentInsets.equals(mAttachInfo.mContentInsets)) {
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    insetsChanged = true;
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1252fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                if (!mPendingVisibleInsets.equals(mAttachInfo.mVisibleInsets)) {
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets);
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Visible insets changing to: "
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mVisibleInsets);
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) {
1259711e62a84fe6e127592fb14642e9d08cf25a5b75Dianne Hackborn                    windowSizeMayChange = true;
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1261a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    if (lp.type == WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL) {
1262a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        // NOTE -- system code, won't try to do compat mode.
1263a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        Display disp = WindowManagerImpl.getDefault().getDefaultDisplay();
1264bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        Point size = new Point();
1265bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        disp.getRealSize(size);
1266bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        desiredWindowWidth = size.x;
1267bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown                        desiredWindowHeight = size.y;
1268a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    } else {
1269a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        DisplayMetrics packageMetrics = res.getDisplayMetrics();
1270a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        desiredWindowWidth = packageMetrics.widthPixels;
1271a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                        desiredWindowHeight = packageMetrics.heightPixels;
1272a239c84525795ffc1828b545aa8069af88d26a71Dianne Hackborn                    }
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ask host how big it wants to be
12773a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            windowSizeMayChange |= measureHierarchy(host, lp, res,
12783a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    desiredWindowWidth, desiredWindowHeight);
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12813a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (collectViewAttributes()) {
12823a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            params = lp;
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12849a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        if (attachInfo.mForceReportNewAttributes) {
12859a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            attachInfo.mForceReportNewAttributes = false;
12869a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            params = lp;
12879a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        }
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst || attachInfo.mViewVisibilityChanged) {
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mViewVisibilityChanged = false;
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resizeMode = mSoftInputMode &
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST;
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we are in auto resize mode, then we need to determine
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // what mode to use now.
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (resizeMode == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED) {
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = attachInfo.mScrollContainers.size();
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (attachInfo.mScrollContainers.get(i).isShown()) {
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        resizeMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (resizeMode == 0) {
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resizeMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN;
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((lp.softInputMode &
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST) != resizeMode) {
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lp.softInputMode = (lp.softInputMode &
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ~WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST) |
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            resizeMode;
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    params = lp;
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13148506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (params != null && (host.mPrivateFlags & View.REQUEST_TRANSPARENT_REGIONS) != 0) {
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!PixelFormat.formatHasAlpha(params.format)) {
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                params.format = PixelFormat.TRANSLUCENT;
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13213a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (mFitSystemWindowsRequested) {
13223a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            mFitSystemWindowsRequested = false;
13233a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            mFitSystemWindowsInsets.set(mAttachInfo.mContentInsets);
13243a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            host.fitSystemWindows(mFitSystemWindowsInsets);
13253a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            if (mLayoutRequested) {
13263a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                // Short-circuit catching a new layout request here, so
13273a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                // we don't need to go through two layout passes when things
13283a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                // change due to fitting system windows, which can happen a lot.
13293a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                windowSizeMayChange |= measureHierarchy(host, lp,
13303a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                        mView.getContext().getResources(),
13313a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                        desiredWindowWidth, desiredWindowHeight);
13323a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            }
13333a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
13343a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
13353a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        if (layoutRequested) {
13363a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            // Clear this now, so that if anything requests a layout in the
13373a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            // rest of this function we will catch it and re-run a full
13383a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            // layout pass.
13393a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn            mLayoutRequested = false;
13403a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        }
13413a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn
13423a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        boolean windowShouldResize = layoutRequested && windowSizeMayChange
1343189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn            && ((mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight())
13442e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                || (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT &&
13452e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                        frame.width() < desiredWindowWidth && frame.width() != mWidth)
13462e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                || (lp.height == ViewGroup.LayoutParams.WRAP_CONTENT &&
13472e4f426bbc3bad62d2c30109a5370c2026b3df36Romain Guy                        frame.height() < desiredWindowHeight && frame.height() != mHeight));
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean computesInternalInsets =
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attachInfo.mTreeObserver.hasComputeInternalInsetsListeners();
1351812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean insetsPending = false;
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int relayoutResult = 0;
1354812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
1355812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy        if (mFirst || windowShouldResize || insetsChanged ||
1356812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                viewVisibilityChanged || params != null) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (viewVisibility == View.VISIBLE) {
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this window is giving internal insets to the window
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // manager, and it is being added or changing its visibility,
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // then we want to first give the window manager "fake"
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // insets to cause it to effectively ignore the content of
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the window during layout.  This avoids it briefly causing
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // other windows to resize/move based on the raw frame of the
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // window, waiting until we can finish laying out this window
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // and get back to the window manager with the ultimately
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // computed insets.
1368812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                insetsPending = computesInternalInsets && (mFirst || viewVisibilityChanged);
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1371dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            if (mSurfaceHolder != null) {
1372dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mSurfaceHolder.mSurfaceLock.lock();
1373dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mDrawingAllowed = true;
1374dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            }
1375812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
1376c361da845a205ac35e724c0ca436744d483de7aaRomain Guy            boolean hwInitialized = false;
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean contentInsetsChanged = false;
137813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            boolean visibleInsetsChanged;
1379dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            boolean hadSurface = mSurface.isValid();
1380812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
13828169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                if (DEBUG_LAYOUT) {
1383189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                    Log.i(TAG, "host=w:" + host.getMeasuredWidth() + ", h:" +
1384189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                            host.getMeasuredHeight() + ", params=" + params);
13858169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                }
13862a83f001fdb189f945e82e81e717ba204824b112Romain Guy
13872a83f001fdb189f945e82e81e717ba204824b112Romain Guy                final int surfaceGenerationId = mSurface.getGenerationId();
13888169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima                relayoutResult = relayoutWindow(params, viewVisibility, insetsPending);
13898169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_LAYOUT) Log.v(TAG, "relayout: frame=" + frame.toShortString()
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " content=" + mPendingContentInsets.toShortString()
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " visible=" + mPendingVisibleInsets.toShortString()
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " surface=" + mSurface);
13948506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1395694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                if (mPendingConfiguration.seq != 0) {
1396694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    if (DEBUG_CONFIGURATION) Log.v(TAG, "Visible with new config: "
1397694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                            + mPendingConfiguration);
1398694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    updateConfiguration(mPendingConfiguration, !mFirst);
1399694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                    mPendingConfiguration.seq = 0;
1400694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                }
14013556c9a8068497d0de8964fd3be719c68eae1f00Dianne Hackborn
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                contentInsetsChanged = !mPendingContentInsets.equals(
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAttachInfo.mContentInsets);
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                visibleInsetsChanged = !mPendingVisibleInsets.equals(
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAttachInfo.mVisibleInsets);
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (contentInsetsChanged) {
14073a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    if (mWidth > 0 && mHeight > 0 && lp != null &&
14083a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                            ((lp.systemUiVisibility|lp.subtreeSystemUiVisibility)
14093a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                                    & View.SYSTEM_UI_LAYOUT_FLAGS) == 0 &&
1410fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mSurface != null && mSurface.isValid() &&
1411fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            !mAttachInfo.mTurnOffWindowResizeAnim &&
1412fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mAttachInfo.mHardwareRenderer != null &&
1413fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mAttachInfo.mHardwareRenderer.isEnabled() &&
1414fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mAttachInfo.mHardwareRenderer.validate() &&
1415fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            lp != null && !PixelFormat.formatHasAlpha(lp.format)) {
1416fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
1417fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        disposeResizeBuffer();
1418fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
1419fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        boolean completed = false;
142008837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                        HardwareCanvas hwRendererCanvas = mAttachInfo.mHardwareRenderer.getCanvas();
142108837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                        HardwareCanvas layerCanvas = null;
1422fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        try {
1423fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (mResizeBuffer == null) {
1424fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                mResizeBuffer = mAttachInfo.mHardwareRenderer.createHardwareLayer(
1425fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                        mWidth, mHeight, false);
1426fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            } else if (mResizeBuffer.getWidth() != mWidth ||
1427fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    mResizeBuffer.getHeight() != mHeight) {
1428fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                mResizeBuffer.resize(mWidth, mHeight);
1429fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
143008837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas = mResizeBuffer.start(hwRendererCanvas);
143108837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.setViewport(mWidth, mHeight);
143208837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.onPreDraw(null);
143308837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            final int restoreCount = layerCanvas.save();
1434fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
143508837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.drawColor(0xff000000, PorterDuff.Mode.SRC);
1436fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
1437fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            int yoff;
1438fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            final boolean scrolling = mScroller != null
1439fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    && mScroller.computeScrollOffset();
1440fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (scrolling) {
1441fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                yoff = mScroller.getCurrY();
1442fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                mScroller.abortAnimation();
1443fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            } else {
1444fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                yoff = mScrollY;
1445fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1446fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
144708837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.translate(0, -yoff);
1448fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (mTranslator != null) {
144908837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                                mTranslator.translateCanvas(layerCanvas);
1450fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1451fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
145208837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            mView.draw(layerCanvas);
1453fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
14544213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            drawAccessibilityFocusedDrawableIfNeeded(layerCanvas);
14554213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
1456fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mResizeBufferStartTime = SystemClock.uptimeMillis();
1457fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            mResizeBufferDuration = mView.getResources().getInteger(
1458fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    com.android.internal.R.integer.config_mediumAnimTime);
1459fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            completed = true;
1460fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn
146108837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            layerCanvas.restoreToCount(restoreCount);
1462fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        } catch (OutOfMemoryError e) {
1463fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            Log.w(TAG, "Not enough memory for content change anim buffer", e);
1464fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        } finally {
146508837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                            if (layerCanvas != null) {
146608837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                                layerCanvas.onPostDraw();
1467fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1468fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            if (mResizeBuffer != null) {
146908837c246c9c27902c59b41c8661c2f27a4aa2bcChet Haase                                mResizeBuffer.end(hwRendererCanvas);
1470fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                if (!completed) {
1471fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    mResizeBuffer.destroy();
1472fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                    mResizeBuffer = null;
1473fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                                }
1474fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                            }
1475fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                        }
1476fa6b35be126ffcc3b5818393c26aff724ac65dafDianne Hackborn                    }
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mContentInsets.set(mPendingContentInsets);
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Content insets changing to: "
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mContentInsets);
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14813a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                if (contentInsetsChanged || mLastSystemUiVisibility !=
14823a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                        mAttachInfo.mSystemUiVisibility || mFitSystemWindowsRequested) {
14833a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    mLastSystemUiVisibility = mAttachInfo.mSystemUiVisibility;
14843a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    mFitSystemWindowsRequested = false;
14853a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    mFitSystemWindowsInsets.set(mAttachInfo.mContentInsets);
14863a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    host.fitSystemWindows(mFitSystemWindowsInsets);
14873a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                }
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (visibleInsetsChanged) {
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets);
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_LAYOUT) Log.v(TAG, "Visible insets changing to: "
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mAttachInfo.mVisibleInsets);
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!hadSurface) {
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mSurface.isValid()) {
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // If we are creating a new surface, then we need to
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // completely redraw it.  Also, when we get to the
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // point of drawing it we will hold off and schedule
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // a new traversal instead.  This is so we can tell the
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // window manager about all of the windows being displayed
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // before actually drawing them, so it can display then
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // all at once.
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newSurface = true;
150496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        mFullRedrawNeeded = true;
150561a6e689188cd8743905e4f7b10440c7e50823f3Jack Palevich                        mPreviousTransparentRegion.setEmpty();
15068506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
1507b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        if (mAttachInfo.mHardwareRenderer != null) {
1508648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            try {
1509648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                hwInitialized = mAttachInfo.mHardwareRenderer.initialize(mHolder);
1510648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            } catch (Surface.OutOfResourcesException e) {
1511648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Log.e(TAG, "OutOfResourcesException initializing HW surface", e);
1512648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                try {
1513648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    if (!sWindowSession.outOfMemory(mWindow)) {
1514648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                        Slog.w(TAG, "No processes killed for memory; killing self");
1515648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                        Process.killProcess(Process.myPid());
1516648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                    }
1517648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                } catch (RemoteException ex) {
1518648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                }
1519648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                mLayoutRequested = true;    // ask wm for a new surface next time.
1520648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                return;
1521648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (!mSurface.isValid()) {
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If the surface has been removed, then reset the scroll
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // positions.
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastScrolledFocus = null;
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mScrollY = mCurScrollY = 0;
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mScroller != null) {
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mScroller.abortAnimation();
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15327d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                    disposeResizeBuffer();
15331d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    // Our surface is gone
15341d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    if (mAttachInfo.mHardwareRenderer != null &&
15351d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                            mAttachInfo.mHardwareRenderer.isEnabled()) {
15361d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                        mAttachInfo.mHardwareRenderer.destroy(true);
15371d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy                    }
15382a83f001fdb189f945e82e81e717ba204824b112Romain Guy                } else if (surfaceGenerationId != mSurface.getGenerationId() &&
15392a83f001fdb189f945e82e81e717ba204824b112Romain Guy                        mSurfaceHolder == null && mAttachInfo.mHardwareRenderer != null) {
154096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    mFullRedrawNeeded = true;
1541648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    try {
1542648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        mAttachInfo.mHardwareRenderer.updateSurface(mHolder);
1543648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    } catch (Surface.OutOfResourcesException e) {
1544648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        Log.e(TAG, "OutOfResourcesException updating HW surface", e);
1545648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        try {
1546648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            if (!sWindowSession.outOfMemory(mWindow)) {
1547648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Slog.w(TAG, "No processes killed for memory; killing self");
1548648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                Process.killProcess(Process.myPid());
1549648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
1550648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        } catch (RemoteException ex) {
1551648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        }
1552648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        mLayoutRequested = true;    // ask wm for a new surface next time.
1553648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        return;
1554648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                    }
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15581d0c708961f824ac5171238c205a7bf328d5d8a5Romain Guy
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_ORIENTATION) Log.v(
1560c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    TAG, "Relayout returned: frame=" + frame + ", surface=" + mSurface);
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowLeft = frame.left;
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mWindowTop = frame.top;
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // !!FIXME!! This next section handles the case where we did not get the
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // window size we asked for. We should avoid this by getting a maximum size from
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // the window session beforehand.
15683556c9a8068497d0de8964fd3be719c68eae1f00Dianne Hackborn            if (mWidth != frame.width() || mHeight != frame.height()) {
15693556c9a8068497d0de8964fd3be719c68eae1f00Dianne Hackborn                mWidth = frame.width();
15703556c9a8068497d0de8964fd3be719c68eae1f00Dianne Hackborn                mHeight = frame.height();
15713556c9a8068497d0de8964fd3be719c68eae1f00Dianne Hackborn            }
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1573dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            if (mSurfaceHolder != null) {
1574dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                // The app owns the surface; tell it about what is going on.
1575dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (mSurface.isValid()) {
1576dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    // XXX .copyFrom() doesn't work!
1577dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    //mSurfaceHolder.mSurface.copyFrom(mSurface);
1578dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.mSurface = mSurface;
1579dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
158030bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown                mSurfaceHolder.setSurfaceFrameSize(mWidth, mHeight);
1581dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                mSurfaceHolder.mSurfaceLock.unlock();
1582dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                if (mSurface.isValid()) {
1583dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (!hadSurface) {
1584dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolder.ungetCallbacks();
1585dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
1586dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mIsCreating = true;
1587dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolderCallback.surfaceCreated(mSurfaceHolder);
1588dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1589dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        if (callbacks != null) {
1590dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            for (SurfaceHolder.Callback c : callbacks) {
1591dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                c.surfaceCreated(mSurfaceHolder);
1592dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            }
1593dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1594dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        surfaceChanged = true;
1595dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1596dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (surfaceChanged) {
1597dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        mSurfaceHolderCallback.surfaceChanged(mSurfaceHolder,
1598dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                lp.format, mWidth, mHeight);
1599dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1600dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        if (callbacks != null) {
1601dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            for (SurfaceHolder.Callback c : callbacks) {
1602dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                c.surfaceChanged(mSurfaceHolder, lp.format,
1603dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                                        mWidth, mHeight);
1604dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            }
1605dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1606dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1607dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mIsCreating = false;
1608dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                } else if (hadSurface) {
1609dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.ungetCallbacks();
1610dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
1611dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolderCallback.surfaceDestroyed(mSurfaceHolder);
1612dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    if (callbacks != null) {
1613dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        for (SurfaceHolder.Callback c : callbacks) {
1614dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                            c.surfaceDestroyed(mSurfaceHolder);
1615dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                        }
1616dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    }
1617dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    mSurfaceHolder.mSurfaceLock.lock();
161893c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    try {
161993c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                        mSurfaceHolder.mSurface = new Surface();
162093c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    } finally {
162193c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                        mSurfaceHolder.mSurfaceLock.unlock();
162293c5b6a81da8f7348ae43c860d21617eed4fa6d7Jozef BABJAK                    }
1623dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                }
1624dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            }
162553389bdcdf6ffaaec533b73bc1d0abc5807ec7f6Romain Guy
162640e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase            if (mAttachInfo.mHardwareRenderer != null &&
162740e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    mAttachInfo.mHardwareRenderer.isEnabled()) {
162840e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                if (hwInitialized || windowShouldResize ||
162940e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                        mWidth != mAttachInfo.mHardwareRenderer.getWidth() ||
163040e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                        mHeight != mAttachInfo.mHardwareRenderer.getHeight()) {
163140e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    mAttachInfo.mHardwareRenderer.setup(mWidth, mHeight);
163240e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    if (!hwInitialized) {
163340e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                        mAttachInfo.mHardwareRenderer.invalidate(mHolder);
163440e0383dce630ed9b2b1aa0e497709b89dfab6efChet Haase                    }
16357e1160e8664a9c5c79367f4ba3c2266a39bbcef5Romain Guy                }
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1638ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn            if (!mStopped) {
1639ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                boolean focusChangedDueToTouchMode = ensureTouchModeLocally(
16406d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                        (relayoutResult&WindowManagerImpl.RELAYOUT_RES_IN_TOUCH_MODE) != 0);
1641ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                if (focusChangedDueToTouchMode || mWidth != host.getMeasuredWidth()
1642ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        || mHeight != host.getMeasuredHeight() || contentInsetsChanged) {
16433a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    int childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width);
16443a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    int childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height);
1645ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1646ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (DEBUG_LAYOUT) Log.v(TAG, "Ooops, something changed!  mWidth="
1647ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + mWidth + " measuredWidth=" + host.getMeasuredWidth()
1648ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " mHeight=" + mHeight
1649ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " measuredHeight=" + host.getMeasuredHeight()
1650ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                            + " coveredInsetsChanged=" + contentInsetsChanged);
1651ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1652ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                     // Ask host how big it wants to be
1653c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown                    performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
1654ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1655ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // Implementation of weights from WindowManager.LayoutParams
1656ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // We just grow the dimensions as needed and re-measure if
1657ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    // needs be
1658ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    int width = host.getMeasuredWidth();
1659ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    int height = host.getMeasuredHeight();
1660ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    boolean measureAgain = false;
1661ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1662ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (lp.horizontalWeight > 0.0f) {
1663ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        width += (int) ((mWidth - width) * lp.horizontalWeight);
1664ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width,
1665ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                MeasureSpec.EXACTLY);
1666ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        measureAgain = true;
1667ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1668ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (lp.verticalWeight > 0.0f) {
1669ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        height += (int) ((mHeight - height) * lp.verticalWeight);
1670ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height,
1671ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                MeasureSpec.EXACTLY);
1672ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        measureAgain = true;
1673ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1674ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
1675ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    if (measureAgain) {
1676ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                        if (DEBUG_LAYOUT) Log.v(TAG,
1677ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                "And hey let's measure once more: width=" + width
1678ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                                + " height=" + height);
1679c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown                        performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
1680ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn                    }
1681ce418e661ab52a08a2a2c3b2f10a4dd9adf33305Dianne Hackborn
16823a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn                    layoutRequested = true;
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16873a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn        final boolean didLayout = layoutRequested && !mStopped;
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean triggerGlobalLayoutListener = didLayout
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || attachInfo.mRecomputeGlobalAttributes;
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (didLayout) {
1691c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown            performLayout();
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // By this point all views have been sized and positionned
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We can compute the transparent area
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((host.mPrivateFlags & View.REQUEST_TRANSPARENT_REGIONS) != 0) {
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // start out transparent
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // TODO: AVOID THAT CALL BY CACHING THE RESULT?
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.getLocationInWindow(mTmpLocation);
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTransparentRegion.set(mTmpLocation[0], mTmpLocation[1],
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTmpLocation[0] + host.mRight - host.mLeft,
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTmpLocation[1] + host.mBottom - host.mTop);
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.gatherTransparentRegion(mTransparentRegion);
170564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                if (mTranslator != null) {
170664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                    mTranslator.translateRegionInWindowToScreen(mTransparentRegion);
170764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima                }
170864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mTransparentRegion.equals(mPreviousTransparentRegion)) {
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mPreviousTransparentRegion.set(mTransparentRegion);
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // reconfigure window manager
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sWindowSession.setTransparentRegion(mWindow, mTransparentRegion);
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (RemoteException e) {
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) {
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("======================================");
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("performTraversals -- after setFrame");
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                host.debug();
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (triggerGlobalLayoutListener) {
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mRecomputeGlobalAttributes = false;
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mTreeObserver.dispatchOnGlobalLayout();
1729eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
1730eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            if (AccessibilityManager.getInstance(host.mContext).isEnabled()) {
17314213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                postSendWindowContentChangedCallback(mView);
1732eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            }
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (computesInternalInsets) {
1736fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Clear the original insets.
1737fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            final ViewTreeObserver.InternalInsetsInfo insets = attachInfo.mGivenInternalInsets;
1738fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            insets.reset();
1739fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1740fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Compute new insets in place.
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attachInfo.mTreeObserver.dispatchOnComputeInternalInsets(insets);
1742fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1743fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown            // Tell the window manager.
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (insetsPending || !mLastGivenInsets.equals(insets)) {
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastGivenInsets.set(insets);
1746fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
1747fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                // Translate insets to screen coordinates if needed.
1748fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Rect contentInsets;
1749fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Rect visibleInsets;
1750fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                final Region touchableRegion;
1751fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                if (mTranslator != null) {
1752fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    contentInsets = mTranslator.getTranslatedContentInsets(insets.contentInsets);
1753fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    visibleInsets = mTranslator.getTranslatedVisibleInsets(insets.visibleInsets);
1754fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    touchableRegion = mTranslator.getTranslatedTouchableArea(insets.touchableRegion);
1755fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                } else {
1756fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    contentInsets = insets.contentInsets;
1757fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    visibleInsets = insets.visibleInsets;
1758fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                    touchableRegion = insets.touchableRegion;
1759fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                }
1760fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sWindowSession.setInsets(mWindow, insets.mTouchableInsets,
1763fbf097732137a32930d151f7ba6816a5b870c32aJeff Brown                            contentInsets, visibleInsets, touchableRegion);
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RemoteException e) {
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17688506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
176912d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn        boolean skipDraw = false;
177012d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirst) {
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // handle first focus request
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: mView.hasFocus()="
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mView.hasFocus());
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView != null) {
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mView.hasFocus()) {
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mView.requestFocus(View.FOCUS_FORWARD);
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFocusedView = mRealFocusedView = mView.findFocus();
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: requested focused view="
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mFocusedView);
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRealFocusedView = mView.findFocus();
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "First: existing focused view="
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mRealFocusedView);
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
178712d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            if ((relayoutResult&WindowManagerImpl.RELAYOUT_RES_ANIMATING) != 0) {
178812d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                // The first time we relayout the window, if the system is
178912d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                // doing window animations, we want to hold of on any future
179012d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                // draws until the animation is done.
179112d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                mWindowsAnimating = true;
179212d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            }
179312d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn        } else if (mWindowsAnimating) {
179412d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            skipDraw = true;
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirst = false;
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWillDrawSoon = false;
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNewSurfaceNeeded = false;
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewVisibility = viewVisibility;
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mHasWindowFocus) {
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean imTarget = WindowManager.LayoutParams
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .mayUseInputMethod(mWindowAttributes.flags);
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imTarget != mLastWasImTarget) {
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWasImTarget = imTarget;
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InputMethodManager imm = InputMethodManager.peekInstance();
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (imm != null && imTarget) {
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imm.startGettingWindowFocus(mView);
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    imm.onWindowFocus(mView, mView.findFocus(),
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mWindowAttributes.softInputMode,
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            !mHasHadWindowFocus, mWindowAttributes.flags);
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18168506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
181796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        // Remember if we must report the next draw.
181896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if ((relayoutResult & WindowManagerImpl.RELAYOUT_RES_FIRST_TIME) != 0) {
181996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mReportNextDraw = true;
182096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
182196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
1822ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy        boolean cancelDraw = attachInfo.mTreeObserver.dispatchOnPreDraw() ||
1823ea83503e8683531fac2534047e50bc1e5979b6ddRomain Guy                viewVisibility != View.VISIBLE;
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
182561158c621d0834d6d4e1e0310596d9b7a1071178Chet Haase        if (!cancelDraw && !newSurface) {
182612d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            if (!skipDraw || mReportNextDraw) {
182712d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                if (mPendingTransitions != null && mPendingTransitions.size() > 0) {
182812d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                    for (int i = 0; i < mPendingTransitions.size(); ++i) {
182912d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                        mPendingTransitions.get(i).startChangingAnimations();
183012d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                    }
183112d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                    mPendingTransitions.clear();
1832d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                }
183312d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn
183412d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                performDraw();
1835d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            }
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
183778cb7cf7d1d82834c4405650a17e387370004570Chris Wren            if (viewVisibility == View.VISIBLE) {
183878cb7cf7d1d82834c4405650a17e387370004570Chris Wren                // Try again
183978cb7cf7d1d82834c4405650a17e387370004570Chris Wren                scheduleTraversals();
184078cb7cf7d1d82834c4405650a17e387370004570Chris Wren            } else if (mPendingTransitions != null && mPendingTransitions.size() > 0) {
1841d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                for (int i = 0; i < mPendingTransitions.size(); ++i) {
1842d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                    mPendingTransitions.get(i).endChangingAnimations();
1843d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                }
1844d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase                mPendingTransitions.clear();
1845d56c6951755a902a354e13e5fa05fb0984132cc6Chet Haase            }
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1849c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown    private void performMeasure(int childWidthMeasureSpec, int childHeightMeasureSpec) {
1850c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        Trace.traceBegin(Trace.TRACE_TAG_VIEW, "measure");
1851c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        try {
1852c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown            mView.measure(childWidthMeasureSpec, childHeightMeasureSpec);
1853c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        } finally {
1854c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown            Trace.traceEnd(Trace.TRACE_TAG_VIEW);
1855c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        }
1856c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown    }
1857c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown
1858c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown    private void performLayout() {
1859c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        mLayoutRequested = false;
1860c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        mScrollMayChange = true;
1861c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown
1862c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        final View host = mView;
1863c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        if (DEBUG_ORIENTATION || DEBUG_LAYOUT) {
1864c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown            Log.v(TAG, "Laying out " + host + " to (" +
1865c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown                    host.getMeasuredWidth() + ", " + host.getMeasuredHeight() + ")");
1866c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        }
1867c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown
1868c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        final long startTime;
1869c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        if (ViewDebug.DEBUG_PROFILE_LAYOUT) {
1870c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown            startTime = SystemClock.elapsedRealtime();
1871c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        }
1872c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        Trace.traceBegin(Trace.TRACE_TAG_VIEW, "layout");
1873c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        try {
1874c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown            host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());
1875c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        } finally {
1876c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown            Trace.traceEnd(Trace.TRACE_TAG_VIEW);
1877c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        }
1878c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown
1879c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        if (ViewDebug.DEBUG_PROFILE_LAYOUT) {
1880c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown            EventLog.writeEvent(60001, SystemClock.elapsedRealtime() - startTime);
1881c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        }
1882c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown
1883c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        if (false && ViewDebug.consistencyCheckEnabled) {
1884c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown            if (!host.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_LAYOUT)) {
1885c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown                throw new IllegalStateException("The view hierarchy is an inconsistent state,"
1886c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown                        + "please refer to the logs with the tag "
1887c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown                        + ViewDebug.CONSISTENCY_LOG_TAG + " for more infomation.");
1888c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown            }
1889c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown        }
1890c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown    }
1891c8d2668bc4506aa9e771931534c6379cf687d41eJeff Brown
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestTransparentRegion(View child) {
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the test below should not fail unless someone is messing with us
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == child) {
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mView.mPrivateFlags |= View.REQUEST_TRANSPARENT_REGIONS;
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Need to make sure we re-evaluate the window attributes next
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // time around, to ensure the window has the correct format.
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowAttributesChanged = true;
1900f21c9b0f52d5a1de5050f90f0818467fad014eaaRomain Guy            mWindowAttributesChangesFlag = 0;
19011bd80ad7fdf71e437fa650f02366664c27b66b46Mathias Agopian            requestLayout();
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Figures out the measure spec for the root view in a window based on it's
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layout params.
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param windowSize
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            The available width or height of the window
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rootDimension
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            The layout params for one dimension (width or height) of the
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            window.
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The measure spec to use to measure the root view.
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1918a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy    private static int getRootMeasureSpec(int windowSize, int rootDimension) {
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int measureSpec;
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (rootDimension) {
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1922980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy        case ViewGroup.LayoutParams.MATCH_PARENT:
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window can't resize. Force root view to be windowSize.
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY);
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case ViewGroup.LayoutParams.WRAP_CONTENT:
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window can resize. Set max size for root view.
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST);
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Window wants to be an exact size. Force root view to be that size.
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            measureSpec = MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY);
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return measureSpec;
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19380f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    int mHardwareYOffset;
19390f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    int mResizeAlpha;
19400f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    final Paint mResizePaint = new Paint();
19410f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
19427d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    public void onHardwarePreDraw(HardwareCanvas canvas) {
19430f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        canvas.translate(0, -mHardwareYOffset);
19440f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
19450f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
19467d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy    public void onHardwarePostDraw(HardwareCanvas canvas) {
19477d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
19480f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            mResizePaint.setAlpha(mResizeAlpha);
19497d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            canvas.drawHardwareLayer(mResizeBuffer, 0.0f, mHardwareYOffset, mResizePaint);
19500f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
19514213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        drawAccessibilityFocusedDrawableIfNeeded(canvas);
19520f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn    }
19530f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
1954ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    /**
1955ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     * @hide
1956ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase     */
1957ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    void outputDisplayList(View view) {
1958ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        if (mAttachInfo != null && mAttachInfo.mHardwareCanvas != null) {
1959ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            DisplayList displayList = view.getDisplayList();
1960ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            if (displayList != null) {
196159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mAttachInfo.mHardwareCanvas.outputDisplayList(displayList);
196259a12cae208790dd202656f50a40a53ef49baeebRomain Guy            }
196359a12cae208790dd202656f50a40a53ef49baeebRomain Guy        }
196459a12cae208790dd202656f50a40a53ef49baeebRomain Guy    }
196559a12cae208790dd202656f50a40a53ef49baeebRomain Guy
196659a12cae208790dd202656f50a40a53ef49baeebRomain Guy    /**
196759a12cae208790dd202656f50a40a53ef49baeebRomain Guy     * @see #PROPERTY_PROFILE_RENDERING
196859a12cae208790dd202656f50a40a53ef49baeebRomain Guy     */
196959a12cae208790dd202656f50a40a53ef49baeebRomain Guy    private void profileRendering(boolean enabled) {
197059a12cae208790dd202656f50a40a53ef49baeebRomain Guy        if (mProfileRendering) {
197159a12cae208790dd202656f50a40a53ef49baeebRomain Guy            mRenderProfilingEnabled = enabled;
197259a12cae208790dd202656f50a40a53ef49baeebRomain Guy            if (mRenderProfiler == null) {
197359a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler = new Thread(new Runnable() {
197459a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    @Override
197559a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    public void run() {
197659a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        Log.d(TAG, "Starting profiling thread");
197759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        while (mRenderProfilingEnabled) {
197859a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            mAttachInfo.mHandler.post(new Runnable() {
197959a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                @Override
198059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                public void run() {
198159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                    mDirty.set(0, 0, mWidth, mHeight);
198259a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                    scheduleTraversals();
198359a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                }
198459a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            });
198559a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            try {
198659a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                // TODO: This should use vsync when we get an API
198759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                Thread.sleep(15);
198859a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            } catch (InterruptedException e) {
198959a12cae208790dd202656f50a40a53ef49baeebRomain Guy                                Log.d(TAG, "Exiting profiling thread");
199059a12cae208790dd202656f50a40a53ef49baeebRomain Guy                            }
199159a12cae208790dd202656f50a40a53ef49baeebRomain Guy                        }
199259a12cae208790dd202656f50a40a53ef49baeebRomain Guy                    }
199359a12cae208790dd202656f50a40a53ef49baeebRomain Guy                }, "Rendering Profiler");
199459a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler.start();
199559a12cae208790dd202656f50a40a53ef49baeebRomain Guy            } else {
199659a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler.interrupt();
199759a12cae208790dd202656f50a40a53ef49baeebRomain Guy                mRenderProfiler = null;
1998ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
1999ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
2000ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
2001ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
20022f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    /**
20032f2022afa1eb85018368398bd150e9575fc099c9Chet Haase     * Called from draw() when DEBUG_FPS is enabled
20042f2022afa1eb85018368398bd150e9575fc099c9Chet Haase     */
20052f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    private void trackFPS() {
20062f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        // Tracks frames per second drawn. First value in a series of draws may be bogus
20072f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        // because it down not account for the intervening idle time
20082f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        long nowTime = System.currentTimeMillis();
20092f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        if (mFpsStartTime < 0) {
20102f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            mFpsStartTime = mFpsPrevTime = nowTime;
20112f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            mFpsNumFrames = 0;
20122f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        } else {
20132f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            ++mFpsNumFrames;
20142f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            String thisHash = Integer.toHexString(System.identityHashCode(this));
20152f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            long frameTime = nowTime - mFpsPrevTime;
20162f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            long totalTime = nowTime - mFpsStartTime;
20172f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            Log.v(TAG, "0x" + thisHash + "\tFrame time:\t" + frameTime);
20182f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            mFpsPrevTime = nowTime;
20192f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            if (totalTime > 1000) {
20202f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                float fps = (float) mFpsNumFrames * 1000 / totalTime;
20212f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                Log.v(TAG, "0x" + thisHash + "\tFPS:\t" + fps);
20222f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                mFpsStartTime = nowTime;
20232f2022afa1eb85018368398bd150e9575fc099c9Chet Haase                mFpsNumFrames = 0;
20242f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            }
20252f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        }
20262f2022afa1eb85018368398bd150e9575fc099c9Chet Haase    }
20272f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
202896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    private void performDraw() {
2029006f0e41abca961bade88908d7ef56ae63c429fbCraig Mautner        if (!mAttachInfo.mScreenOn && !mReportNextDraw) {
2030006f0e41abca961bade88908d7ef56ae63c429fbCraig Mautner            return;
2031006f0e41abca961bade88908d7ef56ae63c429fbCraig Mautner        }
20327e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy
203396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        final long drawStartTime;
203496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (ViewDebug.DEBUG_LATENCY) {
203596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            drawStartTime = System.nanoTime();
203696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            if (mLastDrawFinishedTimeNanos != 0) {
203796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                Log.d(ViewDebug.DEBUG_LATENCY_TAG, "Starting draw(); it has been "
203896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        + ((drawStartTime - mLastDrawFinishedTimeNanos) * 0.000001f)
203996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        + "ms since the last draw finished.");
204096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            } else {
204196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                Log.d(ViewDebug.DEBUG_LATENCY_TAG, "Starting draw().");
204296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            }
204396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
204496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
204596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        final boolean fullRedrawNeeded = mFullRedrawNeeded;
204696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        mFullRedrawNeeded = false;
2047481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown
20481f59e5c19bf72f88eed6f8de08b0a879d999f61cRomain Guy        mIsDrawing = true;
2049481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        Trace.traceBegin(Trace.TRACE_TAG_VIEW, "draw");
2050481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        try {
2051481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            draw(fullRedrawNeeded);
2052481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        } finally {
20531f59e5c19bf72f88eed6f8de08b0a879d999f61cRomain Guy            mIsDrawing = false;
2054481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            Trace.traceEnd(Trace.TRACE_TAG_VIEW);
2055481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        }
205696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
205796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (ViewDebug.DEBUG_LATENCY) {
205896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            long now = System.nanoTime();
205996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            Log.d(ViewDebug.DEBUG_LATENCY_TAG, "performDraw() took "
206096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    + ((now - drawStartTime) * 0.000001f)
206196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    + "ms.");
206296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mLastDrawFinishedTimeNanos = now;
206396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
206496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
206596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (mReportNextDraw) {
206696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mReportNextDraw = false;
206796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
206896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            if (LOCAL_LOGV) {
206996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                Log.v(TAG, "FINISHED DRAWING: " + mWindowAttributes.getTitle());
207096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            }
207196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            if (mSurfaceHolder != null && mSurface.isValid()) {
207296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mSurfaceHolderCallback.surfaceRedrawNeeded(mSurfaceHolder);
207396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
207496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                if (callbacks != null) {
207596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    for (SurfaceHolder.Callback c : callbacks) {
207696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        if (c instanceof SurfaceHolder.Callback2) {
207796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                            ((SurfaceHolder.Callback2)c).surfaceRedrawNeeded(
207896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                                    mSurfaceHolder);
207996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        }
208096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    }
208196e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                }
208296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            }
208396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            try {
208496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                sWindowSession.finishDrawing(mWindow);
208596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            } catch (RemoteException e) {
208696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            }
208796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        }
208896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown    }
208996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void draw(boolean fullRedrawNeeded) {
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface surface = mSurface;
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (surface == null || !surface.isValid()) {
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20962f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        if (DEBUG_FPS) {
20972f2022afa1eb85018368398bd150e9575fc099c9Chet Haase            trackFPS();
20982f2022afa1eb85018368398bd150e9575fc099c9Chet Haase        }
20992f2022afa1eb85018368398bd150e9575fc099c9Chet Haase
21002a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        if (!sFirstDrawComplete) {
21012a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            synchronized (sFirstDrawHandlers) {
21022a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                sFirstDrawComplete = true;
2103812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                final int count = sFirstDrawHandlers.size();
2104812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                for (int i = 0; i< count; i++) {
2105a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mHandler.post(sFirstDrawHandlers.get(i));
21062a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn                }
21072a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn            }
21082a9094d07915a077026a651a7773f94322bf7d23Dianne Hackborn        }
210959a12cae208790dd202656f50a40a53ef49baeebRomain Guy
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scrollToRectOrFocus(null, false);
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
211225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        final AttachInfo attachInfo = mAttachInfo;
211325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        if (attachInfo.mViewScrollChanged) {
211425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            attachInfo.mViewScrollChanged = false;
211525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            attachInfo.mTreeObserver.dispatchOnScrollChanged();
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21178506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int yoff;
21190f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        boolean animating = mScroller != null && mScroller.computeScrollOffset();
21200f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        if (animating) {
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            yoff = mScroller.getCurrY();
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            yoff = mScrollY;
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurScrollY != yoff) {
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurScrollY = yoff;
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fullRedrawNeeded = true;
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
212996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
213025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        final float appScale = attachInfo.mApplicationScale;
213125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        final boolean scalingRequired = attachInfo.mScalingRequired;
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21330f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        int resizeAlpha = 0;
21347d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy        if (mResizeBuffer != null) {
21357d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            long deltaTime = SystemClock.uptimeMillis() - mResizeBufferStartTime;
21367d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            if (deltaTime < mResizeBufferDuration) {
21377d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                float amt = deltaTime/(float) mResizeBufferDuration;
21380f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                amt = mResizeInterpolator.getInterpolation(amt);
21390f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                animating = true;
21400f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                resizeAlpha = 255 - (int)(amt*255);
21410f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            } else {
21427d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                disposeResizeBuffer();
21430f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            }
21440f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn        }
21450f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn
214696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        final Rect dirty = mDirty;
2147dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        if (mSurfaceHolder != null) {
2148dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // The app owns the surface, we won't draw.
2149dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            dirty.setEmpty();
21500f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            if (animating) {
21510f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                if (mScroller != null) {
21520f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                    mScroller.abortAnimation();
21530f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn                }
21547d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy                disposeResizeBuffer();
21550f761d6b8f5d5a607c87dbcdca6fe0ec7911970eDianne Hackborn            }
2156dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return;
2157dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
215858ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy
215958ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy        if (fullRedrawNeeded) {
216025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            attachInfo.mIgnoreDirtyState = true;
2161c3166e15f8898a2ba66fb177efbddb1d0edf6140Romain Guy            dirty.set(0, 0, (int) (mWidth * appScale + 0.5f), (int) (mHeight * appScale + 0.5f));
216258ef7fbf16864164efe98bf613b15c64deb1afc0Romain Guy        }
2163ad4f70306b2089a273635b73a101fe48aa36cbe2Chet Haase
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_ORIENTATION || DEBUG_DRAW) {
2165c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            Log.v(TAG, "Draw " + mView + "/"
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mWindowAttributes.getTitle()
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": dirty={" + dirty.left + "," + dirty.top
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + "," + dirty.right + "," + dirty.bottom + "} surface="
21699189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                    + surface + " surface.isValid()=" + surface.isValid() + ", appScale:" +
21709189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                    appScale + ", width=" + mWidth + ", height=" + mHeight);
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
217325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        attachInfo.mTreeObserver.dispatchOnDraw();
217425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy
2175a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian        if (!dirty.isEmpty() || mIsAnimating) {
217625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (attachInfo.mHardwareRenderer != null && attachInfo.mHardwareRenderer.isEnabled()) {
217796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                // Draw with hardware renderer.
217896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mIsAnimating = false;
217996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mHardwareYOffset = yoff;
218096e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mResizeAlpha = resizeAlpha;
2181fea12b87f2988f20ea87314c4a1b47e1a0f4d95eRomain Guy
218296e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mCurrentDirty.set(dirty);
218396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mCurrentDirty.union(mPreviousDirty);
218496e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                mPreviousDirty.set(dirty);
218596e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                dirty.setEmpty();
218696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
218725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                if (attachInfo.mHardwareRenderer.draw(mView, attachInfo, this,
218896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                        animating ? null : mCurrentDirty)) {
218996e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown                    mPreviousDirty.set(0, 0, mWidth, mHeight);
21904e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown                }
219125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            } else if (!drawSoftware(surface, attachInfo, yoff, scalingRequired, dirty)) {
219225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                return;
219325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
219425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        }
2195a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian
219625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        if (animating) {
219725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            mFullRedrawNeeded = true;
219825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            scheduleTraversals();
219925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        }
220025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy    }
22014e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
220225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy    /**
2203edbca1285e4757900e43d31087451d1953555d7dRomain Guy     * @return true if drawing was succesfull, false if an error occurred
220425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy     */
220525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy    private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int yoff,
220625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            boolean scalingRequired, Rect dirty) {
2207a62b09a121960d98005e364d85aac4998a410ae3Mathias Agopian
2208413baf8a03db180607efaca0bb60c15a153c4322Romain Guy        // If we get here with a disabled & requested hardware renderer, something went
2209413baf8a03db180607efaca0bb60c15a153c4322Romain Guy        // wrong (an invalidate posted right before we destroyed the hardware surface
2210413baf8a03db180607efaca0bb60c15a153c4322Romain Guy        // for instance) so we should just bail out. Locking the surface with software
2211413baf8a03db180607efaca0bb60c15a153c4322Romain Guy        // rendering at this point would lock it forever and prevent hardware renderer
2212413baf8a03db180607efaca0bb60c15a153c4322Romain Guy        // from doing its job when it comes back.
2213413baf8a03db180607efaca0bb60c15a153c4322Romain Guy        if (attachInfo.mHardwareRenderer != null && !attachInfo.mHardwareRenderer.isEnabled() &&
2214413baf8a03db180607efaca0bb60c15a153c4322Romain Guy                attachInfo.mHardwareRenderer.isRequested()) {
2215413baf8a03db180607efaca0bb60c15a153c4322Romain Guy            mFullRedrawNeeded = true;
2216413baf8a03db180607efaca0bb60c15a153c4322Romain Guy            scheduleTraversals();
2217413baf8a03db180607efaca0bb60c15a153c4322Romain Guy            return false;
2218413baf8a03db180607efaca0bb60c15a153c4322Romain Guy        }
2219413baf8a03db180607efaca0bb60c15a153c4322Romain Guy
222025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        // Draw with software renderer.
222125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        Canvas canvas;
222225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        try {
222325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            int left = dirty.left;
222425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            int top = dirty.top;
222525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            int right = dirty.right;
222625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            int bottom = dirty.bottom;
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
222825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            final long lockCanvasStartTime;
222925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (ViewDebug.DEBUG_LATENCY) {
223025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                lockCanvasStartTime = System.nanoTime();
223125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
223325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            canvas = mSurface.lockCanvas(dirty);
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
223525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (ViewDebug.DEBUG_LATENCY) {
223625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                long now = System.nanoTime();
223725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                Log.d(ViewDebug.DEBUG_LATENCY_TAG, "- lockCanvas() took "
223825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                        + ((now - lockCanvasStartTime) * 0.000001f) + "ms");
223925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
224125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (left != dirty.left || top != dirty.top || right != dirty.right ||
224225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                    bottom != dirty.bottom) {
224325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                attachInfo.mIgnoreDirtyState = true;
224425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
224625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // TODO: Do this in native
224725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            canvas.setDensity(mDensity);
224825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        } catch (Surface.OutOfResourcesException e) {
224925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            Log.e(TAG, "OutOfResourcesException locking surface", e);
225025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            try {
225125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                if (!sWindowSession.outOfMemory(mWindow)) {
225225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                    Slog.w(TAG, "No processes killed for memory; killing self");
225325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                    Process.killProcess(Process.myPid());
225425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                }
225525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            } catch (RemoteException ex) {
225625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
225725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            mLayoutRequested = true;    // ask wm for a new surface next time.
225825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            return false;
225925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        } catch (IllegalArgumentException e) {
2260dddcd22b7ea56b1d3e31f2bbc35c80cb047de879Romain Guy            Log.e(TAG, "Could not lock surface", e);
226125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // Don't assume this is due to out of memory, it could be
226225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // something else, and if it is something else then we could
226325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // kill stuff (or ourself) for no reason.
226425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            mLayoutRequested = true;    // ask wm for a new surface next time.
226525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            return false;
226625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        }
226795db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown
226825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        try {
226925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (DEBUG_ORIENTATION || DEBUG_DRAW) {
227025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                Log.v(TAG, "Surface " + surface + " drawing to bitmap w="
227125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                        + canvas.getWidth() + ", h=" + canvas.getHeight());
227225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                //canvas.drawARGB(255, 255, 0, 0);
227325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
227495db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown
227525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            long startTime = 0L;
227625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (ViewDebug.DEBUG_PROFILE_DRAWING) {
227725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                startTime = SystemClock.elapsedRealtime();
227825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
227995db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown
228025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // If this bitmap's format includes an alpha channel, we
228125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // need to clear it before drawing so that the child will
228225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // properly re-composite its drawing on a transparent
228325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // background. This automatically respects the clip/dirty region
228425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // or
228525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // If we are applying an offset, we need to clear the area
228625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // where the offset doesn't appear to avoid having garbage
228725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            // left in the blank areas.
228825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (!canvas.isOpaque() || yoff != 0) {
228925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                canvas.drawColor(0, PorterDuff.Mode.CLEAR);
229025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
22918169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
229225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            dirty.setEmpty();
229325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            mIsAnimating = false;
229425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            attachInfo.mDrawingTime = SystemClock.uptimeMillis();
229525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            mView.mPrivateFlags |= View.DRAWN;
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (DEBUG_DRAW) {
229825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                Context cxt = mView.getContext();
229925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                Log.i(TAG, "Drawing: package:" + cxt.getPackageName() +
230025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                        ", metrics=" + cxt.getResources().getDisplayMetrics() +
230125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                        ", compatibilityInfo=" + cxt.getResources().getCompatibilityInfo());
230225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
230325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            try {
230425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                canvas.translate(0, -yoff);
230525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                if (mTranslator != null) {
230625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                    mTranslator.translateCanvas(canvas);
230725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                }
230825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                canvas.setScreenDensity(scalingRequired
230925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                        ? DisplayMetrics.DENSITY_DEVICE : 0);
231025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                attachInfo.mSetIgnoreDirtyState = false;
231195db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown
231225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                final long drawStartTime;
231325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                if (ViewDebug.DEBUG_LATENCY) {
231425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                    drawStartTime = System.nanoTime();
231525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                }
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
231725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                mView.draw(canvas);
231895db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown
23194213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                drawAccessibilityFocusedDrawableIfNeeded(canvas);
23204213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
232125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                if (ViewDebug.DEBUG_LATENCY) {
232225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                    long now = System.nanoTime();
232325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                    Log.d(ViewDebug.DEBUG_LATENCY_TAG, "- draw() took "
232425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                            + ((now - drawStartTime) * 0.000001f) + "ms");
232525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                }
232625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            } finally {
232725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                if (!attachInfo.mSetIgnoreDirtyState) {
232825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                    // Only clear the flag if it was not set during the mView.draw() call
232925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                    attachInfo.mIgnoreDirtyState = false;
233095db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown                }
233195db2b20d7bc0aaf00b1d4418124f5cf0a755d74Jeff Brown            }
23328506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
233325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (false && ViewDebug.consistencyCheckEnabled) {
233425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                mView.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_DRAWING);
233525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
233625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy
233725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (ViewDebug.DEBUG_PROFILE_DRAWING) {
233825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                EventLog.writeEvent(60000, SystemClock.elapsedRealtime() - startTime);
233925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
234025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        } finally {
234125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            final long unlockCanvasAndPostStartTime;
234225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (ViewDebug.DEBUG_LATENCY) {
234325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                unlockCanvasAndPostStartTime = System.nanoTime();
234425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
234525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy
2346dddcd22b7ea56b1d3e31f2bbc35c80cb047de879Romain Guy            try {
2347dddcd22b7ea56b1d3e31f2bbc35c80cb047de879Romain Guy                surface.unlockCanvasAndPost(canvas);
2348dddcd22b7ea56b1d3e31f2bbc35c80cb047de879Romain Guy            } catch (IllegalArgumentException e) {
2349dddcd22b7ea56b1d3e31f2bbc35c80cb047de879Romain Guy                Log.e(TAG, "Could not unlock surface", e);
2350dddcd22b7ea56b1d3e31f2bbc35c80cb047de879Romain Guy                mLayoutRequested = true;    // ask wm for a new surface next time.
2351dddcd22b7ea56b1d3e31f2bbc35c80cb047de879Romain Guy                //noinspection ReturnInsideFinallyBlock
2352dddcd22b7ea56b1d3e31f2bbc35c80cb047de879Romain Guy                return false;
2353dddcd22b7ea56b1d3e31f2bbc35c80cb047de879Romain Guy            }
235425eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy
235525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (ViewDebug.DEBUG_LATENCY) {
235625eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                long now = System.nanoTime();
235725eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                Log.d(ViewDebug.DEBUG_LATENCY_TAG, "- unlockCanvasAndPost() took "
235825eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                        + ((now - unlockCanvasAndPostStartTime) * 0.000001f) + "ms");
235925eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
236025eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy
236125eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            if (LOCAL_LOGV) {
236225eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy                Log.v(TAG, "Surface " + surface + " unlockCanvasAndPost");
236325eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy            }
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
236525eba5c5029bd91ff7e396b2cca0e4ce024124edRomain Guy        return true;
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2368e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov    @Override
2369e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov    public View findViewToTakeAccessibilityFocusFromHover(View child, View descendant) {
2370e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov        if (descendant.includeForAccessibility()) {
2371e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov            return descendant;
2372e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov        }
2373e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov        return null;
2374e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov    }
2375e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov
23764213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    /**
23774213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * We want to draw a highlight around the current accessibility focused.
23784213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * Since adding a style for all possible view is not a viable option we
23794213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * have this specialized drawing method.
23804213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     *
23814213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * Note: We are doing this here to be able to draw the highlight for
23824213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     *       virtual views in addition to real ones.
23834213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     *
23844213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * @param canvas The canvas on which to draw.
23854213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     */
23864213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    private void drawAccessibilityFocusedDrawableIfNeeded(Canvas canvas) {
238707b726c86b1d0b22e51b08cb4234f8212864d9f9Svetoslav Ganov        AccessibilityManager manager = AccessibilityManager.getInstance(mView.mContext);
238807b726c86b1d0b22e51b08cb4234f8212864d9f9Svetoslav Ganov        if (!manager.isEnabled() || !manager.isTouchExplorationEnabled()) {
23894213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            return;
23904213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        }
23914213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        if (mAccessibilityFocusedHost == null || mAccessibilityFocusedHost.mAttachInfo == null) {
23924213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            return;
23934213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        }
23944213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        Drawable drawable = getAccessibilityFocusedDrawable();
23954213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        if (drawable == null) {
23964213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            return;
23974213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        }
23984213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        AccessibilityNodeProvider provider =
23994213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            mAccessibilityFocusedHost.getAccessibilityNodeProvider();
24004213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        Rect bounds = mView.mAttachInfo.mTmpInvalRect;
24014213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        if (provider == null) {
24024213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            mAccessibilityFocusedHost.getDrawingRect(bounds);
24034213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            if (mView instanceof ViewGroup) {
24044213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                ViewGroup viewGroup = (ViewGroup) mView;
24054213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                viewGroup.offsetDescendantRectToMyCoords(mAccessibilityFocusedHost, bounds);
24064213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            }
24074213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        } else {
24084213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            if (mAccessibilityFocusedVirtualView == null) {
240957aab755441a28c2e5c78c35a57b940afc2799e0alanv                mAccessibilityFocusedVirtualView = provider.findAccessibilityFocus(View.NO_ID);
24104213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            }
24111d74df226619101d905d872c8e609d315409695eSvetoslav Ganov            if (mAccessibilityFocusedVirtualView == null) {
24121d74df226619101d905d872c8e609d315409695eSvetoslav Ganov                return;
24131d74df226619101d905d872c8e609d315409695eSvetoslav Ganov            }
24144213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            mAccessibilityFocusedVirtualView.getBoundsInScreen(bounds);
24154213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            bounds.offset(-mAttachInfo.mWindowLeft, -mAttachInfo.mWindowTop);
24164213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        }
24174213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        drawable.setBounds(bounds);
24184213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        drawable.draw(canvas);
24194213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    }
24204213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
24214213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    private Drawable getAccessibilityFocusedDrawable() {
24224213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        if (mAttachInfo != null) {
24234213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            // Lazily load the accessibility focus drawable.
24244213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            if (mAttachInfo.mAccessibilityFocusDrawable == null) {
24254213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                TypedValue value = new TypedValue();
24264213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                final boolean resolved = mView.mContext.getTheme().resolveAttribute(
24274213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                        R.attr.accessibilityFocusedDrawable, value, true);
24284213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                if (resolved) {
24294213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    mAttachInfo.mAccessibilityFocusDrawable =
24304213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                        mView.mContext.getResources().getDrawable(value.resourceId);
24314213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                }
24324213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            }
24334213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            return mAttachInfo.mAccessibilityFocusDrawable;
24344213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        }
24354213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        return null;
24364213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    }
24374213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
243851e4d4db296c252641161b39e98f49acebc46062Romain Guy    void invalidateDisplayLists() {
243951e4d4db296c252641161b39e98f49acebc46062Romain Guy        final ArrayList<DisplayList> displayLists = mDisplayLists;
244051e4d4db296c252641161b39e98f49acebc46062Romain Guy        final int count = displayLists.size();
244151e4d4db296c252641161b39e98f49acebc46062Romain Guy
244251e4d4db296c252641161b39e98f49acebc46062Romain Guy        for (int i = 0; i < count; i++) {
244351e4d4db296c252641161b39e98f49acebc46062Romain Guy            displayLists.get(i).invalidate();
244451e4d4db296c252641161b39e98f49acebc46062Romain Guy        }
244551e4d4db296c252641161b39e98f49acebc46062Romain Guy
244651e4d4db296c252641161b39e98f49acebc46062Romain Guy        displayLists.clear();
244751e4d4db296c252641161b39e98f49acebc46062Romain Guy    }
244851e4d4db296c252641161b39e98f49acebc46062Romain Guy
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean scrollToRectOrFocus(Rect rectangle, boolean immediate) {
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final View.AttachInfo attachInfo = mAttachInfo;
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect ci = attachInfo.mContentInsets;
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect vi = attachInfo.mVisibleInsets;
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int scrollY = 0;
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean handled = false;
24558506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (vi.left > ci.left || vi.top > ci.top
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || vi.right > ci.right || vi.bottom > ci.bottom) {
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We'll assume that we aren't going to change the scroll
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // offset, since we want to avoid that unless it is actually
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // going to make the focus visible...  otherwise we scroll
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // all over the place.
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrollY = mScrollY;
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We can be called for two different situations: during a draw,
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // to update the scroll position if the focus has changed (in which
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // case 'rectangle' is null), or in response to a
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // requestChildRectangleOnScreen() call (in which case 'rectangle'
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // is non-null and we just want to scroll to whatever that
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // rectangle is).
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View focus = mRealFocusedView;
2470e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy
2471e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            // When in touch mode, focus points to the previously focused view,
2472e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            // which may have been removed from the view hierarchy. The following
2473b71193bffc1d2ec60efd987300e2e85e678aa6f0Joe Onorato            // line checks whether the view is still in our hierarchy.
2474b71193bffc1d2ec60efd987300e2e85e678aa6f0Joe Onorato            if (focus == null || focus.mAttachInfo != mAttachInfo) {
2475e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy                mRealFocusedView = null;
2476e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy                return false;
2477e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy            }
2478e8b165253d03d67b30850cedee15e1214a453cb4Romain Guy
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focus != mLastScrolledFocus) {
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If the focus has changed, then ignore any requests to scroll
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to a rectangle; first we want to make sure the entire focus
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // view is visible.
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rectangle = null;
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Eval scroll: focus=" + focus
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " rectangle=" + rectangle + " ci=" + ci
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " vi=" + vi);
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (focus == mLastScrolledFocus && !mScrollMayChange
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && rectangle == null) {
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Optimization: if the focus hasn't changed since last
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // time, and no layout has happened, then just leave things
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // as they are.
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Keeping scroll y="
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + mScrollY + " vi=" + vi.toShortString());
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (focus != null) {
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We need to determine if the currently focused view is
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // within the visible part of the window and, if not, apply
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // a pan so it can be seen.
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastScrolledFocus = focus;
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScrollMayChange = false;
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Need to scroll?");
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Try to find the rectangle from the focus view.
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (focus.getGlobalVisibleRect(mVisRect, null)) {
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Root w="
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + mView.getWidth() + " h=" + mView.getHeight()
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " ci=" + ci.toShortString()
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " vi=" + vi.toShortString());
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (rectangle == null) {
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        focus.getFocusedRect(mTempRect);
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Focus " + focus
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": focusRect=" + mTempRect.toShortString());
25121c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                        if (mView instanceof ViewGroup) {
25131c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                            ((ViewGroup) mView).offsetDescendantRectToMyCoords(
25141c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                                    focus, mTempRect);
25151c6a89491b23aa54bec9e7677c24005350aca525Dianne Hackborn                        }
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Focus in window: focusRect="
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString()
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visRect=" + mVisRect.toShortString());
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mTempRect.set(rectangle);
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Request scroll to rect: "
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString()
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " visRect=" + mVisRect.toShortString());
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mTempRect.intersect(mVisRect)) {
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (DEBUG_INPUT_RESIZE) Log.v(TAG,
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                "Focus window visible rect: "
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + mTempRect.toShortString());
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mTempRect.height() >
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                (mView.getHeight()-vi.top-vi.bottom)) {
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If the focus simply is not going to fit, then
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // best is probably just to leave things as-is.
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Too tall; leaving scrollY=" + scrollY);
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if ((mTempRect.top-scrollY) < vi.top) {
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            scrollY -= vi.top - (mTempRect.top-scrollY);
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Top covered; scrollY=" + scrollY);
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if ((mTempRect.bottom-scrollY)
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                > (mView.getHeight()-vi.bottom)) {
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            scrollY += (mTempRect.bottom-scrollY)
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    - (mView.getHeight()-vi.bottom);
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (DEBUG_INPUT_RESIZE) Log.v(TAG,
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    "Bottom covered; scrollY=" + scrollY);
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        handled = true;
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25538506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scrollY != mScrollY) {
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Pan scroll changed: old="
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mScrollY + " , new=" + scrollY);
25577d70fbf0b5672bada8b25f065bc292796c3d4812Romain Guy            if (!immediate && mResizeBuffer == null) {
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mScroller == null) {
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mScroller = new Scroller(mView.getContext());
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScroller.startScroll(0, mScrollY, 0, scrollY-mScrollY);
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (mScroller != null) {
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScroller.abortAnimation();
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrollY = scrollY;
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25678506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return handled;
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25708506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2571e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov    /**
2572e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov     * @hide
2573e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov     */
2574e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov    public View getAccessibilityFocusedHost() {
2575e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov        return mAccessibilityFocusedHost;
2576e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov    }
2577e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov
2578e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov    /**
2579e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov     * @hide
2580e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov     */
2581e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov    public AccessibilityNodeInfo getAccessibilityFocusedVirtualView() {
2582e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov        return mAccessibilityFocusedVirtualView;
2583e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov    }
2584e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov
25854213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    void setAccessibilityFocusedHost(View host) {
2586791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        // If we have a virtual view with accessibility focus we need
2587791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        // to clear the focus and invalidate the virtual view bounds.
2588791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        if (mAccessibilityFocusedVirtualView != null) {
2589791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov
2590791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            AccessibilityNodeInfo focusNode = mAccessibilityFocusedVirtualView;
2591791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            View focusHost = mAccessibilityFocusedHost;
2592791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            focusHost.clearAccessibilityFocusNoCallbacks();
2593791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov
2594791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            // Wipe the state of the current accessibility focus since
2595791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            // the call into the provider to clear accessibility focus
2596791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            // will fire an accessibility event which will end up calling
2597791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            // this method and we want to have clean state when this
2598791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            // invocation happens.
2599791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            mAccessibilityFocusedHost = null;
2600791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            mAccessibilityFocusedVirtualView = null;
2601791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov
2602791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            AccessibilityNodeProvider provider = focusHost.getAccessibilityNodeProvider();
2603791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            if (provider != null) {
2604791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                // Invalidate the area of the cleared accessibility focus.
2605791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                focusNode.getBoundsInParent(mTempRect);
2606791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                focusHost.invalidate(mTempRect);
2607791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                // Clear accessibility focus in the virtual node.
2608791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                final int virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId(
2609791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                        focusNode.getSourceNodeId());
2610791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                provider.performAction(virtualNodeId,
2611791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                        AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS, null);
2612791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            }
2613791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        }
2614791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        if (mAccessibilityFocusedHost != null) {
2615791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            // Clear accessibility focus in the view.
26164213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            mAccessibilityFocusedHost.clearAccessibilityFocusNoCallbacks();
26174213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        }
2618791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov
2619791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        // Set the new focus host.
26204213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        mAccessibilityFocusedHost = host;
2621791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov
2622791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        // If the host has a provide find the virtual descendant that has focus.
2623791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        if (mAccessibilityFocusedHost != null) {
2624791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            AccessibilityNodeProvider provider =
2625791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                mAccessibilityFocusedHost.getAccessibilityNodeProvider();
2626791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            if (provider != null) {
2627791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                mAccessibilityFocusedVirtualView = provider.findAccessibilityFocus(View.NO_ID);
2628791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                return;
2629791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            }
2630791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        }
26314213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    }
26324213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestChildFocus(View child, View focused) {
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
2635b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov
2636b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        if (DEBUG_INPUT_RESIZE) {
2637b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov            Log.v(TAG, "Request child focus: focus now " + focused);
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2639b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov
2640b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(mOldFocusedView, focused);
2641b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        scheduleTraversals();
2642b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFocusedView = mRealFocusedView = focused;
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearChildFocus(View child) {
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        if (DEBUG_INPUT_RESIZE) {
2650b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov            Log.v(TAG, "Clearing child focus");
2651b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        }
2652b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov
2653b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        mOldFocusedView = mFocusedView;
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2655b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        // Invoke the listener only if there is no view to take focus
2656b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        if (focusSearch(null, View.FOCUS_FORWARD) == null) {
2657b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov            mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(mOldFocusedView, null);
265873eb97f628b298c7bd032aa9db11dadf05f5b539Amith Yamasani        }
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2660b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov        mFocusedView = mRealFocusedView = null;
2661b36a0ac9709e9e1c7098559c0435cfbdc09e6c46Svetoslav Ganov    }
266273eb97f628b298c7bd032aa9db11dadf05f5b539Amith Yamasani
26634213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    @Override
26644213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    public ViewParent getParentForAccessibility() {
26654213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        return null;
26664213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    }
26674213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void focusableViewAvailable(View v) {
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
26701c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy        if (mView != null) {
26711c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            if (!mView.hasFocus()) {
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                v.requestFocus();
26731c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            } else {
26741c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // the one case where will transfer focus away from the current one
26751c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // is if the current view is a view group that prefers to give focus
26761c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                // to its children first AND the view is a descendant of it.
26771c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                mFocusedView = mView.findFocus();
26781c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                boolean descendantsHaveDibsOnFocus =
26791c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                        (mFocusedView instanceof ViewGroup) &&
26801c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                            (((ViewGroup) mFocusedView).getDescendantFocusability() ==
26811c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                                    ViewGroup.FOCUS_AFTER_DESCENDANTS);
26821c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                if (descendantsHaveDibsOnFocus && isViewDescendantOf(v, mFocusedView)) {
26831c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                    // If a view gets the focus, the listener will be invoked from requestChildFocus()
26841c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                    v.requestFocus();
26851c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy                }
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void recomputeViewAttributes(View child) {
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == child) {
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mRecomputeGlobalAttributes = true;
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mWillDrawSoon) {
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scheduleTraversals();
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchDetachedFromWindow() {
270190fc03bc493fc2c984599b198b9d50bc387134f2Romain Guy        if (mView != null && mView.mAttachInfo != null) {
270216260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            if (mAttachInfo.mHardwareRenderer != null &&
270316260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy                    mAttachInfo.mHardwareRenderer.isEnabled()) {
270416260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy                mAttachInfo.mHardwareRenderer.validate();
270516260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            }
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mView.dispatchDetachedFromWindow();
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27098643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityInteractionConnectionManager.ensureNoConnection();
27108643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager.removeAccessibilityStateChangeListener(
27118643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAccessibilityInteractionConnectionManager);
2712eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        removeSendWindowContentChangedCallback();
27138643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
2714a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy        destroyHardwareRenderer();
2715a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy
2716791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        setAccessibilityFocusedHost(null);
2717791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView = null;
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mRootView = null;
27205583dc630f861dd9a3006390db227f9296007e00Mathias Agopian        mAttachInfo.mSurface = null;
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27220586a1b77a788a119166a37fccd909bf9ed65f23Dianne Hackborn        mSurface.release();
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2724cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown        if (mInputQueueCallback != null && mInputQueue != null) {
2725cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mInputQueueCallback.onInputQueueDestroyed(mInputQueue);
2726cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mInputQueueCallback = null;
2727cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown            mInputQueue = null;
272832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        } else if (mInputEventReceiver != null) {
272932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            mInputEventReceiver.dispose();
273032cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            mInputEventReceiver = null;
273146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sWindowSession.remove(mWindow);
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2736349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown
273700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // Dispose the input channel after removing the window so the Window Manager
273800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // doesn't interpret the input channel being closed as an abnormal termination.
273900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (mInputChannel != null) {
274000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputChannel.dispose();
274100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mInputChannel = null;
2742349703effce5acc53ed96f7ed8556131f0c65e18Jeff Brown        }
274396e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown
2744ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        unscheduleTraversals();
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27468506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2747694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    void updateConfiguration(Configuration config, boolean force) {
2748694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        if (DEBUG_CONFIGURATION) Log.v(TAG,
2749694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                "Applying new config to window "
2750694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                + mWindowAttributes.getTitle()
2751694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                + ": " + config);
27525fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
27535fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        CompatibilityInfo ci = mCompatibilityInfo.getIfNeeded();
27545fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        if (ci != null) {
27555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            config = new Configuration(config);
27565fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            ci.applyToConfiguration(config);
27575fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn        }
27585fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
2759694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        synchronized (sConfigCallbacks) {
2760694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            for (int i=sConfigCallbacks.size()-1; i>=0; i--) {
2761694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                sConfigCallbacks.get(i).onConfigurationChanged(config);
2762694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            }
2763694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        }
2764694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        if (mView != null) {
2765694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // At this point the resources have been updated to
2766694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // have the most recent config, whatever that is.  Use
2767694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            // the on in them which may be newer.
27681c90f032fad84b468fbe84d1faa11421e5209f89Romain Guy            config = mView.getResources().getConfiguration();
2769694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            if (force || mLastConfiguration.diff(config) != 0) {
2770694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mLastConfiguration.setTo(config);
2771694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mView.dispatchConfigurationChanged(config);
2772694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn            }
2773694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        }
2774694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn    }
2775694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return true if child is an ancestor of parent, (or equal to the parent).
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2779e5dfa47d84668376b84074c04570fb961870adebSvetoslav Ganov    public static boolean isViewDescendantOf(View child, View parent) {
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (child == parent) {
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ViewParent theParent = child.getParent();
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (theParent instanceof ViewGroup) && isViewDescendantOf((View) theParent, parent);
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2788cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy    private static void forceLayout(View view) {
2789cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        view.forceLayout();
2790cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        if (view instanceof ViewGroup) {
2791cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            ViewGroup group = (ViewGroup) view;
2792cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            final int count = group.getChildCount();
2793cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            for (int i = 0; i < count; i++) {
2794cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                forceLayout(group.getChildAt(i));
2795cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy            }
2796cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy        }
2797cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy    }
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_INVALIDATE = 1;
2800a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_INVALIDATE_RECT = 2;
2801a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DIE = 3;
2802a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_RESIZED = 4;
2803a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_RESIZED_REPORT = 5;
2804a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_WINDOW_FOCUS_CHANGED = 6;
2805a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_KEY = 7;
2806a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_APP_VISIBILITY = 8;
2807a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_GET_NEW_SURFACE = 9;
2808a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_IME_FINISHED_EVENT = 10;
2809a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_KEY_FROM_IME = 11;
2810a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_FINISH_INPUT_CONNECTION = 12;
2811a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_CHECK_FOCUS = 13;
2812a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_CLOSE_SYSTEM_DIALOGS = 14;
2813a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_DRAG_EVENT = 15;
2814a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_DRAG_LOCATION_EVENT = 16;
2815a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_DISPATCH_SYSTEM_UI_VISIBILITY = 17;
2816a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    private final static int MSG_UPDATE_CONFIGURATION = 18;
28174213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    private final static int MSG_PROCESS_INPUT_EVENTS = 19;
28184213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    private final static int MSG_DISPATCH_SCREEN_STATE = 20;
28194213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    private final static int MSG_INVALIDATE_DISPLAY_LIST = 21;
2820005b83b0c62d3d0538f0d566b08bd457015ec661Svetoslav Ganov    private final static int MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST = 22;
282112d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn    private final static int MSG_DISPATCH_DONE_ANIMATING = 23;
2822a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    private final static int MSG_INVALIDATE_WORLD = 24;
2823a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
2824a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    final class ViewRootHandler extends Handler {
2825a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        @Override
2826a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        public String getMessageName(Message message) {
2827a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            switch (message.what) {
2828a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_INVALIDATE:
2829a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_INVALIDATE";
2830a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_INVALIDATE_RECT:
2831a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_INVALIDATE_RECT";
2832a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DIE:
2833a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DIE";
2834a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_RESIZED:
2835a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_RESIZED";
2836a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_RESIZED_REPORT:
2837a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_RESIZED_REPORT";
2838a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_WINDOW_FOCUS_CHANGED:
2839a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_WINDOW_FOCUS_CHANGED";
2840a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_KEY:
2841a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_KEY";
2842a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_APP_VISIBILITY:
2843a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_APP_VISIBILITY";
2844a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_GET_NEW_SURFACE:
2845a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_GET_NEW_SURFACE";
2846a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_IME_FINISHED_EVENT:
2847a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_IME_FINISHED_EVENT";
2848a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_KEY_FROM_IME:
2849a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_KEY_FROM_IME";
2850a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_FINISH_INPUT_CONNECTION:
2851a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_FINISH_INPUT_CONNECTION";
2852a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_CHECK_FOCUS:
2853a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_CHECK_FOCUS";
2854a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_CLOSE_SYSTEM_DIALOGS:
2855a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_CLOSE_SYSTEM_DIALOGS";
2856a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_DRAG_EVENT:
2857a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_DRAG_EVENT";
2858a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_DRAG_LOCATION_EVENT:
2859a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_DRAG_LOCATION_EVENT";
2860a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_DISPATCH_SYSTEM_UI_VISIBILITY:
2861a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_DISPATCH_SYSTEM_UI_VISIBILITY";
2862a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_UPDATE_CONFIGURATION:
2863a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_UPDATE_CONFIGURATION";
2864a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                case MSG_PROCESS_INPUT_EVENTS:
2865a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    return "MSG_PROCESS_INPUT_EVENTS";
286651e4d4db296c252641161b39e98f49acebc46062Romain Guy                case MSG_DISPATCH_SCREEN_STATE:
286751e4d4db296c252641161b39e98f49acebc46062Romain Guy                    return "MSG_DISPATCH_SCREEN_STATE";
286851e4d4db296c252641161b39e98f49acebc46062Romain Guy                case MSG_INVALIDATE_DISPLAY_LIST:
286951e4d4db296c252641161b39e98f49acebc46062Romain Guy                    return "MSG_INVALIDATE_DISPLAY_LIST";
2870005b83b0c62d3d0538f0d566b08bd457015ec661Svetoslav Ganov                case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST:
2871005b83b0c62d3d0538f0d566b08bd457015ec661Svetoslav Ganov                    return "MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST";
287212d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                case MSG_DISPATCH_DONE_ANIMATING:
287312d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                    return "MSG_DISPATCH_DONE_ANIMATING";
2874a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            }
2875a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            return super.getMessageName(message);
2876a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        }
287764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
2878a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        @Override
2879a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        public void handleMessage(Message msg) {
2880a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            switch (msg.what) {
2881a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_INVALIDATE:
2882a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                ((View) msg.obj).invalidate();
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2884a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_INVALIDATE_RECT:
2885a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                final View.AttachInfo.InvalidateInfo info = (View.AttachInfo.InvalidateInfo) msg.obj;
2886a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                info.target.invalidate(info.left, info.top, info.right, info.bottom);
2887a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                info.release();
2888a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2889a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_IME_FINISHED_EVENT:
2890a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                handleImeFinishedEvent(msg.arg1, msg.arg2 != 0);
2891a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2892a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_PROCESS_INPUT_EVENTS:
2893a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                mProcessInputEventsScheduled = false;
2894a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                doProcessInputEvents();
2895a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2896a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_APP_VISIBILITY:
2897a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                handleAppVisibility(msg.arg1 != 0);
2898a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2899a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_GET_NEW_SURFACE:
2900a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                handleGetNewSurface();
2901a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2902a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_RESIZED:
2903a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                ResizedInfo ri = (ResizedInfo)msg.obj;
2904a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
2905a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mWinFrame.width() == msg.arg1 && mWinFrame.height() == msg.arg2
29063556c9a8068497d0de8964fd3be719c68eae1f00Dianne Hackborn                        && mPendingContentInsets.equals(ri.contentInsets)
2907a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        && mPendingVisibleInsets.equals(ri.visibleInsets)
2908a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        && ((ResizedInfo)msg.obj).newConfig == null) {
2909a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    break;
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2911a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                // fall through...
2912a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_RESIZED_REPORT:
2913a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mAdded) {
2914a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    Configuration config = ((ResizedInfo)msg.obj).newConfig;
2915a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (config != null) {
2916a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        updateConfiguration(config, false);
2917a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    }
2918a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mWinFrame.left = 0;
2919a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mWinFrame.right = msg.arg1;
2920a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mWinFrame.top = 0;
2921a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mWinFrame.bottom = msg.arg2;
29223556c9a8068497d0de8964fd3be719c68eae1f00Dianne Hackborn                    mPendingContentInsets.set(((ResizedInfo)msg.obj).contentInsets);
2923a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mPendingVisibleInsets.set(((ResizedInfo)msg.obj).visibleInsets);
2924a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (msg.what == MSG_RESIZED_REPORT) {
2925a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        mReportNextDraw = true;
2926a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    }
2927cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy
2928a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (mView != null) {
2929a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        forceLayout(mView);
2930a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    }
2931a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    requestLayout();
2932cdb86673a78b021f2ba46c48c1a6e7639d013551Romain Guy                }
2933a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
2934a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_WINDOW_FOCUS_CHANGED: {
2935a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mAdded) {
2936a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    boolean hasWindowFocus = msg.arg1 != 0;
2937a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mAttachInfo.mHasWindowFocus = hasWindowFocus;
293859a12cae208790dd202656f50a40a53ef49baeebRomain Guy
2939a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    profileRendering(hasWindowFocus);
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2941a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (hasWindowFocus) {
2942a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        boolean inTouchMode = msg.arg2 != 0;
2943a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        ensureTouchModeLocally(inTouchMode);
2944a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
2945a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        if (mAttachInfo.mHardwareRenderer != null &&
2946a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                mSurface != null && mSurface.isValid()) {
2947a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                            mFullRedrawNeeded = true;
2948648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            try {
2949a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                mAttachInfo.mHardwareRenderer.initializeIfNeeded(mWidth, mHeight,
2950a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                        mHolder);
2951a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                            } catch (Surface.OutOfResourcesException e) {
2952a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                Log.e(TAG, "OutOfResourcesException locking surface", e);
2953a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                try {
2954a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                    if (!sWindowSession.outOfMemory(mWindow)) {
2955a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                        Slog.w(TAG, "No processes killed for memory; killing self");
2956a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                        Process.killProcess(Process.myPid());
2957a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                    }
2958a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                } catch (RemoteException ex) {
2959648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                                }
2960a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                // Retry in a bit.
2961a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                sendMessageDelayed(obtainMessage(msg.what, msg.arg1, msg.arg2), 500);
2962a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                return;
2963648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                            }
2964648251710162cdaf7371012a1cbb79b9bc5bc0e4Dianne Hackborn                        }
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
29668506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2967a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mLastWasImTarget = WindowManager.LayoutParams
2968a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                            .mayUseInputMethod(mWindowAttributes.flags);
29698506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
2970a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    InputMethodManager imm = InputMethodManager.peekInstance();
2971a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (mView != null) {
2972a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        if (hasWindowFocus && imm != null && mLastWasImTarget) {
2973a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                            imm.startGettingWindowFocus(mView);
2974a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        }
2975a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        mAttachInfo.mKeyDispatchState.reset();
2976a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        mView.dispatchWindowFocusChanged(hasWindowFocus);
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
297875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2979a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    // Note: must be done after the focus change callbacks,
2980a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    // so all of the view state is set up correctly.
2981a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    if (hasWindowFocus) {
2982a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        if (imm != null && mLastWasImTarget) {
2983a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                            imm.onWindowFocus(mView, mView.findFocus(),
2984a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                    mWindowAttributes.softInputMode,
2985a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                    !mHasHadWindowFocus, mWindowAttributes.flags);
2986a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        }
2987a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        // Clear the forward bit.  We can just do this directly, since
2988a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        // the window manager doesn't care about it.
2989a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        mWindowAttributes.softInputMode &=
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
2991a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        ((WindowManager.LayoutParams)mView.getLayoutParams())
2992a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                .softInputMode &=
2993a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                                    ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
2994a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                        mHasHadWindowFocus = true;
2995a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    }
299675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
29971d74df226619101d905d872c8e609d315409695eSvetoslav Ganov                    setAccessibilityFocusedHost(null);
29981d74df226619101d905d872c8e609d315409695eSvetoslav Ganov
29994213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    if (mView != null && mAccessibilityManager.isEnabled()) {
30004213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                        if (hasWindowFocus) {
30014213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            mView.sendAccessibilityEvent(
30024213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                                    AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
30034213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            // Give accessibility focus to the view that has input
30044213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            // focus if such, otherwise to the first one.
30054213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            if (mView instanceof ViewGroup) {
30064213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                                ViewGroup viewGroup = (ViewGroup) mView;
30074213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                                View focused = viewGroup.findFocus();
30084213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                                if (focused != null) {
30094213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                                    focused.requestAccessibilityFocus();
30104213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                                }
30114213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            }
30124213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            // There is no accessibility focus, despite our effort
30134213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            // above, now just give it to the first view.
30144213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            if (mAccessibilityFocusedHost == null) {
30154213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                                mView.requestAccessibilityFocus();
30164213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            }
30174213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                        }
3018a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    }
301975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                }
3020a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
3021a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DIE:
3022a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                doDie();
3023a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                break;
3024a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_KEY: {
3025a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                KeyEvent event = (KeyEvent)msg.obj;
3026a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                enqueueInputEvent(event, null, 0, true);
3027a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
3028a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_KEY_FROM_IME: {
3029a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (LOCAL_LOGV) Log.v(
3030a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    TAG, "Dispatching key "
3031a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    + msg.obj + " from IME to " + mView);
3032a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                KeyEvent event = (KeyEvent)msg.obj;
3033a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if ((event.getFlags()&KeyEvent.FLAG_FROM_SYSTEM) != 0) {
3034a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    // The IME is trying to say this event is from the
3035a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    // system!  Bad bad bad!
3036a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    //noinspection UnusedAssignment
3037a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    event = KeyEvent.changeFlags(event, event.getFlags() & ~KeyEvent.FLAG_FROM_SYSTEM);
3038a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
3039a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                enqueueInputEvent(event, null, QueuedInputEvent.FLAG_DELIVER_POST_IME, true);
3040a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
3041a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_FINISH_INPUT_CONNECTION: {
3042a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                InputMethodManager imm = InputMethodManager.peekInstance();
3043a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (imm != null) {
3044a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    imm.reportFinishInputConnection((InputConnection)msg.obj);
3045a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
3046a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
3047a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_CHECK_FOCUS: {
3048a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                InputMethodManager imm = InputMethodManager.peekInstance();
3049a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (imm != null) {
3050a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    imm.checkFocus();
3051a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
3052a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
3053a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_CLOSE_SYSTEM_DIALOGS: {
3054a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (mView != null) {
3055a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    mView.onCloseSystemDialogs((String)msg.obj);
3056a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
3057a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
3058a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_DRAG_EVENT:
3059a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_DRAG_LOCATION_EVENT: {
3060a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                DragEvent event = (DragEvent)msg.obj;
3061a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                event.mLocalState = mLocalDragState;    // only present when this app called startDrag()
3062a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                handleDragEvent(event);
3063a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
3064a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_DISPATCH_SYSTEM_UI_VISIBILITY: {
3065a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                handleDispatchSystemUiVisibilityChanged((SystemUiVisibilityInfo)msg.obj);
3066a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
3067a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            case MSG_UPDATE_CONFIGURATION: {
3068a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                Configuration config = (Configuration)msg.obj;
3069a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                if (config.isOtherSeqNewer(mLastConfiguration)) {
3070a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                    config = mLastConfiguration;
3071a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                }
3072a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown                updateConfiguration(config, false);
3073a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            } break;
3074bb9908b828a8cfd5965553be66faa6af89973697Romain Guy            case MSG_DISPATCH_SCREEN_STATE: {
30757e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy                if (mView != null) {
3076bb9908b828a8cfd5965553be66faa6af89973697Romain Guy                    handleScreenStateChange(msg.arg1 == 1);
30777e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy                }
30787e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            } break;
307951e4d4db296c252641161b39e98f49acebc46062Romain Guy            case MSG_INVALIDATE_DISPLAY_LIST: {
308051e4d4db296c252641161b39e98f49acebc46062Romain Guy                invalidateDisplayLists();
308151e4d4db296c252641161b39e98f49acebc46062Romain Guy            } break;
3082005b83b0c62d3d0538f0d566b08bd457015ec661Svetoslav Ganov            case MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST: {
3083005b83b0c62d3d0538f0d566b08bd457015ec661Svetoslav Ganov                setAccessibilityFocusedHost(null);
3084005b83b0c62d3d0538f0d566b08bd457015ec661Svetoslav Ganov            } break;
308512d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            case MSG_DISPATCH_DONE_ANIMATING: {
308612d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                handleDispatchDoneAnimating();
308712d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            } break;
3088a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            case MSG_INVALIDATE_WORLD: {
3089a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                invalidateWorld(mView);
3090a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            } break;
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
309451e4d4db296c252641161b39e98f49acebc46062Romain Guy
3095a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    final ViewRootHandler mHandler = new ViewRootHandler();
30968643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Something in the current window tells us we need to change the touch mode.  For
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * example, we are not in touch mode, and the user touches the screen.
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the touch mode has changed, tell the window manager, and handle it locally.
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inTouchMode Whether we want to be in touch mode.
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the touch mode changed and focus changed was changed as a result
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean ensureTouchMode(boolean inTouchMode) {
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) Log.d("touchmode", "ensureTouchMode(" + inTouchMode + "), current "
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "touch mode is " + mAttachInfo.mInTouchMode);
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mInTouchMode == inTouchMode) return false;
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // tell the window manager
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sWindowSession.setInTouchMode(inTouchMode);
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(e);
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // handle the change
31192d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy        return ensureTouchModeLocally(inTouchMode);
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Ensure that the touch mode for this window is set, and if it is changing,
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * take the appropriate action.
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inTouchMode Whether we want to be in touch mode.
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the touch mode changed and focus changed was changed as a result
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31282d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy    private boolean ensureTouchModeLocally(boolean inTouchMode) {
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) Log.d("touchmode", "ensureTouchModeLocally(" + inTouchMode + "), current "
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "touch mode is " + mAttachInfo.mInTouchMode);
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo.mInTouchMode == inTouchMode) return false;
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mInTouchMode = inTouchMode;
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mTreeObserver.dispatchOnTouchModeChanged(inTouchMode);
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31372d4cff64b4c864aa5f6859b73ffa65e31ee915acRomain Guy        return (inTouchMode) ? enterTouchMode() : leaveTouchMode();
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean enterTouchMode() {
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null) {
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView.hasFocus()) {
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // note: not relying on mFocusedView here because this could
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // be when the window is first being added, and mFocused isn't
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // set yet.
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final View focused = mView.findFocus();
3147cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                if (focused != null && !focused.isFocusableInTouchMode()) {
3148cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final ViewGroup ancestorToTakeFocus =
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            findAncestorToTakeFocusInTouchMode(focused);
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ancestorToTakeFocus != null) {
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // there is an ancestor that wants focus after its descendants that
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // is focusable in touch mode.. give it focus
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return ancestorToTakeFocus.requestFocus();
3155cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                    } else {
3156cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                        // nothing appropriate to have focus in touch mode, clear it out
3157cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                        mView.unFocus();
3158cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                        mAttachInfo.mTreeObserver.dispatchOnGlobalFocusChange(focused, null);
3159cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                        mFocusedView = null;
3160cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                        mOldFocusedView = null;
3161cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                        return true;
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Find an ancestor of focused that wants focus after its descendants and is
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focusable in touch mode.
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param focused The currently focused view.
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return An appropriate view, or null if no such view exists.
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3175a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy    private static ViewGroup findAncestorToTakeFocusInTouchMode(View focused) {
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewParent parent = focused.getParent();
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (parent instanceof ViewGroup) {
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ViewGroup vgParent = (ViewGroup) parent;
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (vgParent.getDescendantFocusability() == ViewGroup.FOCUS_AFTER_DESCENDANTS
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && vgParent.isFocusableInTouchMode()) {
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return vgParent;
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (vgParent.isRootNamespace()) {
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parent = vgParent.getParent();
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean leaveTouchMode() {
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView != null) {
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mView.hasFocus()) {
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // i learned the hard way to not trust mFocusedView :)
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFocusedView = mView.findFocus();
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!(mFocusedView instanceof ViewGroup)) {
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // some view has focus, let it keep it
3199cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                    return false;
3200cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                } else if (((ViewGroup)mFocusedView).getDescendantFocusability() !=
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ViewGroup.FOCUS_AFTER_DESCENDANTS) {
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // some view group has focus, and doesn't prefer its children
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // over itself for focus, so let them keep it.
3204cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                    return false;
32054213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                }
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3207cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov
3208cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov            // find the best view to give focus to in this brave new non-touch-mode
3209cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov            // world
3210cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov            final View focused = focusSearch(null, View.FOCUS_DOWN);
3211cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov            if (focused != null) {
3212cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov                return focused.requestFocus(View.FOCUS_DOWN);
3213cf8a3b82241a320f568f8448184df6da5bbcf152Svetoslav Ganov            }
32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32184952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverInputEvent(QueuedInputEvent q) {
32194e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
32204952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mDeliverTimeNanos = System.nanoTime();
32214e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
32224e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
3223481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        Trace.traceBegin(Trace.TRACE_TAG_VIEW, "deliverInputEvent");
3224481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        try {
3225481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            if (q.mEvent instanceof KeyEvent) {
3226481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                deliverKeyEvent(q);
32274952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            } else {
3228481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                final int source = q.mEvent.getSource();
3229481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) {
3230481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                    deliverPointerEvent(q);
3231481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                } else if ((source & InputDevice.SOURCE_CLASS_TRACKBALL) != 0) {
3232481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                    deliverTrackballEvent(q);
3233481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                } else {
3234481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                    deliverGenericMotionEvent(q);
3235481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown                }
32364952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
3237481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown        } finally {
3238481c1570dc5cdf58265b53f657801709dd05d1dfJeff Brown            Trace.traceEnd(Trace.TRACE_TAG_VIEW);
32394952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
32404952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    }
32414952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
32424952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverPointerEvent(QueuedInputEvent q) {
32434952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final MotionEvent event = (MotionEvent)q.mEvent;
32447564d62a773857b2f46405d22f296edb3530d88eJeff Brown        final boolean isTouchEvent = event.isTouchEvent();
324521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
32467564d62a773857b2f46405d22f296edb3530d88eJeff Brown            if (isTouchEvent) {
324721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                mInputEventConsistencyVerifier.onTouchEvent(event, 0);
324821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            } else {
324921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown                mInputEventConsistencyVerifier.onGenericMotionEvent(event, 0);
325021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            }
325121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
325221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
32533915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If there is no view, then the event will not be handled.
32543915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
32554952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, false);
32563915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
32573915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
32583915bb845b032dc184dba5e60970b803390ca3edJeff Brown
32593915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Translate the pointer event for compatibility, if needed.
326000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (mTranslator != null) {
326100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mTranslator.translateEventInScreenToAppWindow(event);
326200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32647564d62a773857b2f46405d22f296edb3530d88eJeff Brown        // Enter touch mode on down or scroll.
32657564d62a773857b2f46405d22f296edb3530d88eJeff Brown        final int action = event.getAction();
32667564d62a773857b2f46405d22f296edb3530d88eJeff Brown        if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_SCROLL) {
32673915bb845b032dc184dba5e60970b803390ca3edJeff Brown            ensureTouchMode(true);
32683915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
326900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
32703915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Offset the scroll position.
32713915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mCurScrollY != 0) {
32723915bb845b032dc184dba5e60970b803390ca3edJeff Brown            event.offsetLocation(0, mCurScrollY);
32733915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
32743915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (MEASURE_LATENCY) {
327533bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            lt.sample("A Dispatching PointerEvents", System.nanoTime() - event.getEventTimeNano());
32763915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
32773915bb845b032dc184dba5e60970b803390ca3edJeff Brown
32783915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Remember the touch position for possible drag-initiation.
32797564d62a773857b2f46405d22f296edb3530d88eJeff Brown        if (isTouchEvent) {
32807564d62a773857b2f46405d22f296edb3530d88eJeff Brown            mLastTouchPoint.x = event.getRawX();
32817564d62a773857b2f46405d22f296edb3530d88eJeff Brown            mLastTouchPoint.y = event.getRawY();
32827564d62a773857b2f46405d22f296edb3530d88eJeff Brown        }
32833915bb845b032dc184dba5e60970b803390ca3edJeff Brown
32843915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Dispatch touch to view hierarchy.
328533bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown        boolean handled = mView.dispatchPointerEvent(event);
32863915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (MEASURE_LATENCY) {
328733bbfd2232ea9eaae9a9d87a05a95a430f09bd83Jeff Brown            lt.sample("B Dispatched PointerEvents ", System.nanoTime() - event.getEventTimeNano());
32883915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
32893915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (handled) {
32904952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
32913915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
32923915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
32933915bb845b032dc184dba5e60970b803390ca3edJeff Brown
32943915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Pointer event was unhandled.
32954952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        finishInputEvent(q, false);
329600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown    }
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32984952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverTrackballEvent(QueuedInputEvent q) {
32994952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final MotionEvent event = (MotionEvent)q.mEvent;
330021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
330121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onTrackballEvent(event, 0);
330221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
330321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
33043915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If there is no view, then the event will not be handled.
33053915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
33064952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, false);
33073915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33103915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Deliver the trackball event to the view.
33113915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView.dispatchTrackballEvent(event)) {
33123915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // If we reach this, we delivered a trackball event to mView and
33133915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // mView consumed it. Because we will not translate the trackball
33143915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // event into a key event, touch mode will not exit, so we exit
33153915bb845b032dc184dba5e60970b803390ca3edJeff Brown            // touch mode here.
33163915bb845b032dc184dba5e60970b803390ca3edJeff Brown            ensureTouchMode(false);
33173915bb845b032dc184dba5e60970b803390ca3edJeff Brown
33184952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
33193915bb845b032dc184dba5e60970b803390ca3edJeff Brown            mLastTrackballTime = Integer.MIN_VALUE;
33203915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
33213915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
33223915bb845b032dc184dba5e60970b803390ca3edJeff Brown
33233915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Translate the trackball event into DPAD keys and try to deliver those.
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final TrackballAxis x = mTrackballAxisX;
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final TrackballAxis y = mTrackballAxisY;
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long curTime = SystemClock.uptimeMillis();
33283915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if ((mLastTrackballTime + MAX_TRACKBALL_DELAY) < curTime) {
33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // It has been too long since the last movement,
33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // so restart at the beginning.
33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            x.reset(0);
33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            y.reset(0);
33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTrackballTime = curTime;
33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
333600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final int action = event.getAction();
333749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown        final int metaState = event.getMetaState();
333800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        switch (action) {
333900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case MotionEvent.ACTION_DOWN:
334000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
334100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
3342f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(curTime, curTime,
334349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER, 0, metaState,
334449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
33454952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        InputDevice.SOURCE_KEYBOARD));
334600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                break;
334700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            case MotionEvent.ACTION_UP:
334800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
334900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
3350f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(curTime, curTime,
335149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER, 0, metaState,
335249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
33534952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        InputDevice.SOURCE_KEYBOARD));
335400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                break;
335500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
335700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (DEBUG_TRACKBALL) Log.v(TAG, "TB X=" + x.position + " step="
335800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + x.step + " dir=" + x.dir + " acc=" + x.acceleration
335900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " move=" + event.getX()
336000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " / Y=" + y.position + " step="
336100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + y.step + " dir=" + y.dir + " acc=" + y.acceleration
336200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                + " move=" + event.getY());
336300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final float xOff = x.collect(event.getX(), event.getEventTime(), "X");
336400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        final float yOff = y.collect(event.getY(), event.getEventTime(), "Y");
336500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
336600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // Generate DPAD events based on the trackball movement.
336700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // We pick the axis that has moved the most as the direction of
336800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // the DPAD.  When we generate DPAD events for one axis, then the
336900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // other axis is reset -- we don't want to perform DPAD jumps due
337000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // to slight movements in the trackball when making major movements
337100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        // along the other axis.
337200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        int keycode = 0;
337300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        int movement = 0;
337400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        float accel = 1;
337500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (xOff > yOff) {
337600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            movement = x.generate((2/event.getXPrecision()));
337700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement != 0) {
337800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                keycode = movement > 0 ? KeyEvent.KEYCODE_DPAD_RIGHT
337900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        : KeyEvent.KEYCODE_DPAD_LEFT;
338000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                accel = x.acceleration;
338100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                y.reset(2);
338200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
338300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        } else if (yOff > 0) {
338400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            movement = y.generate((2/event.getYPrecision()));
338500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement != 0) {
338600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                keycode = movement > 0 ? KeyEvent.KEYCODE_DPAD_DOWN
338700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        : KeyEvent.KEYCODE_DPAD_UP;
338800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                accel = y.acceleration;
338900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                x.reset(2);
339000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
339100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        }
339200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown
339300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown        if (keycode != 0) {
339400fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (movement < 0) movement = -movement;
339500fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            int accelMovement = (int)(movement * accel);
339600fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (DEBUG_TRACKBALL) Log.v(TAG, "Move: movement=" + movement
339700fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    + " accelMovement=" + accelMovement
339800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                    + " accel=" + accel);
339900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            if (accelMovement > movement) {
340000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (DEBUG_TRACKBALL) Log.v("foo", "Delivering fake DPAD: "
340100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        + keycode);
340200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                movement--;
340349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                int repeatCount = accelMovement - movement;
3404f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(curTime, curTime,
340549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_MULTIPLE, keycode, repeatCount, metaState,
340649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
34074952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        InputDevice.SOURCE_KEYBOARD));
340800fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            }
340900fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            while (movement > 0) {
341000fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                if (DEBUG_TRACKBALL) Log.v("foo", "Delivering fake DPAD: "
341100fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                        + keycode);
341200fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                movement--;
341300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown                curTime = SystemClock.uptimeMillis();
3414f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(curTime, curTime,
341549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_DOWN, keycode, 0, metaState,
341649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
34174952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        InputDevice.SOURCE_KEYBOARD));
3418f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(curTime, curTime,
341949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyEvent.ACTION_UP, keycode, 0, metaState,
342049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown                        KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK,
34214952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        InputDevice.SOURCE_KEYBOARD));
34224952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
342300fa7bdd69f0868fd17ea7c881c771d785b2fbbdJeff Brown            mLastTrackballTime = curTime;
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34253915bb845b032dc184dba5e60970b803390ca3edJeff Brown
34263915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Unfortunately we can't tell whether the application consumed the keys, so
34273915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // we always consider the trackball event handled.
34284952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        finishInputEvent(q, true);
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34314952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverGenericMotionEvent(QueuedInputEvent q) {
34324952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final MotionEvent event = (MotionEvent)q.mEvent;
343321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
343421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onGenericMotionEvent(event, 0);
343521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
343621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
3437cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int source = event.getSource();
3438cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final boolean isJoystick = (source & InputDevice.SOURCE_CLASS_JOYSTICK) != 0;
3439cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3440cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        // If there is no view, then the event will not be handled.
3441cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (mView == null || !mAdded) {
3442cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (isJoystick) {
3443cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                updateJoystickDirection(event, false);
3444cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
34454952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, false);
3446cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return;
3447cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3448cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3449cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        // Deliver the event to the view.
3450cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (mView.dispatchGenericMotionEvent(event)) {
3451cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (isJoystick) {
3452cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                updateJoystickDirection(event, false);
3453cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
34544952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
3455cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return;
3456cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3457cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3458cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (isJoystick) {
3459cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            // Translate the joystick event into DPAD keys and try to deliver those.
3460cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            updateJoystickDirection(event, true);
34614952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
3462cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else {
34634952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, false);
3464cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3465cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3466cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3467cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private void updateJoystickDirection(MotionEvent event, boolean synthesizeNewKeys) {
3468cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final long time = event.getEventTime();
3469cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int metaState = event.getMetaState();
3470cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int deviceId = event.getDeviceId();
3471cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        final int source = event.getSource();
34726f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
34736f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        int xDirection = joystickAxisValueToDirection(event.getAxisValue(MotionEvent.AXIS_HAT_X));
34746f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        if (xDirection == 0) {
34756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            xDirection = joystickAxisValueToDirection(event.getX());
34766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
34776f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
34786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        int yDirection = joystickAxisValueToDirection(event.getAxisValue(MotionEvent.AXIS_HAT_Y));
34796f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        if (yDirection == 0) {
34806f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            yDirection = joystickAxisValueToDirection(event.getY());
34816f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
3482cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3483cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (xDirection != mLastJoystickXDirection) {
3484cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (mLastJoystickXKeyCode != 0) {
3485f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(time, time,
3486cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_UP, mLastJoystickXKeyCode, 0, metaState,
34874952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source));
3488cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickXKeyCode = 0;
3489cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3490cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3491cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            mLastJoystickXDirection = xDirection;
3492cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3493cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (xDirection != 0 && synthesizeNewKeys) {
3494cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickXKeyCode = xDirection > 0
3495cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        ? KeyEvent.KEYCODE_DPAD_RIGHT : KeyEvent.KEYCODE_DPAD_LEFT;
3496f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(time, time,
3497cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_DOWN, mLastJoystickXKeyCode, 0, metaState,
34984952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source));
3499cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3500cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3501cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3502cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (yDirection != mLastJoystickYDirection) {
3503cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (mLastJoystickYKeyCode != 0) {
3504f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(time, time,
3505cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_UP, mLastJoystickYKeyCode, 0, metaState,
35064952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source));
3507cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickYKeyCode = 0;
3508cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3509cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3510cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            mLastJoystickYDirection = yDirection;
3511cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3512cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            if (yDirection != 0 && synthesizeNewKeys) {
3513cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                mLastJoystickYKeyCode = yDirection > 0
3514cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        ? KeyEvent.KEYCODE_DPAD_DOWN : KeyEvent.KEYCODE_DPAD_UP;
3515f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown                enqueueInputEvent(new KeyEvent(time, time,
3516cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown                        KeyEvent.ACTION_DOWN, mLastJoystickYKeyCode, 0, metaState,
35174952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        deviceId, 0, KeyEvent.FLAG_FALLBACK, source));
3518cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            }
3519cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3520cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3521cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
3522cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    private static int joystickAxisValueToDirection(float value) {
3523cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        if (value >= 0.5f) {
3524cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return 1;
3525cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else if (value <= -0.5f) {
3526cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return -1;
3527cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        } else {
3528cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            return 0;
3529cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
3530cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
3531cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35334e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * Returns true if the key is used for keyboard navigation.
35344e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @param keyEvent The key event.
35354e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @return True if the key is used for keyboard navigation.
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35374e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown    private static boolean isNavigationKey(KeyEvent keyEvent) {
35384e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        switch (keyEvent.getKeyCode()) {
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_LEFT:
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_RIGHT:
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_UP:
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KeyEvent.KEYCODE_DPAD_DOWN:
35434e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_DPAD_CENTER:
35444e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_PAGE_UP:
35454e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_PAGE_DOWN:
35464e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_MOVE_HOME:
35474e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_MOVE_END:
35484e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_TAB:
35494e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_SPACE:
35504e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        case KeyEvent.KEYCODE_ENTER:
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35574e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * Returns true if the key is used for typing.
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keyEvent The key event.
35594e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * @return True if the key is used for typing.
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35614e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown    private static boolean isTypingKey(KeyEvent keyEvent) {
35624e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        return keyEvent.getUnicodeChar() > 0;
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35664e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown     * See if the key event means we should leave touch mode (and leave touch mode if so).
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event.
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether this key event should be consumed (meaning the act of
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   leaving touch mode alone is considered the event).
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean checkForLeavingTouchModeAndConsume(KeyEvent event) {
35724e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Only relevant in touch mode.
35734e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (!mAttachInfo.mInTouchMode) {
35744e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            return false;
35754e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        }
35764e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown
35774e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Only consider leaving touch mode on DOWN or MULTIPLE actions, never on UP.
357851a6bee6719820d09595f474264fcb833eff470aAdam Powell        final int action = event.getAction();
357951a6bee6719820d09595f474264fcb833eff470aAdam Powell        if (action != KeyEvent.ACTION_DOWN && action != KeyEvent.ACTION_MULTIPLE) {
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35824e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown
35834e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Don't leave touch mode if the IME told us not to.
35844e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if ((event.getFlags() & KeyEvent.FLAG_KEEP_TOUCH_MODE) != 0) {
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35884e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // If the key can be used for keyboard navigation then leave touch mode
35894e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // and select a focused view if needed (in ensureTouchMode).
35904e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // When a new focused view is selected, we consume the navigation key because
35914e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // navigation doesn't make much sense unless a view already has focus so
35924e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // the key's purpose is to set focus.
35934e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (isNavigationKey(event)) {
35944e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            return ensureTouchMode(false);
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35974e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // If the key can be used for typing then leave touch mode
35984e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // and select a focused view if needed (in ensureTouchMode).
35994e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        // Always allow the view to process the typing key.
36004e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown        if (isTypingKey(event)) {
36014e6319b73c85082e18d1c532b86336ddd1f8cfaaJeff Brown            ensureTouchMode(false);
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36084952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverKeyEvent(QueuedInputEvent q) {
36094952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final KeyEvent event = (KeyEvent)q.mEvent;
361021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        if (mInputEventConsistencyVerifier != null) {
361121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown            mInputEventConsistencyVerifier.onKeyEvent(event, 0);
361221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        }
361321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
36144952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if ((q.mFlags & QueuedInputEvent.FLAG_DELIVER_POST_IME) == 0) {
36154952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            // If there is no view, then the event will not be handled.
36164952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (mView == null || !mAdded) {
36174952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                finishInputEvent(q, false);
36184952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                return;
36194952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
36203915bb845b032dc184dba5e60970b803390ca3edJeff Brown
36214952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (LOCAL_LOGV) Log.v(TAG, "Dispatching key " + event + " to " + mView);
36223915bb845b032dc184dba5e60970b803390ca3edJeff Brown
36234952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            // Perform predispatching before the IME.
36244952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (mView.dispatchKeyEventPreIme(event)) {
36254952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                finishInputEvent(q, true);
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36284952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
36294952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            // Dispatch to the IME before propagating down the view hierarchy.
36304952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            // The IME will eventually call back into handleImeFinishedEvent.
36314952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (mLastWasImTarget) {
36324952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                InputMethodManager imm = InputMethodManager.peekInstance();
36334952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                if (imm != null) {
363432cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                    final int seq = event.getSequenceNumber();
36354952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                    if (DEBUG_IMF) Log.v(TAG, "Sending key event to IME: seq="
363632cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                            + seq + " event=" + event);
363732cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown                    imm.dispatchKeyEvent(mView.getContext(), seq, event, mInputMethodCallback);
36384952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                    return;
36394952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                }
36404952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36423915bb845b032dc184dba5e60970b803390ca3edJeff Brown
36433915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Not dispatching to IME, continue with post IME actions.
36444952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        deliverKeyEventPostIme(q);
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36474952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    void handleImeFinishedEvent(int seq, boolean handled) {
36484952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final QueuedInputEvent q = mCurrentInputEvent;
364932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        if (q != null && q.mEvent.getSequenceNumber() == seq) {
36504952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            final KeyEvent event = (KeyEvent)q.mEvent;
36514952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (DEBUG_IMF) {
36524952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                Log.v(TAG, "IME finished event: seq=" + seq
36534952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        + " handled=" + handled + " event=" + event);
36544952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
36553915bb845b032dc184dba5e60970b803390ca3edJeff Brown            if (handled) {
36564952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                finishInputEvent(q, true);
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
36584952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                deliverKeyEventPostIme(q);
36594952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
36604952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        } else {
36614952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (DEBUG_IMF) {
36624952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                Log.v(TAG, "IME finished event: seq=" + seq
36634952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        + " handled=" + handled + ", event not found!");
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36678506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
36684952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void deliverKeyEventPostIme(QueuedInputEvent q) {
36694952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        final KeyEvent event = (KeyEvent)q.mEvent;
36704e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        if (ViewDebug.DEBUG_LATENCY) {
36714952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mDeliverPostImeTimeNanos = System.nanoTime();
36724e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        }
36734e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
36743915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If the view went away, then the event will not be handled.
36753915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView == null || !mAdded) {
36764952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, false);
36773915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
36783915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36803915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // If the key's purpose is to exit touch mode then we consume it and consider it handled.
36813915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (checkForLeavingTouchModeAndConsume(event)) {
36824952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
36833915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
36843915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
36858506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
36869065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        // Make sure the fallback event policy sees all keys that will be delivered to the
36879065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        // view hierarchy.
36889065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        mFallbackEventHandler.preDispatchKeyEvent(event);
36899065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
36903915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Deliver the key to the view hierarchy.
36913915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mView.dispatchKeyEvent(event)) {
36924952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
36933915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
36943915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
369586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato
3696c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown        // If the Control modifier is held, try to interpret the key as a shortcut.
36977bedf2449041a425899448cb672e91b0a5c97c62Jeff Brown        if (event.getAction() == KeyEvent.ACTION_DOWN
3698c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                && event.isCtrlPressed()
36997bedf2449041a425899448cb672e91b0a5c97c62Jeff Brown                && event.getRepeatCount() == 0
3700c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                && !KeyEvent.isModifierKey(event.getKeyCode())) {
3701c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            if (mView.dispatchKeyShortcutEvent(event)) {
37024952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                finishInputEvent(q, true);
3703c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown                return;
3704c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            }
3705c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown        }
3706c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
37073915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Apply the fallback event policy.
37083915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (mFallbackEventHandler.dispatchKeyEvent(event)) {
37094952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            finishInputEvent(q, true);
37103915bb845b032dc184dba5e60970b803390ca3edJeff Brown            return;
37113915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37133915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Handle automatic focus changes.
37143915bb845b032dc184dba5e60970b803390ca3edJeff Brown        if (event.getAction() == KeyEvent.ACTION_DOWN) {
37153915bb845b032dc184dba5e60970b803390ca3edJeff Brown            int direction = 0;
37163915bb845b032dc184dba5e60970b803390ca3edJeff Brown            switch (event.getKeyCode()) {
37174213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                case KeyEvent.KEYCODE_DPAD_LEFT:
37184213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    if (event.hasNoModifiers()) {
37194213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                        direction = View.FOCUS_LEFT;
37204213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    }
37214213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    break;
37224213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                case KeyEvent.KEYCODE_DPAD_RIGHT:
37234213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    if (event.hasNoModifiers()) {
37244213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                        direction = View.FOCUS_RIGHT;
37254213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    }
37264213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    break;
37274213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                case KeyEvent.KEYCODE_DPAD_UP:
37284213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    if (event.hasNoModifiers()) {
37294213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                        direction = View.FOCUS_UP;
37304213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    }
37314213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    break;
37324213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                case KeyEvent.KEYCODE_DPAD_DOWN:
37334213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    if (event.hasNoModifiers()) {
37344213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                        direction = View.FOCUS_DOWN;
37354213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    }
37364213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    break;
37374213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                case KeyEvent.KEYCODE_TAB:
37384213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    if (event.hasNoModifiers()) {
37394213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                        direction = View.FOCUS_FORWARD;
37404213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
37414213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                        direction = View.FOCUS_BACKWARD;
37424213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    }
37434213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    break;
37443915bb845b032dc184dba5e60970b803390ca3edJeff Brown            }
37453915bb845b032dc184dba5e60970b803390ca3edJeff Brown            if (direction != 0) {
37464213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                View focused = mView.findFocus();
37473915bb845b032dc184dba5e60970b803390ca3edJeff Brown                if (focused != null) {
37483915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    View v = focused.focusSearch(direction);
37493915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    if (v != null && v != focused) {
37503915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // do the math the get the interesting rect
37513915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // of previous focused into the coord system of
37523915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        // newly focused view
37533915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        focused.getFocusedRect(mTempRect);
37543915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        if (mView instanceof ViewGroup) {
37553915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            ((ViewGroup) mView).offsetDescendantRectToMyCoords(
37563915bb845b032dc184dba5e60970b803390ca3edJeff Brown                                    focused, mTempRect);
37573915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            ((ViewGroup) mView).offsetRectIntoDescendantCoords(
37583915bb845b032dc184dba5e60970b803390ca3edJeff Brown                                    v, mTempRect);
37593915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        }
37603915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        if (v.requestFocus(direction, mTempRect)) {
37614213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            playSoundEffect(SoundEffectConstants
37624213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                                    .getContantForFocusDirection(direction));
37634952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                            finishInputEvent(q, true);
37643915bb845b032dc184dba5e60970b803390ca3edJeff Brown                            return;
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37673915bb845b032dc184dba5e60970b803390ca3edJeff Brown
37683915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    // Give the focused view a last chance to handle the dpad key.
37693915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    if (mView.dispatchUnhandledMove(focused, direction)) {
37704952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                        finishInputEvent(q, true);
37713915bb845b032dc184dba5e60970b803390ca3edJeff Brown                        return;
37723915bb845b032dc184dba5e60970b803390ca3edJeff Brown                    }
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37753915bb845b032dc184dba5e60970b803390ca3edJeff Brown        }
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37773915bb845b032dc184dba5e60970b803390ca3edJeff Brown        // Key was unhandled.
37784952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        finishInputEvent(q, false);
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3781a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    /* drag/drop */
3782407b4e91fe7627545b8110e683953353236b4543Christopher Tate    void setLocalDragState(Object obj) {
3783407b4e91fe7627545b8110e683953353236b4543Christopher Tate        mLocalDragState = obj;
3784407b4e91fe7627545b8110e683953353236b4543Christopher Tate    }
3785407b4e91fe7627545b8110e683953353236b4543Christopher Tate
3786a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    private void handleDragEvent(DragEvent event) {
3787a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // From the root, only drag start/end/location are dispatched.  entered/exited
3788a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // are determined and dispatched by the viewgroup hierarchy, who then report
3789a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        // that back here for ultimate reporting back to the framework.
3790a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (mView != null && mAdded) {
3791a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            final int what = event.mAction;
3792a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3793a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            if (what == DragEvent.ACTION_DRAG_EXITED) {
3794a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // A direct EXITED event means that the window manager knows we've just crossed
3795a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // a window boundary, so the current drag target within this one must have
3796a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // just been exited.  Send it the usual notifications and then we're done
3797a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // for now.
37989d1ab883293b047b654935b84d0803c8c383be91Chris Tate                mView.dispatchDragEvent(event);
3799a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            } else {
3800a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Cache the drag description when the operation starts, then fill it in
3801a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // on subsequent calls as a convenience
3802a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if (what == DragEvent.ACTION_DRAG_STARTED) {
38039d1ab883293b047b654935b84d0803c8c383be91Chris Tate                    mCurrentDragView = null;    // Start the current-recipient tracking
3804a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    mDragDescription = event.mClipDescription;
3805a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                } else {
3806a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mClipDescription = mDragDescription;
3807a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3808a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3809a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // For events with a [screen] location, translate into window coordinates
3810a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if ((what == DragEvent.ACTION_DRAG_LOCATION) || (what == DragEvent.ACTION_DROP)) {
3811a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    mDragPoint.set(event.mX, event.mY);
3812a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mTranslator != null) {
3813a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mTranslator.translatePointInScreenToAppWindow(mDragPoint);
3814a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3815a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3816a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    if (mCurScrollY != 0) {
3817a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        mDragPoint.offset(0, mCurScrollY);
3818a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3819a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3820a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mX = mDragPoint.x;
3821a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    event.mY = mDragPoint.y;
3822a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3823a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3824a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Remember who the current drag target is pre-dispatch
3825a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                final View prevDragView = mCurrentDragView;
3826a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3827a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // Now dispatch the drag/drop event
3828d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                boolean result = mView.dispatchDragEvent(event);
3829a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
3830a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                // If we changed apparent drag target, tell the OS about it
3831a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                if (prevDragView != mCurrentDragView) {
3832a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    try {
3833a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (prevDragView != null) {
3834a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            sWindowSession.dragRecipientExited(mWindow);
3835a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
3836a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        if (mCurrentDragView != null) {
3837a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                            sWindowSession.dragRecipientEntered(mWindow);
3838a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        }
3839a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    } catch (RemoteException e) {
3840a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                        Slog.e(TAG, "Unable to note drag target change");
3841a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                    }
3842a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate                }
3843d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate
3844407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // Report the drop result when we're done
3845d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                if (what == DragEvent.ACTION_DROP) {
38461fc014fd0051a48083c6d469c2a4f22da1aa15e4Christopher Tate                    mDragDescription = null;
3847d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    try {
3848d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Log.i(TAG, "Reporting drop result: " + result);
3849d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        sWindowSession.reportDropResult(mWindow, result);
3850d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    } catch (RemoteException e) {
3851d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                        Log.e(TAG, "Unable to report drop result");
3852d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                    }
3853d4533f1469990582e4a2dd0898429093fe2690c0Chris Tate                }
3854407b4e91fe7627545b8110e683953353236b4543Christopher Tate
3855407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // When the drag operation ends, release any local state object
3856407b4e91fe7627545b8110e683953353236b4543Christopher Tate                // that may have been in use
3857407b4e91fe7627545b8110e683953353236b4543Christopher Tate                if (what == DragEvent.ACTION_DRAG_ENDED) {
3858407b4e91fe7627545b8110e683953353236b4543Christopher Tate                    setLocalDragState(null);
3859407b4e91fe7627545b8110e683953353236b4543Christopher Tate                }
3860a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
3861a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
3862a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        event.recycle();
3863a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
3864a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
38659a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public void handleDispatchSystemUiVisibilityChanged(SystemUiVisibilityInfo args) {
38669a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        if (mSeq != args.seq) {
38679a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            // The sequence has changed, so we need to update our value and make
38689a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            // sure to do a traversal afterward so the window manager is given our
38699a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            // most recent data.
38709a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            mSeq = args.seq;
38719a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            mAttachInfo.mForceReportNewAttributes = true;
38729a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            scheduleTraversals();
38739a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        }
3874664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        if (mView == null) return;
38759a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        if (args.localChanges != 0) {
38769a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            mView.updateLocalSystemUiVisibility(args.localValue, args.localChanges);
387714782f705e94d4e563a48efc85fd25129fd38a7dJoe Onorato        }
3878cf67578c7f99492273a8f8446dd18ddc5af2ae76Dianne Hackborn        if (mAttachInfo != null) {
3879cf67578c7f99492273a8f8446dd18ddc5af2ae76Dianne Hackborn            int visibility = args.globalVisibility&View.SYSTEM_UI_CLEARABLE_FLAGS;
3880cf67578c7f99492273a8f8446dd18ddc5af2ae76Dianne Hackborn            if (visibility != mAttachInfo.mGlobalSystemUiVisibility) {
3881cf67578c7f99492273a8f8446dd18ddc5af2ae76Dianne Hackborn                mAttachInfo.mGlobalSystemUiVisibility = visibility;
3882cf67578c7f99492273a8f8446dd18ddc5af2ae76Dianne Hackborn                mView.dispatchSystemUiVisibilityChanged(visibility);
3883cf67578c7f99492273a8f8446dd18ddc5af2ae76Dianne Hackborn            }
3884cf67578c7f99492273a8f8446dd18ddc5af2ae76Dianne Hackborn        }
3885664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
3886664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
388712d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn    public void handleDispatchDoneAnimating() {
388812d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn        if (mWindowsAnimating) {
388912d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            mWindowsAnimating = false;
389012d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            if (!mDirty.isEmpty() || mIsAnimating)  {
389112d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                scheduleTraversals();
389212d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            }
389312d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn        }
389412d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn    }
389512d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn
38962c095f367779ef32130c72849936a2e3013c8492Christopher Tate    public void getLastTouchPoint(Point outLocation) {
38972c095f367779ef32130c72849936a2e3013c8492Christopher Tate        outLocation.x = (int) mLastTouchPoint.x;
38982c095f367779ef32130c72849936a2e3013c8492Christopher Tate        outLocation.y = (int) mLastTouchPoint.y;
38992c095f367779ef32130c72849936a2e3013c8492Christopher Tate    }
39002c095f367779ef32130c72849936a2e3013c8492Christopher Tate
39019d1ab883293b047b654935b84d0803c8c383be91Chris Tate    public void setDragFocus(View newDragTarget) {
3902a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        if (mCurrentDragView != newDragTarget) {
3903048691cfac42acce24d9462eca5e57ca5aa78e7dChris Tate            mCurrentDragView = newDragTarget;
3904a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
3905a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
3906a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
39079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AudioManager getAudioManager() {
39089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mView == null) {
39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("getAudioManager called when there is no mView");
39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAudioManager == null) {
39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAudioManager = (AudioManager) mView.getContext().getSystemService(Context.AUDIO_SERVICE);
39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAudioManager;
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    public AccessibilityInteractionController getAccessibilityInteractionController() {
39188643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        if (mView == null) {
39198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            throw new IllegalStateException("getAccessibilityInteractionController"
39208643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    + " called when there is no mView");
39218643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
39225ac84423a28fea4924eb1c389d647defe1c1b93cGilles Debunne        if (mAccessibilityInteractionController == null) {
39234213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            mAccessibilityInteractionController = new AccessibilityInteractionController(this);
39248643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
39255ac84423a28fea4924eb1c389d647defe1c1b93cGilles Debunne        return mAccessibilityInteractionController;
39268643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
39278643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
39288169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
39298169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima            boolean insetsPending) throws RemoteException {
393064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
393164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        float appScale = mAttachInfo.mApplicationScale;
39323d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        boolean restore = false;
393364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (params != null && mTranslator != null) {
3934e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            restore = true;
3935e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            params.backup();
393664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateWindowLayout(params);
39379189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        }
393864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (params != null) {
393964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            if (DBG) Log.d(TAG, "WindowLayout in layoutWindow:" + params);
39403d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        }
3941694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn        mPendingConfiguration.seq = 0;
3942f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        //Log.d(TAG, ">>>>>> CALLING relayout");
3943180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn        if (params != null && mOrigWindowType != params.type) {
3944180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn            // For compatibility with old apps, don't crash here.
3945180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn            if (mTargetSdkVersion < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
3946180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                Slog.w(TAG, "Window type can not be changed after "
3947180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                        + "the window is added; ignoring change of " + mView);
3948180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn                params.type = mOrigWindowType;
3949180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn            }
3950180c48489f07ebd748700a5a312070583fefdb45Dianne Hackborn        }
39518169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima        int relayoutResult = sWindowSession.relayout(
39529a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                mWindow, mSeq, params,
3953189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                (int) (mView.getMeasuredWidth() * appScale + 0.5f),
3954189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn                (int) (mView.getMeasuredHeight() * appScale + 0.5f),
39556d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn                viewVisibility, insetsPending ? WindowManagerImpl.RELAYOUT_INSETS_PENDING : 0,
395685afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                mWinFrame, mPendingContentInsets, mPendingVisibleInsets,
3957694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn                mPendingConfiguration, mSurface);
3958f123e49bf0708719b51a7064ae134c097abe4a54Dianne Hackborn        //Log.d(TAG, "<<<<<< BACK FROM relayout");
39593d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        if (restore) {
3960e5fb328825995aa33b5b7ecf8b5bee2b17f81715Mitsuru Oshima            params.restore();
39613d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima        }
396264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima
396364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mTranslator != null) {
396464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWinFrame(mWinFrame);
396564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(mPendingContentInsets);
396664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(mPendingVisibleInsets);
39679189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        }
39688169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima        return relayoutResult;
39698169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    }
39708506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
39719189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima    /**
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void playSoundEffect(int effectId) {
39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
397713b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi        try {
397813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            final AudioManager audioManager = getAudioManager();
39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
398013b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            switch (effectId) {
398113b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.CLICK:
398213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
398313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
398413b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_DOWN:
398513b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_DOWN);
398613b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
398713b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_LEFT:
398813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT);
398913b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
399013b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_RIGHT:
399113b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT);
399213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
399313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                case SoundEffectConstants.NAVIGATION_UP:
399413b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    audioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_UP);
399513b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    return;
399613b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                default:
399713b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                    throw new IllegalArgumentException("unknown effect id " + effectId +
399813b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi                            " not defined in " + SoundEffectConstants.class.getCanonicalName());
399913b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            }
400013b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi        } catch (IllegalStateException e) {
400113b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            // Exception thrown by getAudioManager() when mView is null
400213b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            Log.e(TAG, "FATAL EXCEPTION when attempting to play sound effect: " + e);
400313b18fd7f954c0034144edde84a1aef1a7b56355Jean-Michel Trivi            e.printStackTrace();
40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean performHapticFeedback(int effectId, boolean always) {
40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sWindowSession.performHapticFeedback(mWindow, effectId, always);
40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
40159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View focusSearch(View focused, int direction) {
40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(mView instanceof ViewGroup)) {
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return FocusFinder.getInstance().findNextFocus((ViewGroup) mView, focused, direction);
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void debug() {
40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView.debug();
40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
403265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
4033211370fd943cf26905001b38b8b1791851b26adcRomain Guy    public void dumpGfxInfo(int[] info) {
403465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (mView != null) {
403565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            getGfxInfo(mView, info);
403665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        } else {
403765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            info[0] = info[1] = 0;
403865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
403965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
404065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
4041a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy    private static void getGfxInfo(View view, int[] info) {
404265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        DisplayList displayList = view.mDisplayList;
404365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        info[0]++;
404465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (displayList != null) {
404565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            info[1] += displayList.getSize();
404665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
404765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
404865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        if (view instanceof ViewGroup) {
404965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            ViewGroup group = (ViewGroup) view;
405065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
405165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            int count = group.getChildCount();
405265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            for (int i = 0; i < count; i++) {
405365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy                getGfxInfo(group.getChildAt(i), info);
405465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy            }
405565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy        }
405665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    }
40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void die(boolean immediate) {
405994d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        if (immediate) {
406094d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn            doDie();
406194d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        } else {
40621f59e5c19bf72f88eed6f8de08b0a879d999f61cRomain Guy            if (!mIsDrawing) {
40631f59e5c19bf72f88eed6f8de08b0a879d999f61cRomain Guy                destroyHardwareRenderer();
40641f59e5c19bf72f88eed6f8de08b0a879d999f61cRomain Guy            } else {
40651f59e5c19bf72f88eed6f8de08b0a879d999f61cRomain Guy                Log.e(TAG, "Attempting to destroy the window while drawing!\n" +
40661f59e5c19bf72f88eed6f8de08b0a879d999f61cRomain Guy                        "  window=" + this + ", title=" + mWindowAttributes.getTitle());
40671f59e5c19bf72f88eed6f8de08b0a879d999f61cRomain Guy            }
4068a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.sendEmptyMessage(MSG_DIE);
406994d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn        }
407094d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn    }
407194d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn
407294d691499bdce019421238ebdb6e3d48171eeefdDianne Hackborn    void doDie() {
40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checkThread();
4074b75fa30aaf03d9e425d150b452501e5df0621351Jeff Brown        if (LOCAL_LOGV) Log.v(TAG, "DIE in " + this + " of " + mSurface);
40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
407616260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            if (mAdded) {
407716260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy                dispatchDetachedFromWindow();
407816260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy            }
407916260e73f6c1c9dc94acf0d328a3c564426b8711Romain Guy
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAdded && !mFirst) {
408129d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy                destroyHardwareRenderer();
408229d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
4083edbca1285e4757900e43d31087451d1953555d7dRomain Guy                if (mView != null) {
4084edbca1285e4757900e43d31087451d1953555d7dRomain Guy                    int viewVisibility = mView.getVisibility();
4085edbca1285e4757900e43d31087451d1953555d7dRomain Guy                    boolean viewVisibilityChanged = mViewVisibility != viewVisibility;
4086edbca1285e4757900e43d31087451d1953555d7dRomain Guy                    if (mWindowAttributesChanged || viewVisibilityChanged) {
4087edbca1285e4757900e43d31087451d1953555d7dRomain Guy                        // If layout params have been changed, first give them
4088edbca1285e4757900e43d31087451d1953555d7dRomain Guy                        // to the window manager to make sure it has the correct
4089edbca1285e4757900e43d31087451d1953555d7dRomain Guy                        // animation info.
4090edbca1285e4757900e43d31087451d1953555d7dRomain Guy                        try {
4091edbca1285e4757900e43d31087451d1953555d7dRomain Guy                            if ((relayoutWindow(mWindowAttributes, viewVisibility, false)
4092edbca1285e4757900e43d31087451d1953555d7dRomain Guy                                    & WindowManagerImpl.RELAYOUT_RES_FIRST_TIME) != 0) {
4093edbca1285e4757900e43d31087451d1953555d7dRomain Guy                                sWindowSession.finishDrawing(mWindow);
4094edbca1285e4757900e43d31087451d1953555d7dRomain Guy                            }
4095edbca1285e4757900e43d31087451d1953555d7dRomain Guy                        } catch (RemoteException e) {
40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
40979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4098edbca1285e4757900e43d31087451d1953555d7dRomain Guy
4099edbca1285e4757900e43d31087451d1953555d7dRomain Guy                    mSurface.release();
41009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4102edbca1285e4757900e43d31087451d1953555d7dRomain Guy
4103edbca1285e4757900e43d31087451d1953555d7dRomain Guy            mAdded = false;
41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41075fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    public void requestUpdateConfiguration(Configuration config) {
4108a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_UPDATE_CONFIGURATION, config);
4109a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
41105fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn    }
41115fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn
4112a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    public void loadSystemProperties() {
4113a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        boolean layout = SystemProperties.getBoolean(
4114a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                View.DEBUG_LAYOUT_PROPERTY, false);
4115a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        if (layout != mAttachInfo.mDebugLayout) {
4116a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            mAttachInfo.mDebugLayout = layout;
4117a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            if (!mHandler.hasMessages(MSG_INVALIDATE_WORLD)) {
4118a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn                mHandler.sendEmptyMessageDelayed(MSG_INVALIDATE_WORLD, 200);
4119a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn            }
4120a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn        }
4121a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn    }
4122a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn
412329d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy    private void destroyHardwareRenderer() {
4124a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy        AttachInfo attachInfo = mAttachInfo;
4125a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy        HardwareRenderer hardwareRenderer = attachInfo.mHardwareRenderer;
4126a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy
4127a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy        if (hardwareRenderer != null) {
4128a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            if (mView != null) {
4129a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy                hardwareRenderer.destroyHardwareResources(mView);
4130a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            }
4131a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            hardwareRenderer.destroy(true);
4132a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            hardwareRenderer.setRequested(false);
4133a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy
4134a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            attachInfo.mHardwareRenderer = null;
4135a998dff5d49a423aaf7097aa8f96bf5bdc681d25Romain Guy            attachInfo.mHardwareAccelerated = false;
413629d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy        }
413729d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy    }
413829d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
41394952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    void dispatchImeFinishedEvent(int seq, boolean handled) {
4140a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_IME_FINISHED_EVENT);
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = seq;
41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg2 = handled ? 1 : 0;
4143ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        msg.setAsynchronous(true);
4144a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
4145a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    }
4146a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
4147a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    public void dispatchFinishInputConnection(InputConnection connection) {
4148a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_FINISH_INPUT_CONNECTION, connection);
4149a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41513d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima
415285afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn    public void dispatchResized(int w, int h, Rect contentInsets,
4153e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn            Rect visibleInsets, boolean reportDraw, Configuration newConfig) {
41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG_LAYOUT) Log.v(TAG, "Resizing " + this + ": w=" + w
415585afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                + " h=" + h + " contentInsets=" + contentInsets.toShortString()
41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " visibleInsets=" + visibleInsets.toShortString()
41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " reportDraw=" + reportDraw);
4158a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(reportDraw ? MSG_RESIZED_REPORT :MSG_RESIZED);
415964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        if (mTranslator != null) {
41603556c9a8068497d0de8964fd3be719c68eae1f00Dianne Hackborn            mTranslator.translateRectInScreenToAppWindow(contentInsets);
416164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            mTranslator.translateRectInScreenToAppWindow(visibleInsets);
416264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            w *= mTranslator.applicationInvertedScale;
416364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            h *= mTranslator.applicationInvertedScale;
416464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        }
416564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        msg.arg1 = w;
416664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        msg.arg2 = h;
4167e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ResizedInfo ri = new ResizedInfo();
41683556c9a8068497d0de8964fd3be719c68eae1f00Dianne Hackborn        ri.contentInsets = new Rect(contentInsets);
4169e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ri.visibleInsets = new Rect(visibleInsets);
4170e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        ri.newConfig = newConfig;
4171e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        msg.obj = ri;
4172a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41741f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
41751f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    /**
41764952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * Represents a pending input event that is waiting in a queue.
41774952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     *
41784952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * Input events are processed in serial order by the timestamp specified by
4179211370fd943cf26905001b38b8b1791851b26adcRomain Guy     * {@link InputEvent#getEventTimeNano()}.  In general, the input dispatcher delivers
41804952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * one input event to the application at a time and waits for the application
41814952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * to finish handling it before delivering the next one.
41824952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     *
41834952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * However, because the application or IME can synthesize and inject multiple
41844952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * key events at a time without going through the input dispatcher, we end up
41854952dfd16a0f839559ffa78f5016394caf85294fJeff Brown     * needing a queue on the application's side.
41861f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase     */
41874952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private static final class QueuedInputEvent {
4188211370fd943cf26905001b38b8b1791851b26adcRomain Guy        public static final int FLAG_DELIVER_POST_IME = 1;
41894952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
41904952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public QueuedInputEvent mNext;
41914952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
41924952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public InputEvent mEvent;
419332cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        public InputEventReceiver mReceiver;
41944952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public int mFlags;
41954952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
41964952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // Used for latency calculations.
41974952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public long mReceiveTimeNanos;
41984952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public long mDeliverTimeNanos;
41994952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        public long mDeliverPostImeTimeNanos;
42004952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    }
42014952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
42024952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private QueuedInputEvent obtainQueuedInputEvent(InputEvent event,
420332cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            InputEventReceiver receiver, int flags) {
42044952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        QueuedInputEvent q = mQueuedInputEventPool;
42054952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (q != null) {
42064952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mQueuedInputEventPoolSize -= 1;
42074952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mQueuedInputEventPool = q.mNext;
42084952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mNext = null;
42094952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        } else {
42104952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q = new QueuedInputEvent();
42111f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        }
42121f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
42134952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        q.mEvent = event;
421432cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        q.mReceiver = receiver;
42154952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        q.mFlags = flags;
42164952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        return q;
42174952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    }
42184952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
42194952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void recycleQueuedInputEvent(QueuedInputEvent q) {
42204952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        q.mEvent = null;
422132cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        q.mReceiver = null;
42221f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
42234952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (mQueuedInputEventPoolSize < MAX_QUEUED_INPUT_EVENT_POOL_SIZE) {
42244952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mQueuedInputEventPoolSize += 1;
42254952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mNext = mQueuedInputEventPool;
42264952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mQueuedInputEventPool = q;
42271f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        }
42281f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    }
42291f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
4230f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown    void enqueueInputEvent(InputEvent event) {
4231f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown        enqueueInputEvent(event, null, 0, false);
4232f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown    }
4233f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown
42344952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    void enqueueInputEvent(InputEvent event,
4235f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown            InputEventReceiver receiver, int flags, boolean processImmediately) {
423632cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        QueuedInputEvent q = obtainQueuedInputEvent(event, receiver, flags);
42374952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
42384952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (ViewDebug.DEBUG_LATENCY) {
42394952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mReceiveTimeNanos = System.nanoTime();
42404952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mDeliverTimeNanos = 0;
42414952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mDeliverPostImeTimeNanos = 0;
42424952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
42434952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
42444952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // Always enqueue the input event in order, regardless of its time stamp.
42454952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // We do this because the application or the IME may inject key events
42464952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // in response to touch events and we want to ensure that the injected keys
42474952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // are processed in the order they were received and we cannot trust that
42484952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // the time stamp of injected events are monotonic.
42494952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        QueuedInputEvent last = mFirstPendingInputEvent;
42504952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (last == null) {
42514952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mFirstPendingInputEvent = q;
42521f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        } else {
42534952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            while (last.mNext != null) {
42544952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                last = last.mNext;
42551f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase            }
42564952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            last.mNext = q;
42571f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase        }
42584952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
4259f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown        if (processImmediately) {
4260f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown            doProcessInputEvents();
4261f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown        } else {
4262f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown            scheduleProcessInputEvents();
4263f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown        }
42641f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase    }
42651f4786bbe1ed7ae54b94cd52c0e1a4a826fecd68Chet Haase
42664952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void scheduleProcessInputEvents() {
426796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (!mProcessInputEventsScheduled) {
426896e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mProcessInputEventsScheduled = true;
4269ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            Message msg = mHandler.obtainMessage(MSG_PROCESS_INPUT_EVENTS);
4270ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            msg.setAsynchronous(true);
4271ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mHandler.sendMessage(msg);
42724952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
427392ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown    }
427492ff1dd8359889f5876f8a222c5d923071e66dbdJeff Brown
4275ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    void doProcessInputEvents() {
42764952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        while (mCurrentInputEvent == null && mFirstPendingInputEvent != null) {
42774952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            QueuedInputEvent q = mFirstPendingInputEvent;
42784952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mFirstPendingInputEvent = q.mNext;
42794952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            q.mNext = null;
42804952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            mCurrentInputEvent = q;
42814952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            deliverInputEvent(q);
42824952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
4283812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
42844952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // We are done processing all input events that we can process right now
42854952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        // so we can clear the pending flag immediately.
428696e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown        if (mProcessInputEventsScheduled) {
428796e942dabeeaaa9ab6df3a870668c6fe53d930daJeff Brown            mProcessInputEventsScheduled = false;
4288a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.removeMessages(MSG_PROCESS_INPUT_EVENTS);
42894952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
42904952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    }
42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42924952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    private void finishInputEvent(QueuedInputEvent q, boolean handled) {
42934952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (q != mCurrentInputEvent) {
42944952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            throw new IllegalStateException("finished input event out of order");
42959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42974952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (ViewDebug.DEBUG_LATENCY) {
42984952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            final long now = System.nanoTime();
42994952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            final long eventTime = q.mEvent.getEventTimeNano();
43004952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            final StringBuilder msg = new StringBuilder();
43014952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append("Spent ");
43024952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append((now - q.mReceiveTimeNanos) * 0.000001f);
43034952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append("ms processing ");
43044952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (q.mEvent instanceof KeyEvent) {
43054952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                final KeyEvent  keyEvent = (KeyEvent)q.mEvent;
43064952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append("key event, action=");
43074952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append(KeyEvent.actionToString(keyEvent.getAction()));
43084952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            } else {
43094952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                final MotionEvent motionEvent = (MotionEvent)q.mEvent;
43104952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append("motion event, action=");
43114952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append(MotionEvent.actionToString(motionEvent.getAction()));
43124952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append(", historySize=");
43134952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append(motionEvent.getHistorySize());
43144952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
43154952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append(", handled=");
43164952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append(handled);
43174952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append(", received at +");
43184952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append((q.mReceiveTimeNanos - eventTime) * 0.000001f);
43194952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (q.mDeliverTimeNanos != 0) {
43204952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append("ms, delivered at +");
43214952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append((q.mDeliverTimeNanos - eventTime) * 0.000001f);
43224952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
43234952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            if (q.mDeliverPostImeTimeNanos != 0) {
43244952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append("ms, delivered post IME at +");
43254952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                msg.append((q.mDeliverPostImeTimeNanos - eventTime) * 0.000001f);
43264952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            }
43274952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append("ms, finished at +");
43284952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append((now - eventTime) * 0.000001f);
43294952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            msg.append("ms.");
43304952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            Log.d(ViewDebug.DEBUG_LATENCY_TAG, msg.toString());
43314952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
433332cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        if (q.mReceiver != null) {
433432cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            q.mReceiver.finishInputEvent(q.mEvent, handled);
433592cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown        } else {
433692cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown            q.mEvent.recycleIfNeededAfterDispatch();
4337c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
43389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43394952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        recycleQueuedInputEvent(q);
43409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43414952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        mCurrentInputEvent = null;
43424952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        if (mFirstPendingInputEvent != null) {
43434952dfd16a0f839559ffa78f5016394caf85294fJeff Brown            scheduleProcessInputEvents();
43444952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
43459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4346cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
4347ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    void scheduleConsumeBatchedInput() {
4348ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        if (!mConsumeBatchedInputScheduled) {
4349ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mConsumeBatchedInputScheduled = true;
4350ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mChoreographer.postCallback(Choreographer.CALLBACK_INPUT,
4351ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                    mConsumedBatchedInputRunnable, null);
4352ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        }
4353ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    }
4354ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown
4355ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    void unscheduleConsumeBatchedInput() {
4356ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        if (mConsumeBatchedInputScheduled) {
4357ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mConsumeBatchedInputScheduled = false;
4358ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mChoreographer.removeCallbacks(Choreographer.CALLBACK_INPUT,
4359ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                    mConsumedBatchedInputRunnable, null);
4360ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        }
4361ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    }
4362ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown
4363771526c88f5cc4b56a41cb12aa06a28d377a07d5Jeff Brown    void doConsumeBatchedInput(long frameTimeNanos) {
4364ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        if (mConsumeBatchedInputScheduled) {
4365ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            mConsumeBatchedInputScheduled = false;
4366330314c6fb7c178c0f0da65d6aa8c9e7d3004568Jeff Brown            if (mInputEventReceiver != null) {
4367771526c88f5cc4b56a41cb12aa06a28d377a07d5Jeff Brown                mInputEventReceiver.consumeBatchedInputEvents(frameTimeNanos);
4368ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            }
4369330314c6fb7c178c0f0da65d6aa8c9e7d3004568Jeff Brown            doProcessInputEvents();
4370ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        }
4371ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    }
4372ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown
4373ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    final class TraversalRunnable implements Runnable {
43744a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        @Override
43754a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        public void run() {
4376ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            doTraversal();
43774a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown        }
43784a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown    }
4379ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    final TraversalRunnable mTraversalRunnable = new TraversalRunnable();
43804a06c8008b2edd6677f9a411af79b0a4971b87feJeff Brown
438132cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown    final class WindowInputEventReceiver extends InputEventReceiver {
438232cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        public WindowInputEventReceiver(InputChannel inputChannel, Looper looper) {
438332cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown            super(inputChannel, looper);
43844952dfd16a0f839559ffa78f5016394caf85294fJeff Brown        }
438532cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown
438632cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        @Override
438732cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        public void onInputEvent(InputEvent event) {
4388f9261d20b3773f9785d98f32f62ccfedefba8083Jeff Brown            enqueueInputEvent(event, this, 0, true);
438932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        }
4390072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown
4391072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        @Override
4392072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        public void onBatchedInputEventPending() {
4393ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            scheduleConsumeBatchedInput();
4394ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        }
4395ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown
4396ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        @Override
4397ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        public void dispose() {
4398ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            unscheduleConsumeBatchedInput();
4399ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            super.dispose();
4400072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown        }
440132cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown    }
440232cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown    WindowInputEventReceiver mInputEventReceiver;
44034952dfd16a0f839559ffa78f5016394caf85294fJeff Brown
4404ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    final class ConsumeBatchedInputRunnable implements Runnable {
4405ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        @Override
4406ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        public void run() {
4407771526c88f5cc4b56a41cb12aa06a28d377a07d5Jeff Brown            doConsumeBatchedInput(mChoreographer.getFrameTimeNanos());
4408ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown        }
4409ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    }
4410ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    final ConsumeBatchedInputRunnable mConsumedBatchedInputRunnable =
4411ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown            new ConsumeBatchedInputRunnable();
4412ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown    boolean mConsumeBatchedInputScheduled;
4413ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown
44146cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    final class InvalidateOnAnimationRunnable implements Runnable {
44156cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private boolean mPosted;
44166cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private ArrayList<View> mViews = new ArrayList<View>();
44176cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private ArrayList<AttachInfo.InvalidateInfo> mViewRects =
44186cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                new ArrayList<AttachInfo.InvalidateInfo>();
44196cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private View[] mTempViews;
44206cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private AttachInfo.InvalidateInfo[] mTempViewRects;
44216cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
44226cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        public void addView(View view) {
44236cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            synchronized (this) {
44246cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mViews.add(view);
44256cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                postIfNeededLocked();
44266cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
44276cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        }
44286cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
44296cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        public void addViewRect(AttachInfo.InvalidateInfo info) {
44306cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            synchronized (this) {
44316cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mViewRects.add(info);
44326cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                postIfNeededLocked();
44336cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
44346cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        }
44356cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
44366cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        public void removeView(View view) {
44376cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            synchronized (this) {
44386cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mViews.remove(view);
44396cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
44406cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                for (int i = mViewRects.size(); i-- > 0; ) {
44416cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    AttachInfo.InvalidateInfo info = mViewRects.get(i);
44426cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    if (info.target == view) {
44436cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                        mViewRects.remove(i);
44446cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                        info.release();
44456cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    }
44466cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                }
44476cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
44486cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                if (mPosted && mViews.isEmpty() && mViewRects.isEmpty()) {
4449ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                    mChoreographer.removeCallbacks(Choreographer.CALLBACK_ANIMATION, this, null);
44506cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    mPosted = false;
44516cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                }
44526cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
44536cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        }
44546cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
44556cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        @Override
44566cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        public void run() {
44576cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            final int viewCount;
44586cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            final int viewRectCount;
44596cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            synchronized (this) {
44606cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mPosted = false;
44616cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
44626cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                viewCount = mViews.size();
44636cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                if (viewCount != 0) {
44646cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    mTempViews = mViews.toArray(mTempViews != null
44656cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                            ? mTempViews : new View[viewCount]);
44666cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    mViews.clear();
44676cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                }
44686cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
44696cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                viewRectCount = mViewRects.size();
44706cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                if (viewRectCount != 0) {
44716cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    mTempViewRects = mViewRects.toArray(mTempViewRects != null
44726cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                            ? mTempViewRects : new AttachInfo.InvalidateInfo[viewRectCount]);
44736cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                    mViewRects.clear();
44746cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                }
44756cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
44766cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
44776cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            for (int i = 0; i < viewCount; i++) {
44786cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mTempViews[i].invalidate();
44793e3c4ee0475ad7096201a5f00f2e9be22fb891ddAdam Powell                mTempViews[i] = null;
44806cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
44816cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
44826cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            for (int i = 0; i < viewRectCount; i++) {
44836cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                final View.AttachInfo.InvalidateInfo info = mTempViewRects[i];
44846cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                info.target.invalidate(info.left, info.top, info.right, info.bottom);
44856cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                info.release();
44866cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
44876cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        }
44886cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
44896cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        private void postIfNeededLocked() {
44906cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            if (!mPosted) {
4491ebb2d8d708c5c58c79ae88ac2bd10450a856f702Jeff Brown                mChoreographer.postCallback(Choreographer.CALLBACK_ANIMATION, this, null);
44926cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown                mPosted = true;
44936cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            }
44946cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        }
44956cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    }
44966cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    final InvalidateOnAnimationRunnable mInvalidateOnAnimationRunnable =
44976cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown            new InvalidateOnAnimationRunnable();
44986cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
4499a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    public void dispatchInvalidateDelayed(View view, long delayMilliseconds) {
4500a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_INVALIDATE, view);
4501a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessageDelayed(msg, delayMilliseconds);
4502a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    }
4503a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
4504a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    public void dispatchInvalidateRectDelayed(AttachInfo.InvalidateInfo info,
4505a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            long delayMilliseconds) {
4506a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        final Message msg = mHandler.obtainMessage(MSG_INVALIDATE_RECT, info);
4507a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessageDelayed(msg, delayMilliseconds);
4508a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    }
4509a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
45106cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    public void dispatchInvalidateOnAnimation(View view) {
45116cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        mInvalidateOnAnimationRunnable.addView(view);
45126cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    }
45136cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
45146cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    public void dispatchInvalidateRectOnAnimation(AttachInfo.InvalidateInfo info) {
45156cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        mInvalidateOnAnimationRunnable.addViewRect(info);
45166cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    }
45176cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
45182a0f228a30c85a124f92a5a7c1b10a81cf69af6dRomain Guy    public void enqueueDisplayList(DisplayList displayList) {
451951e4d4db296c252641161b39e98f49acebc46062Romain Guy        mDisplayLists.add(displayList);
452051e4d4db296c252641161b39e98f49acebc46062Romain Guy
452151e4d4db296c252641161b39e98f49acebc46062Romain Guy        mHandler.removeMessages(MSG_INVALIDATE_DISPLAY_LIST);
452251e4d4db296c252641161b39e98f49acebc46062Romain Guy        Message msg = mHandler.obtainMessage(MSG_INVALIDATE_DISPLAY_LIST);
452351e4d4db296c252641161b39e98f49acebc46062Romain Guy        mHandler.sendMessage(msg);
452451e4d4db296c252641161b39e98f49acebc46062Romain Guy    }
45252a0f228a30c85a124f92a5a7c1b10a81cf69af6dRomain Guy
45262a0f228a30c85a124f92a5a7c1b10a81cf69af6dRomain Guy    public void dequeueDisplayList(DisplayList displayList) {
45272a0f228a30c85a124f92a5a7c1b10a81cf69af6dRomain Guy        if (mDisplayLists.remove(displayList)) {
45282a0f228a30c85a124f92a5a7c1b10a81cf69af6dRomain Guy            displayList.invalidate();
45292a0f228a30c85a124f92a5a7c1b10a81cf69af6dRomain Guy            if (mDisplayLists.size() == 0) {
45302a0f228a30c85a124f92a5a7c1b10a81cf69af6dRomain Guy                mHandler.removeMessages(MSG_INVALIDATE_DISPLAY_LIST);
45312a0f228a30c85a124f92a5a7c1b10a81cf69af6dRomain Guy            }
45322a0f228a30c85a124f92a5a7c1b10a81cf69af6dRomain Guy        }
45332a0f228a30c85a124f92a5a7c1b10a81cf69af6dRomain Guy    }
45342a0f228a30c85a124f92a5a7c1b10a81cf69af6dRomain Guy
45356cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    public void cancelInvalidate(View view) {
45366cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        mHandler.removeMessages(MSG_INVALIDATE, view);
45376cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        // fixme: might leak the AttachInfo.InvalidateInfo objects instead of returning
45386cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        // them to the pool
45396cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        mHandler.removeMessages(MSG_INVALIDATE_RECT, view);
45406cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown        mInvalidateOnAnimationRunnable.removeView(view);
45416cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown    }
45426cb7b46c56449e84434b11eb12f9b8977fcd0398Jeff Brown
45434952dfd16a0f839559ffa78f5016394caf85294fJeff Brown    public void dispatchKey(KeyEvent event) {
4544a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_DISPATCH_KEY, event);
4545e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown        msg.setAsynchronous(true);
4546a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
4547a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    }
4548a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
4549a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    public void dispatchKeyFromIme(KeyEvent event) {
4550a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_DISPATCH_KEY_FROM_IME, event);
4551e0dbd002750856e55d637e883b629e09adfc8a4eJeff Brown        msg.setAsynchronous(true);
4552a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
4553cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    }
4554cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
4555d6b1098e1f46530528dfea415655468ec994bbb6John Reck    public void dispatchUnhandledKey(KeyEvent event) {
4556d6b1098e1f46530528dfea415655468ec994bbb6John Reck        if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
4557d6b1098e1f46530528dfea415655468ec994bbb6John Reck            final KeyCharacterMap kcm = event.getKeyCharacterMap();
4558d6b1098e1f46530528dfea415655468ec994bbb6John Reck            final int keyCode = event.getKeyCode();
4559d6b1098e1f46530528dfea415655468ec994bbb6John Reck            final int metaState = event.getMetaState();
4560d6b1098e1f46530528dfea415655468ec994bbb6John Reck
4561fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown            // Check for fallback actions specified by the key character map.
4562fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown            KeyCharacterMap.FallbackAction fallbackAction =
4563fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                    kcm.getFallbackAction(keyCode, metaState);
4564fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown            if (fallbackAction != null) {
4565fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                final int flags = event.getFlags() | KeyEvent.FLAG_FALLBACK;
4566fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                KeyEvent fallbackEvent = KeyEvent.obtain(
4567fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        event.getDownTime(), event.getEventTime(),
4568fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        event.getAction(), fallbackAction.keyCode,
4569fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        event.getRepeatCount(), fallbackAction.metaState,
4570fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        event.getDeviceId(), event.getScanCode(),
4571fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                        flags, event.getSource(), null);
4572fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown                fallbackAction.recycle();
4573fd23e3ed976b22b9a92ddb2cb3a46f9d2a0ce23fJeff Brown
4574d6b1098e1f46530528dfea415655468ec994bbb6John Reck                dispatchKey(fallbackEvent);
4575d6b1098e1f46530528dfea415655468ec994bbb6John Reck            }
4576d6b1098e1f46530528dfea415655468ec994bbb6John Reck        }
4577d6b1098e1f46530528dfea415655468ec994bbb6John Reck    }
4578d6b1098e1f46530528dfea415655468ec994bbb6John Reck
45799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchAppVisibility(boolean visible) {
4580a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_DISPATCH_APP_VISIBILITY);
45819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = visible ? 1 : 0;
4582a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
45839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4585bb9908b828a8cfd5965553be66faa6af89973697Romain Guy    public void dispatchScreenStateChange(boolean on) {
4586bb9908b828a8cfd5965553be66faa6af89973697Romain Guy        Message msg = mHandler.obtainMessage(MSG_DISPATCH_SCREEN_STATE);
45877e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        msg.arg1 = on ? 1 : 0;
45887e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        mHandler.sendMessage(msg);
45897e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy    }
45907e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy
45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchGetNewSurface() {
4592a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(MSG_DISPATCH_GET_NEW_SURFACE);
4593a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) {
45979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = Message.obtain();
4598a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        msg.what = MSG_WINDOW_FOCUS_CHANGED;
45999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = hasFocus ? 1 : 0;
46009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg2 = inTouchMode ? 1 : 0;
4601a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
46029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4604ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    public void dispatchCloseSystemDialogs(String reason) {
4605ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        Message msg = Message.obtain();
4606a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        msg.what = MSG_CLOSE_SYSTEM_DIALOGS;
4607ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        msg.obj = reason;
4608a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
4609ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    }
4610a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
4611a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    public void dispatchDragEvent(DragEvent event) {
461291e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        final int what;
461391e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        if (event.getAction() == DragEvent.ACTION_DRAG_LOCATION) {
4614a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            what = MSG_DISPATCH_DRAG_LOCATION_EVENT;
4615a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.removeMessages(what);
461691e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        } else {
4617a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            what = MSG_DISPATCH_DRAG_EVENT;
461891e9bb3b468f0d5efccdb245d151cbcda1583386Chris Tate        }
4619a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        Message msg = mHandler.obtainMessage(what, event);
4620a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(msg);
4621a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate    }
4622a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
46239a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn    public void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility,
46249a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn            int localValue, int localChanges) {
46259a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        SystemUiVisibilityInfo args = new SystemUiVisibilityInfo();
46269a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.seq = seq;
46279a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.globalVisibility = globalVisibility;
46289a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.localValue = localValue;
46299a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        args.localChanges = localChanges;
4630a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        mHandler.sendMessage(mHandler.obtainMessage(MSG_DISPATCH_SYSTEM_UI_VISIBILITY, args));
4631a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    }
4632a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown
463312d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn    public void dispatchDoneAnimating() {
463412d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn        mHandler.sendEmptyMessage(MSG_DISPATCH_DONE_ANIMATING);
463512d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn    }
463612d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn
4637a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown    public void dispatchCheckFocus() {
4638a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        if (!mHandler.hasMessages(MSG_CHECK_FOCUS)) {
4639a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            // This will result in a call to checkFocus() below.
4640a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.sendEmptyMessage(MSG_CHECK_FOCUS);
4641a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown        }
4642664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    }
4643664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
464475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
4645eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * Post a callback to send a
4646eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * {@link AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED} event.
4647a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov     * This event is send at most once every
4648a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov     * {@link ViewConfiguration#getSendRecurringAccessibilityEventsInterval()}.
4649eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     */
46504213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    private void postSendWindowContentChangedCallback(View source) {
4651a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        if (mSendWindowContentChangedAccessibilityEvent == null) {
4652a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov            mSendWindowContentChangedAccessibilityEvent =
4653a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov                new SendWindowContentChangedAccessibilityEvent();
4654a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        }
46554213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        View oldSource = mSendWindowContentChangedAccessibilityEvent.mSource;
46564213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        if (oldSource == null) {
46574213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            mSendWindowContentChangedAccessibilityEvent.mSource = source;
4658a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.postDelayed(mSendWindowContentChangedAccessibilityEvent,
4659a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov                    ViewConfiguration.getSendRecurringAccessibilityEventsInterval());
46604213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        } else {
4661ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy            mSendWindowContentChangedAccessibilityEvent.mSource =
4662ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy                    getCommonPredecessor(oldSource, source);
4663eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
4664eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
4665eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
4666eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    /**
4667eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * Remove a posted callback to send a
4668eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * {@link AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED} event.
4669eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     */
4670eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    private void removeSendWindowContentChangedCallback() {
4671a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov        if (mSendWindowContentChangedAccessibilityEvent != null) {
4672a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown            mHandler.removeCallbacks(mSendWindowContentChangedAccessibilityEvent);
4673eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
4674eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
4675eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
46769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean showContextMenuForChild(View originalView) {
46779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
46789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46806e34636749217654f43221885afb7a29bb5ca96aAdam Powell    public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) {
46816e34636749217654f43221885afb7a29bb5ca96aAdam Powell        return null;
46826e34636749217654f43221885afb7a29bb5ca96aAdam Powell    }
46836e34636749217654f43221885afb7a29bb5ca96aAdam Powell
46849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void createContextMenu(ContextMenu menu) {
46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void childDrawableStateChanged(View child) {
46889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4690736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public boolean requestSendAccessibilityEvent(View child, AccessibilityEvent event) {
4691736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        if (mView == null) {
4692736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            return false;
4693736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        }
4694791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        // Watch for accessibility focus change events from virtual nodes
4695791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        // to keep track of accessibility focus being on a virtual node.
4696791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        final int eventType = event.getEventType();
4697791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        switch (eventType) {
4698791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: {
4699791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                final long sourceId = event.getSourceNodeId();
4700791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                // If the event is not from a virtual node we are not interested.
4701791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                final int virtualViewId = AccessibilityNodeInfo.getVirtualDescendantId(sourceId);
4702791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                if (virtualViewId == AccessibilityNodeInfo.UNDEFINED) {
4703791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                    break;
4704791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                }
4705791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                final int realViewId = AccessibilityNodeInfo.getAccessibilityViewId(sourceId);
4706791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                View focusHost = mView.findViewByAccessibilityId(realViewId);
4707791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                setAccessibilityFocusedHost(focusHost);
4708791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            } break;
4709791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED: {
4710791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                final long sourceId = event.getSourceNodeId();
4711791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                // If the event is not from a virtual node we are not interested.
4712791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                final int virtualViewId = AccessibilityNodeInfo.getVirtualDescendantId(sourceId);
4713791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                if (virtualViewId == AccessibilityNodeInfo.UNDEFINED) {
4714791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                    break;
4715791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                }
4716791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov                setAccessibilityFocusedHost(null);
4717791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov            } break;
4718791fd31a68c59395952005886ba799169f80a29aSvetoslav Ganov        }
47198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mAccessibilityManager.sendAccessibilityEvent(event);
4720736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        return true;
4721736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    }
4722736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
47234213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    @Override
47244213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    public void childAccessibilityStateChanged(View child) {
47254213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        postSendWindowContentChangedCallback(child);
47264213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    }
47274213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
47284213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    private View getCommonPredecessor(View first, View second) {
47294213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        if (mAttachInfo != null) {
47304213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            if (mTempHashSet == null) {
47314213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                mTempHashSet = new HashSet<View>();
47324213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            }
47334213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            HashSet<View> seen = mTempHashSet;
47344213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            seen.clear();
47354213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            View firstCurrent = first;
47364213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            while (firstCurrent != null) {
47374213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                seen.add(firstCurrent);
47384213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                ViewParent firstCurrentParent = firstCurrent.mParent;
47394213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                if (firstCurrentParent instanceof View) {
47404213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    firstCurrent = (View) firstCurrentParent;
47414213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                } else {
47424213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    firstCurrent = null;
47434213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                }
47444213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            }
47454213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            View secondCurrent = second;
47464213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            while (secondCurrent != null) {
47474213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                if (seen.contains(secondCurrent)) {
47484213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    seen.clear();
47494213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    return secondCurrent;
47504213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                }
47514213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                ViewParent secondCurrentParent = secondCurrent.mParent;
47524213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                if (secondCurrentParent instanceof View) {
47534213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    secondCurrent = (View) secondCurrentParent;
47544213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                } else {
47554213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    secondCurrent = null;
47564213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                }
47574213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            }
47584213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            seen.clear();
47594213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        }
47604213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        return null;
47614213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    }
47624213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
47639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void checkThread() {
47649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mThread != Thread.currentThread()) {
47659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new CalledFromWrongThreadException(
47669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "Only the original thread that created a view hierarchy can touch its views.");
47679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
4771c6cc0f8c19d9eccf408a443fa2bf668af261dcd0Joe Onorato        // ViewAncestor never intercepts touch event, so this can be a no-op
47729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean requestChildRectangleOnScreen(View child, Rect rectangle,
47759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean immediate) {
47769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return scrollToRectOrFocus(rectangle, immediate);
47779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47788506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
4779539ee8716b4f81260bab2e9f3dc5d88d81c99985Adam Powell    public void childHasTransientStateChanged(View child, boolean hasTransientState) {
4780539ee8716b4f81260bab2e9f3dc5d88d81c99985Adam Powell        // Do nothing.
4781539ee8716b4f81260bab2e9f3dc5d88d81c99985Adam Powell    }
4782539ee8716b4f81260bab2e9f3dc5d88d81c99985Adam Powell
4783dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    class TakenSurfaceHolder extends BaseSurfaceHolder {
4784dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4785dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public boolean onAllowLockCanvas() {
4786dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return mDrawingAllowed;
4787dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4788dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4789dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4790dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void onRelayoutContainer() {
4791dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // Not currently interesting -- from changing between fixed and layout size.
4792dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4793dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4794dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setFormat(int format) {
4795dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceFormat(format);
4796dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4797dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4798dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setType(int type) {
4799dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceType(type);
4800dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4801dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4802dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4803dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void onUpdateSurface() {
4804dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            // We take care of format and type changes on our own.
4805dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            throw new IllegalStateException("Shouldn't be here");
4806dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4807dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4808dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public boolean isCreating() {
4809dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            return mIsCreating;
4810dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4811dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4812dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        @Override
4813dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setFixedSize(int width, int height) {
4814dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            throw new UnsupportedOperationException(
4815dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn                    "Currently only support sizing from layout");
4816dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4817dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
4818dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        public void setKeepScreenOn(boolean screenOn) {
4819dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn            ((RootViewSurfaceTaker)mView).setSurfaceKeepScreenOn(screenOn);
4820dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn        }
4821dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn    }
4822dc8a7f69d7df5f1ca29763995a0d55acf7936fc6Dianne Hackborn
48239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class InputMethodCallback extends IInputMethodCallback.Stub {
48246dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        private WeakReference<ViewRootImpl> mViewAncestor;
48259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48266dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        public InputMethodCallback(ViewRootImpl viewAncestor) {
48276dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor);
48289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48298506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
48309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void finishedEvent(int seq, boolean handled) {
48316dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
48328643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
48334952dfd16a0f839559ffa78f5016394caf85294fJeff Brown                viewAncestor.dispatchImeFinishedEvent(seq, handled);
48349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void sessionCreated(IInputMethodSession session) {
48389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Stub -- not for use in the client.
48399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48418506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
48429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class W extends IWindow.Stub {
48436dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        private final WeakReference<ViewRootImpl> mViewAncestor;
48449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48456dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn        W(ViewRootImpl viewAncestor) {
48466dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor);
48479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
484985afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn        public void resized(int w, int h, Rect contentInsets,
48505c58de3a523a384c47b0b1e0f5dd9728a74cd9f7Dianne Hackborn                Rect visibleInsets, boolean reportDraw, Configuration newConfig) {
48516dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
48528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
485385afd1b6f871d471fdff1980134676a5f1690525Dianne Hackborn                viewAncestor.dispatchResized(w, h, contentInsets,
48543556c9a8068497d0de8964fd3be719c68eae1f00Dianne Hackborn                        visibleInsets, reportDraw, newConfig);
48559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void dispatchAppVisibility(boolean visible) {
48596dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
48608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
48618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchAppVisibility(visible);
48629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4865bb9908b828a8cfd5965553be66faa6af89973697Romain Guy        public void dispatchScreenState(boolean on) {
48667e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            final ViewRootImpl viewAncestor = mViewAncestor.get();
48677e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            if (viewAncestor != null) {
4868bb9908b828a8cfd5965553be66faa6af89973697Romain Guy                viewAncestor.dispatchScreenStateChange(on);
48697e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy            }
48707e4e561bc717a6eea4e0d06ec4173ad27420425fRomain Guy        }
4871bb9908b828a8cfd5965553be66faa6af89973697Romain Guy
48729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void dispatchGetNewSurface() {
48736dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
48748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
48758643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchGetNewSurface();
48769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) {
48806dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
48818643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
48828643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.windowFocusChanged(hasFocus, inTouchMode);
48839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static int checkCallingPermission(String permission) {
48879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
48889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ActivityManagerNative.getDefault().checkPermission(
48899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        permission, Binder.getCallingPid(), Binder.getCallingUid());
48909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
48919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return PackageManager.PERMISSION_DENIED;
48929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void executeCommand(String command, String parameters, ParcelFileDescriptor out) {
48966dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
48978643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
48988643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                final View view = viewAncestor.mView;
48999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (view != null) {
49009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (checkCallingPermission(Manifest.permission.DUMP) !=
49019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            PackageManager.PERMISSION_GRANTED) {
49029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        throw new SecurityException("Insufficient permissions to invoke"
49039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " executeCommand() from pid=" + Binder.getCallingPid()
49049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ", uid=" + Binder.getCallingUid());
49059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
49069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    OutputStream clientStream = null;
49089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
49099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        clientStream = new ParcelFileDescriptor.AutoCloseOutputStream(out);
49109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ViewDebug.dispatchCommand(view, command, parameters, clientStream);
49119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException e) {
49129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        e.printStackTrace();
49139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } finally {
49149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (clientStream != null) {
49159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            try {
49169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                clientStream.close();
49179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } catch (IOException e) {
49189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                e.printStackTrace();
49199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
49209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
49219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
49229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
49239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
492572c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn
4926ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        public void closeSystemDialogs(String reason) {
49276dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
49288643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
49298643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchCloseSystemDialogs(reason);
4930ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            }
4931ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
4932ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn
4933bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen        public void dispatchWallpaperOffsets(float x, float y, float xStep, float yStep,
4934bf6956b1d95442e9d9c483894d578fe6b7044cbbMarco Nelissen                boolean sync) {
493519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            if (sync) {
493619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                try {
493719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                    sWindowSession.wallpaperOffsetsComplete(asBinder());
493819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                } catch (RemoteException e) {
49397580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                }
49407580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            }
49417580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        }
49428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
49437580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn        public void dispatchWallpaperCommand(String action, int x, int y,
49447580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                int z, Bundle extras, boolean sync) {
49457580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn            if (sync) {
49467580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                try {
49477580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                    sWindowSession.wallpaperCommandComplete(asBinder(), null);
49487580493b014a2c7ea883cd291255798dc72ebbffDianne Hackborn                } catch (RemoteException e) {
494919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn                }
495019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn            }
495172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn        }
4952a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate
4953a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        /* Drag/drop */
4954a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        public void dispatchDragEvent(DragEvent event) {
49556dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
49568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
49578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                viewAncestor.dispatchDragEvent(event);
4958a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate            }
4959a53146c5569f8ff5f7eb55e9ad35d23ddacf2addChristopher Tate        }
4960664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato
49619a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn        public void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility,
49629a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                int localValue, int localChanges) {
49636dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
49648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (viewAncestor != null) {
49659a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                viewAncestor.dispatchSystemUiVisibilityChanged(seq, globalVisibility,
49669a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn                        localValue, localChanges);
4967664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            }
4968664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato        }
496912d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn
497012d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn        public void doneAnimating() {
497112d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            final ViewRootImpl viewAncestor = mViewAncestor.get();
497212d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            if (viewAncestor != null) {
497312d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn                viewAncestor.dispatchDoneAnimating();
497412d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn            }
497512d3a94397c33fdb773a1eaaaa13cab80bf0c571Dianne Hackborn        }
49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
49799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Maintains state information for a single trackball axis, generating
49809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * discrete (DPAD) movements based on raw trackball motion.
49819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
49829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final class TrackballAxis {
49839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
49849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum amount of acceleration we will apply.
49859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
49869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final float MAX_ACCELERATION = 20;
49878506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
49889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
49899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The maximum amount of time (in milliseconds) between events in order
49909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for us to consider the user to be doing fast trackball movements,
49919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * and thus apply an acceleration.
49929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
49939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final long FAST_MOVE_TIME = 150;
49948506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
49959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
49969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Scaling factor to the time (in milliseconds) between events to how
49979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * much to multiple/divide the current acceleration.  When movement
49989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * is < FAST_MOVE_TIME this multiplies the acceleration; when >
49999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * FAST_MOVE_TIME it divides it.
50009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
50019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final float ACCEL_MOVE_SCALING_FACTOR = (1.0f/40);
50028506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
50039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float position;
50049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float absPosition;
50059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float acceleration = 1;
50069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long lastMoveTime = 0;
50079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int step;
50089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int dir;
50099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int nonAccelMovement;
50109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void reset(int _step) {
50129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            position = 0;
50139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            acceleration = 1;
50149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lastMoveTime = 0;
50159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            step = _step;
50169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dir = 0;
50179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
50209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Add trackball movement into the state.  If the direction of movement
50219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * has been reversed, the state is reset before adding the
50229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * movement (so that you don't have to compensate for any previously
50239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * collected movement before see the result of the movement in the
50249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * new direction).
50259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
50269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Returns the absolute value of the amount of movement
50279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * collected so far.
50289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
50299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float collect(float off, long time, String axis) {
50309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long normTime;
50319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (off > 0) {
50329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = (long)(off * FAST_MOVE_TIME);
50339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (dir < 0) {
50349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " reversed to positive!");
50359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    position = 0;
50369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    step = 0;
50379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = 1;
50389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastMoveTime = 0;
50399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
50409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = 1;
50419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (off < 0) {
50429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = (long)((-off) * FAST_MOVE_TIME);
50439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (dir > 0) {
50449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " reversed to negative!");
50459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    position = 0;
50469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    step = 0;
50479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = 1;
50489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    lastMoveTime = 0;
50499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
50509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dir = -1;
50519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
50529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normTime = 0;
50539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
50548506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
50559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The number of milliseconds between each movement that is
50569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // considered "normal" and will not result in any acceleration
50579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // or deceleration, scaled by the offset we have here.
50589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (normTime > 0) {
50599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long delta = time - lastMoveTime;
50609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lastMoveTime = time;
50619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float acc = acceleration;
50629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (delta < normTime) {
50639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // The user is scrolling rapidly, so increase acceleration.
50649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float scale = (normTime-delta) * ACCEL_MOVE_SCALING_FACTOR;
50659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (scale > 1) acc *= scale;
50669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " accelerate: off="
50679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + off + " normTime=" + normTime + " delta=" + delta
50689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " scale=" + scale + " acc=" + acc);
50699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = acc < MAX_ACCELERATION ? acc : MAX_ACCELERATION;
50709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
50719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // The user is scrolling slowly, so decrease acceleration.
50729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float scale = (delta-normTime) * ACCEL_MOVE_SCALING_FACTOR;
50739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (scale > 1) acc /= scale;
50749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (DEBUG_TRACKBALL) Log.v(TAG, axis + " deccelerate: off="
50759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + off + " normTime=" + normTime + " delta=" + delta
50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " scale=" + scale + " acc=" + acc);
50779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    acceleration = acc > 1 ? acc : 1;
50789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
50799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
50809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            position += off;
50819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (absPosition = Math.abs(position));
50829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
50859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Generate the number of discrete movement events appropriate for
50869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the currently collected trackball movement.
50879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
50889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param precision The minimum movement required to generate the
50899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * first discrete movement.
50909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
50919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return Returns the number of discrete movements, either positive
50929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * or negative, or 0 if there is not enough trackball movement yet
50939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for a discrete movement.
50949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
50959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int generate(float precision) {
50969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int movement = 0;
50979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            nonAccelMovement = 0;
50989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            do {
50999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int dir = position >= 0 ? 1 : -1;
51009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (step) {
51019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we are going to execute the first step, then we want
51029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to do this as soon as possible instead of waiting for
51039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // a full movement, in order to make things look responsive.
51049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case 0:
51059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < precision) {
51069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
51079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
51089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
51099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        nonAccelMovement += dir;
51109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        step = 1;
51119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
51129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If we have generated the first movement, then we need
51139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to wait for the second complete trackball motion before
51149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // generating the second discrete movement.
51159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case 1:
51169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < 2) {
51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
51189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
51209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        nonAccelMovement += dir;
51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        position += dir > 0 ? -2 : 2;
51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        absPosition = Math.abs(position);
51239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        step = 2;
51249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
51259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // After the first two, we generate discrete movements
51269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // consistently with the trackball, applying an acceleration
51279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // if the trackball is moving quickly.  This is a simple
51289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // acceleration on top of what we already compute based
51299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // on how quickly the wheel is being turned, to apply
51309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // a longer increasing acceleration to continuous movement
51319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // in one direction.
51329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    default:
51339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (absPosition < 1) {
51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            return movement;
51359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
51369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        movement += dir;
51379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        position += dir >= 0 ? -1 : 1;
51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        absPosition = Math.abs(position);
51399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        float acc = acceleration;
51409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        acc *= 1.1f;
51419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        acceleration = acc < MAX_ACCELERATION ? acc : acceleration;
51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
51439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } while (true);
51459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class CalledFromWrongThreadException extends AndroidRuntimeException {
51499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CalledFromWrongThreadException(String msg) {
51509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(msg);
51519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SurfaceHolder mHolder = new SurfaceHolder() {
51559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // we only need a SurfaceHolder for opengl. it would be nice
51569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to implement everything else though, especially the callback
51579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // support (opengl doesn't make use of it right now, but eventually
51589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // will).
51599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Surface getSurface() {
51609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSurface;
51619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isCreating() {
51649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
51659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void addCallback(Callback callback) {
51689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void removeCallback(Callback callback) {
51719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setFixedSize(int width, int height) {
51749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setSizeFromLayout() {
51779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setFormat(int format) {
51809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setType(int type) {
51839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setKeepScreenOn(boolean screenOn) {
51869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Canvas lockCanvas() {
51899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
51909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Canvas lockCanvas(Rect dirty) {
51939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
51949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unlockCanvasAndPost(Canvas canvas) {
51979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Rect getSurfaceFrame() {
51999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
52009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
52029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static RunQueue getRunQueue() {
52049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        RunQueue rq = sRunQueues.get();
52059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rq != null) {
52069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return rq;
52079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        rq = new RunQueue();
52099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sRunQueues.set(rq);
52109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return rq;
52119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52128506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
52139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5214a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown     * The run queue is used to enqueue pending work from Views when no Handler is
5215a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown     * attached.  The work is executed during the next call to performTraversals on
5216a175a5b7ea3682cb58cca7f9726d0b8171cd549dJeff Brown     * the thread.
52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final class RunQueue {
52209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final ArrayList<HandlerAction> mActions = new ArrayList<HandlerAction>();
52219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void post(Runnable action) {
52239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            postDelayed(action, 0);
52249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void postDelayed(Runnable action, long delayMillis) {
52279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            HandlerAction handlerAction = new HandlerAction();
52289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.action = action;
52299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.delay = delayMillis;
52309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
52329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mActions.add(handlerAction);
52339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void removeCallbacks(Runnable action) {
52379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HandlerAction handlerAction = new HandlerAction();
52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handlerAction.action = action;
52399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
52419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ArrayList<HandlerAction> actions = mActions;
52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (actions.remove(handlerAction)) {
52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Keep going
52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void executeActions(Handler handler) {
52509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mActions) {
52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ArrayList<HandlerAction> actions = mActions;
52529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int count = actions.size();
52539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < count; i++) {
52559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final HandlerAction handlerAction = actions.get(i);
52569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    handler.postDelayed(handlerAction.action, handlerAction.delay);
52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
525915df6703f8bf3255eb7ba5c27e3518f60adc83f1Romain Guy                actions.clear();
52609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static class HandlerAction {
52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Runnable action;
52659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long delay;
52669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public boolean equals(Object o) {
52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (this == o) return true;
52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (o == null || getClass() != o.getClass()) return false;
52719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                HandlerAction that = (HandlerAction) o;
52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return !(action != null ? !action.equals(that.action) : that.action != null);
52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
52789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int hashCode() {
52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int result = action != null ? action.hashCode() : 0;
52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = 31 * result + (int) (delay ^ (delay >>> 32));
52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return result;
52829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52868643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
52878643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * Class for managing the accessibility interaction connection
52888643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * based on the global accessibility state.
52898643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
52908643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    final class AccessibilityInteractionConnectionManager
52918643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            implements AccessibilityStateChangeListener {
52928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void onAccessibilityStateChanged(boolean enabled) {
52938643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (enabled) {
52948643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                ensureConnection();
52950d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                if (mAttachInfo != null && mAttachInfo.mHasWindowFocus) {
52960d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
52970d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    View focusedView = mView.findFocus();
52980d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    if (focusedView != null && focusedView != mView) {
52990d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                        focusedView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
53000d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    }
53010d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                }
53028643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            } else {
53038643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                ensureNoConnection();
5304005b83b0c62d3d0538f0d566b08bd457015ec661Svetoslav Ganov                mHandler.obtainMessage(MSG_CLEAR_ACCESSIBILITY_FOCUS_HOST).sendToTarget();
53058643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
53068643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
53078643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
53088643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void ensureConnection() {
53090d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov            if (mAttachInfo != null) {
53100d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                final boolean registered =
53110d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    mAttachInfo.mAccessibilityWindowId != AccessibilityNodeInfo.UNDEFINED;
53120d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                if (!registered) {
53130d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                    mAttachInfo.mAccessibilityWindowId =
53140d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                        mAccessibilityManager.addAccessibilityInteractionConnection(mWindow,
53150d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                                new AccessibilityInteractionConnection(ViewRootImpl.this));
53160d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                }
53178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
53188643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
53198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
53208643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        public void ensureNoConnection() {
53210d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov            final boolean registered =
53220d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                mAttachInfo.mAccessibilityWindowId != AccessibilityNodeInfo.UNDEFINED;
53238643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            if (registered) {
53240d04e245534cf777dfaf16dce3c51553837c14ffSvetoslav Ganov                mAttachInfo.mAccessibilityWindowId = AccessibilityNodeInfo.UNDEFINED;
53258643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                mAccessibilityManager.removeAccessibilityInteractionConnection(mWindow);
53268643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
53278643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
53288643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
53298643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
53308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
53318643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * This class is an interface this ViewAncestor provides to the
53328643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * AccessibilityManagerService to the latter can interact with
53338643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * the view hierarchy in this ViewAncestor.
53348643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
5335af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov    static final class AccessibilityInteractionConnection
53368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            extends IAccessibilityInteractionConnection.Stub {
5337021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov        private final WeakReference<ViewRootImpl> mViewRootImpl;
53388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
5339f79f476fd1e25d3d7bf77e890d064a503537e939Svetoslav Ganov        AccessibilityInteractionConnection(ViewRootImpl viewRootImpl) {
5340f79f476fd1e25d3d7bf77e890d064a503537e939Svetoslav Ganov            mViewRootImpl = new WeakReference<ViewRootImpl>(viewRootImpl);
53418643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
53428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
53434213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        @Override
5344021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov        public void findAccessibilityNodeInfoByAccessibilityId(long accessibilityNodeId,
53458bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
53464213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                int flags, int interrogatingPid, long interrogatingTid) {
5347021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            ViewRootImpl viewRootImpl = mViewRootImpl.get();
5348021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            if (viewRootImpl != null && viewRootImpl.mView != null) {
5349af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
5350021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov                    .findAccessibilityNodeInfoByAccessibilityIdClientThread(accessibilityNodeId,
53514213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                        interactionId, callback, flags, interrogatingPid, interrogatingTid);
535279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            } else {
535379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                // We cannot make the call and notify the caller so it does not wait.
535479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                try {
535579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    callback.setFindAccessibilityNodeInfosResult(null, interactionId);
535679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                } catch (RemoteException re) {
535779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    /* best effort - ignore */
535879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                }
5359601ad8061cb8dcf3ab7385fa9e9dd13f15dc8eceSvetoslav Ganov            }
53608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
53618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
53624213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        @Override
5363021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov        public void performAccessibilityAction(long accessibilityNodeId, int action,
5364aa780c110922148a6a4ba06734bb2b0bb8c98f93Svetoslav Ganov                Bundle arguments, int interactionId,
5365aa780c110922148a6a4ba06734bb2b0bb8c98f93Svetoslav Ganov                IAccessibilityInteractionConnectionCallback callback, int flags,
5366aa780c110922148a6a4ba06734bb2b0bb8c98f93Svetoslav Ganov                int interogatingPid, long interrogatingTid) {
5367021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            ViewRootImpl viewRootImpl = mViewRootImpl.get();
5368021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            if (viewRootImpl != null && viewRootImpl.mView != null) {
5369af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
5370aa780c110922148a6a4ba06734bb2b0bb8c98f93Svetoslav Ganov                    .performAccessibilityActionClientThread(accessibilityNodeId, action, arguments,
53714213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            interactionId, callback, flags, interogatingPid, interrogatingTid);
537279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            } else {
53734213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                // We cannot make the call and notify the caller so it does not wait.
537479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                try {
537579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    callback.setPerformAccessibilityActionResult(false, interactionId);
537679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                } catch (RemoteException re) {
537779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    /* best effort - ignore */
537879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                }
53798643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
53808643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
53818643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
53824213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        @Override
538379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        public void findAccessibilityNodeInfoByViewId(long accessibilityNodeId, int viewId,
53848bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
53854213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                int flags, int interrogatingPid, long interrogatingTid) {
5386021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            ViewRootImpl viewRootImpl = mViewRootImpl.get();
5387021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            if (viewRootImpl != null && viewRootImpl.mView != null) {
5388af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
538979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    .findAccessibilityNodeInfoByViewIdClientThread(accessibilityNodeId, viewId,
53904213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            interactionId, callback, flags, interrogatingPid, interrogatingTid);
539179311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            } else {
53924213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                // We cannot make the call and notify the caller so it does not wait.
539379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                try {
539479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    callback.setFindAccessibilityNodeInfoResult(null, interactionId);
539579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                } catch (RemoteException re) {
539679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    /* best effort - ignore */
539779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                }
53988643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
53998643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
54008643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
54014213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        @Override
540279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        public void findAccessibilityNodeInfosByText(long accessibilityNodeId, String text,
54038bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov                int interactionId, IAccessibilityInteractionConnectionCallback callback,
54044213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                int flags, int interrogatingPid, long interrogatingTid) {
5405021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            ViewRootImpl viewRootImpl = mViewRootImpl.get();
5406021078554b902179442a345a9d080a165c3b5139Svetoslav Ganov            if (viewRootImpl != null && viewRootImpl.mView != null) {
5407af5b4f471df108ffbe1c3861d18b2141710d7bf8Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
540879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    .findAccessibilityNodeInfosByTextClientThread(accessibilityNodeId, text,
54094213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            interactionId, callback, flags, interrogatingPid, interrogatingTid);
541079311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            } else {
54114213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                // We cannot make the call and notify the caller so it does not wait.
541279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                try {
541379311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    callback.setFindAccessibilityNodeInfosResult(null, interactionId);
541479311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                } catch (RemoteException re) {
541579311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                    /* best effort - ignore */
541679311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                }
54178643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
54188643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
54198643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
54204213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        @Override
54214213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        public void findFocus(long accessibilityNodeId, int interactionId, int focusType,
54224213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                IAccessibilityInteractionConnectionCallback callback,  int flags,
542357c7fd5a43237afc5e8ef31a076e862c0c16c328Svetoslav Ganov                int interrogatingPid, long interrogatingTid) {
54244213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            ViewRootImpl viewRootImpl = mViewRootImpl.get();
54254213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            if (viewRootImpl != null && viewRootImpl.mView != null) {
54264213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
54274213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    .findFocusClientThread(accessibilityNodeId, interactionId, focusType,
54284213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            callback, flags, interrogatingPid, interrogatingTid);
54298bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            } else {
54304213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                // We cannot make the call and notify the caller so it does not wait.
54318643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                try {
54324213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    callback.setFindAccessibilityNodeInfoResult(null, interactionId);
54338643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                } catch (RemoteException re) {
54344213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    /* best effort - ignore */
54358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                }
54368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
54378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
54388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
54394213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        @Override
54404213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        public void focusSearch(long accessibilityNodeId, int interactionId, int direction,
54414213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                IAccessibilityInteractionConnectionCallback callback, int flags,
544279311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov                int interrogatingPid, long interrogatingTid) {
54434213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            ViewRootImpl viewRootImpl = mViewRootImpl.get();
54444213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            if (viewRootImpl != null && viewRootImpl.mView != null) {
54454213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                viewRootImpl.getAccessibilityInteractionController()
54464213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    .focusSearchClientThread(accessibilityNodeId, interactionId, direction,
54474213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                            callback, flags, interrogatingPid, interrogatingTid);
54488bd69610aafc6995126965d1d23b771fe02a9084Svetoslav Ganov            } else {
54494213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                // We cannot make the call and notify the caller so it does not wait.
54508dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                try {
54514213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    callback.setFindAccessibilityNodeInfoResult(null, interactionId);
54528dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                } catch (RemoteException re) {
54534213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                    /* best effort - ignore */
54548dffad68c7aa7da9a3d73d1ee41f3c4460f733b4Svetoslav Ganov                }
54558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
54568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
54578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
5458eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
5459a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov    private class SendWindowContentChangedAccessibilityEvent implements Runnable {
54604213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov        public View mSource;
5461a0156177cdc809795dd8bc5a19943dd2b6f82b66Svetoslav Ganov
5462eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        public void run() {
54634213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov            if (mSource != null) {
54644213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                mSource.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
54654213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                mSource.resetAccessibilityStateChanged();
54664213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov                mSource = null;
546779311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov            }
546879311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov        }
546979311c4af8b54d3cd47ab37a120c648bfc990511Svetoslav Ganov    }
54709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5471