diff options
| author | Svetoslav Ganov <svetoslavganov@google.com> | 2012-08-06 16:40:27 -0700 |
|---|---|---|
| committer | Svetoslav Ganov <svetoslavganov@google.com> | 2012-08-06 23:49:38 -0700 |
| commit | 758143ecfedbe08cc6c4fed0ad8ad7a854194ca4 (patch) | |
| tree | c7102e7f3b5f71180cb23d1a13c01158f558feb6 /core/java/android | |
| parent | 4cb3384772cf7015a4e05789470123efb07219d9 (diff) | |
| download | frameworks_base-758143ecfedbe08cc6c4fed0ad8ad7a854194ca4.zip frameworks_base-758143ecfedbe08cc6c4fed0ad8ad7a854194ca4.tar.gz frameworks_base-758143ecfedbe08cc6c4fed0ad8ad7a854194ca4.tar.bz2 | |
Window position not reported if the window is not moved.
1.If a window is shown but never moved the window window
is never notified for its current location. Therefore,
accessibility nodes do not contain correct bounds in
screen coordinates.
bug:6926295
Change-Id: I7df18b095d33ecafffced75aba9e4f4693b0c393
Diffstat (limited to 'core/java/android')
7 files changed, 72 insertions, 128 deletions
diff --git a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java index e10f218..ce797d1 100644 --- a/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodSessionWrapper.java @@ -17,6 +17,7 @@ package android.inputmethodservice; import com.android.internal.os.HandlerCaller; +import com.android.internal.os.SomeArgs; import com.android.internal.view.IInputMethodCallback; import com.android.internal.view.IInputMethodSession; @@ -91,28 +92,28 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub (ExtractedText)msg.obj); return; case DO_DISPATCH_KEY_EVENT: { - HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj; + SomeArgs args = (SomeArgs)msg.obj; mInputMethodSession.dispatchKeyEvent(msg.arg1, (KeyEvent)args.arg1, new InputMethodEventCallbackWrapper( (IInputMethodCallback)args.arg2)); - mCaller.recycleArgs(args); + args.recycle(); return; } case DO_DISPATCH_TRACKBALL_EVENT: { - HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj; + SomeArgs args = (SomeArgs)msg.obj; mInputMethodSession.dispatchTrackballEvent(msg.arg1, (MotionEvent)args.arg1, new InputMethodEventCallbackWrapper( (IInputMethodCallback)args.arg2)); - mCaller.recycleArgs(args); + args.recycle(); return; } case DO_UPDATE_SELECTION: { - HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj; + SomeArgs args = (SomeArgs)msg.obj; mInputMethodSession.updateSelection(args.argi1, args.argi2, args.argi3, args.argi4, args.argi5, args.argi6); - mCaller.recycleArgs(args); + args.recycle(); return; } case DO_UPDATE_CURSOR: { @@ -120,10 +121,10 @@ class IInputMethodSessionWrapper extends IInputMethodSession.Stub return; } case DO_APP_PRIVATE_COMMAND: { - HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj; + SomeArgs args = (SomeArgs)msg.obj; mInputMethodSession.appPrivateCommand((String)args.arg1, (Bundle)args.arg2); - mCaller.recycleArgs(args); + args.recycle(); return; } case DO_TOGGLE_SOFT_INPUT: { diff --git a/core/java/android/inputmethodservice/IInputMethodWrapper.java b/core/java/android/inputmethodservice/IInputMethodWrapper.java index 17c9ee7..5275314 100644 --- a/core/java/android/inputmethodservice/IInputMethodWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodWrapper.java @@ -17,6 +17,7 @@ package android.inputmethodservice; import com.android.internal.os.HandlerCaller; +import com.android.internal.os.SomeArgs; import com.android.internal.view.IInputContext; import com.android.internal.view.IInputMethod; import com.android.internal.view.IInputMethodCallback; @@ -124,7 +125,7 @@ class IInputMethodWrapper extends IInputMethod.Stub if (target == null) { return; } - HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj; + SomeArgs args = (SomeArgs)msg.obj; try { target.dump((FileDescriptor)args.arg1, (PrintWriter)args.arg2, (String[])args.arg3); @@ -134,6 +135,7 @@ class IInputMethodWrapper extends IInputMethod.Stub synchronized (args.arg4) { ((CountDownLatch)args.arg4).countDown(); } + args.recycle(); return; } @@ -149,23 +151,25 @@ class IInputMethodWrapper extends IInputMethod.Stub inputMethod.unbindInput(); return; case DO_START_INPUT: { - HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj; + SomeArgs args = (SomeArgs)msg.obj; IInputContext inputContext = (IInputContext)args.arg1; InputConnection ic = inputContext != null ? new InputConnectionWrapper(inputContext) : null; EditorInfo info = (EditorInfo)args.arg2; info.makeCompatible(mTargetSdkVersion); inputMethod.startInput(ic, info); + args.recycle(); return; } case DO_RESTART_INPUT: { - HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj; + SomeArgs args = (SomeArgs)msg.obj; IInputContext inputContext = (IInputContext)args.arg1; InputConnection ic = inputContext != null ? new InputConnectionWrapper(inputContext) : null; EditorInfo info = (EditorInfo)args.arg2; info.makeCompatible(mTargetSdkVersion); inputMethod.restartInput(ic, info); + args.recycle(); return; } case DO_CREATE_SESSION: { diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 6f45ca7..b513915 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -255,7 +255,7 @@ public abstract class WallpaperService extends Service { final BaseIWindow mWindow = new BaseIWindow() { @Override - public void resized(int w, int h, Rect contentInsets, + public void resized(Rect frame, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { Message msg = mCaller.obtainMessageI(MSG_WINDOW_RESIZED, reportDraw ? 1 : 0); diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index fbda474..9bee4bf 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -25,16 +25,14 @@ import android.os.Looper; import android.os.Message; import android.os.Process; import android.os.RemoteException; -import android.util.Pool; -import android.util.Poolable; -import android.util.PoolableManager; -import android.util.Pools; import android.util.SparseLongArray; import android.view.accessibility.AccessibilityInteractionClient; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeProvider; import android.view.accessibility.IAccessibilityInteractionConnectionCallback; +import com.android.internal.os.SomeArgs; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -48,7 +46,6 @@ import java.util.Map; * UI thread. */ final class AccessibilityInteractionController { - private static final int POOL_SIZE = 5; private ArrayList<AccessibilityNodeInfo> mTempAccessibilityNodeInfoList = new ArrayList<AccessibilityNodeInfo>(); @@ -76,60 +73,6 @@ final class AccessibilityInteractionController { mPrefetcher = new AccessibilityNodePrefetcher(); } - // Reusable poolable arguments for interacting with the view hierarchy - // to fit more arguments than Message and to avoid sharing objects between - // two messages since several threads can send messages concurrently. - private final Pool<SomeArgs> mPool = Pools.synchronizedPool(Pools.finitePool( - new PoolableManager<SomeArgs>() { - public SomeArgs newInstance() { - return new SomeArgs(); - } - - public void onAcquired(SomeArgs info) { - /* do nothing */ - } - - public void onReleased(SomeArgs info) { - info.clear(); - } - }, POOL_SIZE) - ); - - private class SomeArgs implements Poolable<SomeArgs> { - private SomeArgs mNext; - private boolean mIsPooled; - - public Object arg1; - public Object arg2; - public int argi1; - public int argi2; - public int argi3; - - public SomeArgs getNextPoolable() { - return mNext; - } - - public boolean isPooled() { - return mIsPooled; - } - - public void setNextPoolable(SomeArgs args) { - mNext = args; - } - - public void setPooled(boolean isPooled) { - mIsPooled = isPooled; - } - - private void clear() { - arg1 = null; - arg2 = null; - argi1 = 0; - argi2 = 0; - argi3 = 0; - } - } - private boolean isShown(View view) { // The first two checks are made also made by isShown() which // however traverses the tree up to the parent to catch that. @@ -148,7 +91,7 @@ final class AccessibilityInteractionController { message.what = PrivateHandler.MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID; message.arg1 = flags; - SomeArgs args = mPool.acquire(); + SomeArgs args = SomeArgs.obtain(); args.argi1 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId); args.argi2 = AccessibilityNodeInfo.getVirtualDescendantId(accessibilityNodeId); args.argi3 = interactionId; @@ -177,7 +120,7 @@ final class AccessibilityInteractionController { final IAccessibilityInteractionConnectionCallback callback = (IAccessibilityInteractionConnectionCallback) args.arg1; - mPool.release(args); + args.recycle(); List<AccessibilityNodeInfo> infos = mTempAccessibilityNodeInfoList; infos.clear(); @@ -216,7 +159,7 @@ final class AccessibilityInteractionController { message.arg1 = flags; message.arg2 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId); - SomeArgs args = mPool.acquire(); + SomeArgs args = SomeArgs.obtain(); args.argi1 = viewId; args.argi2 = interactionId; args.arg1 = callback; @@ -245,7 +188,7 @@ final class AccessibilityInteractionController { final IAccessibilityInteractionConnectionCallback callback = (IAccessibilityInteractionConnectionCallback) args.arg1; - mPool.release(args); + args.recycle(); AccessibilityNodeInfo info = null; try { @@ -284,7 +227,7 @@ final class AccessibilityInteractionController { message.what = PrivateHandler.MSG_FIND_ACCESSIBLITY_NODE_INFO_BY_TEXT; message.arg1 = flags; - SomeArgs args = mPool.acquire(); + SomeArgs args = SomeArgs.obtain(); args.arg1 = text; args.arg2 = callback; args.argi1 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId); @@ -315,7 +258,7 @@ final class AccessibilityInteractionController { final int accessibilityViewId = args.argi1; final int virtualDescendantId = args.argi2; final int interactionId = args.argi3; - mPool.release(args); + args.recycle(); List<AccessibilityNodeInfo> infos = null; try { @@ -383,7 +326,7 @@ final class AccessibilityInteractionController { message.arg1 = flags; message.arg2 = focusType; - SomeArgs args = mPool.acquire(); + SomeArgs args = SomeArgs.obtain(); args.argi1 = interactionId; args.argi2 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId); args.argi3 = AccessibilityNodeInfo.getVirtualDescendantId(accessibilityNodeId); @@ -414,7 +357,7 @@ final class AccessibilityInteractionController { final IAccessibilityInteractionConnectionCallback callback = (IAccessibilityInteractionConnectionCallback) args.arg1; - mPool.release(args); + args.recycle(); AccessibilityNodeInfo focused = null; try { @@ -480,8 +423,7 @@ final class AccessibilityInteractionController { message.arg1 = flags; message.arg2 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId); - SomeArgs args = mPool.acquire(); - args.argi1 = AccessibilityNodeInfo.getVirtualDescendantId(accessibilityNodeId); + SomeArgs args = SomeArgs.obtain(); args.argi2 = direction; args.argi3 = interactionId; args.arg1 = callback; @@ -505,13 +447,12 @@ final class AccessibilityInteractionController { final int accessibilityViewId = message.arg2; SomeArgs args = (SomeArgs) message.obj; - final int virtualDescendantId = args.argi1; final int direction = args.argi2; final int interactionId = args.argi3; final IAccessibilityInteractionConnectionCallback callback = (IAccessibilityInteractionConnectionCallback) args.arg1; - mPool.release(args); + args.recycle(); AccessibilityNodeInfo next = null; try { @@ -552,7 +493,7 @@ final class AccessibilityInteractionController { message.arg1 = flags; message.arg2 = AccessibilityNodeInfo.getAccessibilityViewId(accessibilityNodeId); - SomeArgs args = mPool.acquire(); + SomeArgs args = SomeArgs.obtain(); args.argi1 = AccessibilityNodeInfo.getVirtualDescendantId(accessibilityNodeId); args.argi2 = action; args.argi3 = interactionId; @@ -585,7 +526,7 @@ final class AccessibilityInteractionController { (IAccessibilityInteractionConnectionCallback) args.arg1; Bundle arguments = (Bundle) args.arg2; - mPool.release(args); + args.recycle(); boolean succeeded = false; try { diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index 9f22870..15bd46c 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -45,7 +45,7 @@ oneway interface IWindow { */ void executeCommand(String command, String parameters, in ParcelFileDescriptor descriptor); - void resized(int w, int h, in Rect contentInsets, + void resized(in Rect frame, in Rect contentInsets, in Rect visibleInsets, boolean reportDraw, in Configuration newConfig); void moved(int newX, int newY); void dispatchAppVisibility(boolean visible); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 1ad42f5..afcbaaf 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -74,6 +74,7 @@ import android.view.inputmethod.InputMethodManager; import android.widget.Scroller; import com.android.internal.R; +import com.android.internal.os.SomeArgs; import com.android.internal.policy.PolicyManager; import com.android.internal.view.BaseSurfaceHolder; import com.android.internal.view.RootViewSurfaceTaker; @@ -109,7 +110,7 @@ public final class ViewRootImpl implements ViewParent, private static final boolean DEBUG_FPS = false; private static final boolean USE_RENDER_THREAD = false; - + /** * Set this system property to true to force the view hierarchy to render * at 60 Hz. This can be used to measure the potential framerate. @@ -264,12 +265,6 @@ public final class ViewRootImpl implements ViewParent, final Configuration mLastConfiguration = new Configuration(); final Configuration mPendingConfiguration = new Configuration(); - class ResizedInfo { - Rect contentInsets; - Rect visibleInsets; - Configuration newConfig; - } - boolean mScrollMayChange; int mSoftInputMode; View mLastScrolledFocus; @@ -2823,29 +2818,31 @@ public final class ViewRootImpl implements ViewParent, case MSG_DISPATCH_GET_NEW_SURFACE: handleGetNewSurface(); break; - case MSG_RESIZED: - ResizedInfo ri = (ResizedInfo)msg.obj; - - if (mWinFrame.width() == msg.arg1 && mWinFrame.height() == msg.arg2 - && mPendingContentInsets.equals(ri.contentInsets) - && mPendingVisibleInsets.equals(ri.visibleInsets) - && ((ResizedInfo)msg.obj).newConfig == null) { + case MSG_RESIZED: { + // Recycled in the fall through... + SomeArgs args = (SomeArgs) msg.obj; + if (mWinFrame.equals((Rect) args.arg1) + && mPendingContentInsets.equals((Rect) args.arg2) + && mPendingVisibleInsets.equals((Rect) args.arg3) + && ((Configuration) args.arg4 == null)) { break; } - // fall through... + } // fall through... case MSG_RESIZED_REPORT: if (mAdded) { - Configuration config = ((ResizedInfo)msg.obj).newConfig; + SomeArgs args = (SomeArgs) msg.obj; + + Configuration config = (Configuration) args.arg4; if (config != null) { updateConfiguration(config, false); } - // TODO: Should left/top stay unchanged and only change the right/bottom? - mWinFrame.left = 0; - mWinFrame.right = msg.arg1; - mWinFrame.top = 0; - mWinFrame.bottom = msg.arg2; - mPendingContentInsets.set(((ResizedInfo)msg.obj).contentInsets); - mPendingVisibleInsets.set(((ResizedInfo)msg.obj).visibleInsets); + + mWinFrame.set((Rect) args.arg1); + mPendingContentInsets.set((Rect) args.arg2); + mPendingVisibleInsets.set((Rect) args.arg3); + + args.recycle(); + if (msg.what == MSG_RESIZED_REPORT) { mReportNextDraw = true; } @@ -2853,6 +2850,7 @@ public final class ViewRootImpl implements ViewParent, if (mView != null) { forceLayout(mView); } + requestLayout(); } break; @@ -4069,26 +4067,25 @@ public final class ViewRootImpl implements ViewParent, mHandler.sendMessage(msg); } - public void dispatchResized(int w, int h, Rect contentInsets, + public void dispatchResized(Rect frame, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { - if (DEBUG_LAYOUT) Log.v(TAG, "Resizing " + this + ": w=" + w - + " h=" + h + " contentInsets=" + contentInsets.toShortString() + if (DEBUG_LAYOUT) Log.v(TAG, "Resizing " + this + ": frame=" + frame.toShortString() + + " contentInsets=" + contentInsets.toShortString() + " visibleInsets=" + visibleInsets.toShortString() + " reportDraw=" + reportDraw); - Message msg = mHandler.obtainMessage(reportDraw ? MSG_RESIZED_REPORT :MSG_RESIZED); + Message msg = mHandler.obtainMessage(reportDraw ? MSG_RESIZED_REPORT : MSG_RESIZED); if (mTranslator != null) { + mTranslator.translateRectInScreenToAppWindow(frame); mTranslator.translateRectInScreenToAppWindow(contentInsets); mTranslator.translateRectInScreenToAppWindow(visibleInsets); - w *= mTranslator.applicationInvertedScale; - h *= mTranslator.applicationInvertedScale; - } - msg.arg1 = w; - msg.arg2 = h; - ResizedInfo ri = new ResizedInfo(); - ri.contentInsets = new Rect(contentInsets); - ri.visibleInsets = new Rect(visibleInsets); - ri.newConfig = newConfig; - msg.obj = ri; + } + SomeArgs args = SomeArgs.obtain(); + final boolean sameProcessCall = (Binder.getCallingPid() == android.os.Process.myPid()); + args.arg1 = sameProcessCall ? new Rect(frame) : frame; + args.arg2 = sameProcessCall ? new Rect(contentInsets) : contentInsets; + args.arg3 = sameProcessCall ? new Rect(visibleInsets) : visibleInsets; + args.arg4 = sameProcessCall && newConfig != null ? new Configuration(newConfig) : newConfig; + msg.obj = args; mHandler.sendMessage(msg); } @@ -4734,11 +4731,11 @@ public final class ViewRootImpl implements ViewParent, mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor); } - public void resized(int w, int h, Rect contentInsets, + public void resized(Rect frame, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { - viewAncestor.dispatchResized(w, h, contentInsets, + viewAncestor.dispatchResized(frame, contentInsets, visibleInsets, reportDraw, newConfig); } } diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 58f0b85..548d4ad 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -16,7 +16,7 @@ package android.view.inputmethod; -import com.android.internal.os.HandlerCaller; +import com.android.internal.os.SomeArgs; import com.android.internal.view.IInputConnectionWrapper; import com.android.internal.view.IInputContext; import com.android.internal.view.IInputMethodCallback; @@ -341,7 +341,7 @@ public final class InputMethodManager { public void handleMessage(Message msg) { switch (msg.what) { case MSG_DUMP: { - HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj; + SomeArgs args = (SomeArgs)msg.obj; try { doDump((FileDescriptor)args.arg1, (PrintWriter)args.arg2, (String[])args.arg3); @@ -351,6 +351,7 @@ public final class InputMethodManager { synchronized (args.arg4) { ((CountDownLatch)args.arg4).countDown(); } + args.recycle(); return; } case MSG_BIND: { @@ -486,7 +487,7 @@ public final class InputMethodManager { // interface to the system. CountDownLatch latch = new CountDownLatch(1); - HandlerCaller.SomeArgs sargs = new HandlerCaller.SomeArgs(); + SomeArgs sargs = SomeArgs.obtain(); sargs.arg1 = fd; sargs.arg2 = fout; sargs.arg3 = args; |
