summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSvetoslav Ganov <svetoslavganov@google.com>2012-08-06 23:56:33 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-08-06 23:56:33 -0700
commit071efcac338661d027f7ff391865574e7db716e7 (patch)
treef6cf922366924576bd994c5ef99cb39be559e9ea
parent99e3bba5eaf4482d877657feb35e45f74ecb7b7a (diff)
parent53efd9dac8b85e0dff484293c15d802655fd9d1c (diff)
downloadframeworks_base-071efcac338661d027f7ff391865574e7db716e7.zip
frameworks_base-071efcac338661d027f7ff391865574e7db716e7.tar.gz
frameworks_base-071efcac338661d027f7ff391865574e7db716e7.tar.bz2
am 53efd9da: am 85b1041f: Merge "Window position not reported if the window is not moved." into jb-mr1-dev
* commit '53efd9dac8b85e0dff484293c15d802655fd9d1c': Window position not reported if the window is not moved.
-rw-r--r--core/java/android/inputmethodservice/IInputMethodSessionWrapper.java17
-rw-r--r--core/java/android/inputmethodservice/IInputMethodWrapper.java10
-rw-r--r--core/java/android/service/wallpaper/WallpaperService.java2
-rw-r--r--core/java/android/view/AccessibilityInteractionController.java87
-rw-r--r--core/java/android/view/IWindow.aidl2
-rw-r--r--core/java/android/view/ViewRootImpl.java75
-rw-r--r--core/java/android/view/inputmethod/InputMethodManager.java7
-rw-r--r--core/java/com/android/internal/os/HandlerCaller.java66
-rw-r--r--core/java/com/android/internal/os/SomeArgs.java95
-rw-r--r--core/java/com/android/internal/view/BaseIWindow.java2
-rw-r--r--services/java/com/android/server/InputMethodManagerService.java30
-rwxr-xr-xservices/java/com/android/server/wm/WindowManagerService.java4
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java2
13 files changed, 201 insertions, 198 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;
diff --git a/core/java/com/android/internal/os/HandlerCaller.java b/core/java/com/android/internal/os/HandlerCaller.java
index a94fb1e..84699dc 100644
--- a/core/java/com/android/internal/os/HandlerCaller.java
+++ b/core/java/com/android/internal/os/HandlerCaller.java
@@ -22,35 +22,14 @@ import android.os.Looper;
import android.os.Message;
public class HandlerCaller {
- private static final String TAG = "HandlerCaller";
- private static final boolean DEBUG = false;
-
+
public final Context mContext;
final Looper mMainLooper;
final Handler mH;
final Callback mCallback;
-
- public static class SomeArgs {
- SomeArgs next;
-
- public Object arg1;
- public Object arg2;
- public Object arg3;
- public Object arg4;
- public int argi1;
- public int argi2;
- public int argi3;
- public int argi4;
- public int argi5;
- public int argi6;
- }
-
- static final int ARGS_POOL_MAX_SIZE = 10;
- int mArgsPoolSize;
- SomeArgs mArgsPool;
-
+
class MyHandler extends Handler {
MyHandler(Looper looper) {
super(looper);
@@ -80,29 +59,6 @@ public class HandlerCaller {
mCallback = callback;
}
- public SomeArgs obtainArgs() {
- synchronized (mH) {
- SomeArgs args = mArgsPool;
- if (args != null) {
- mArgsPool = args.next;
- args.next = null;
- mArgsPoolSize--;
- return args;
- }
- }
- return new SomeArgs();
- }
-
- public void recycleArgs(SomeArgs args) {
- synchronized (mH) {
- if (mArgsPoolSize < ARGS_POOL_MAX_SIZE) {
- args.next = mArgsPool;
- mArgsPool = args;
- mArgsPoolSize++;
- }
- }
- }
-
public void executeOrSendMessage(Message msg) {
// If we are calling this from the main thread, then we can call
// right through. Otherwise, we need to send the message to the
@@ -141,7 +97,7 @@ public class HandlerCaller {
}
public Message obtainMessageBOO(int what, boolean arg1, Object arg2, Object arg3) {
- SomeArgs args = obtainArgs();
+ SomeArgs args = SomeArgs.obtain();
args.arg1 = arg2;
args.arg2 = arg3;
return mH.obtainMessage(what, arg1 ? 1 : 0, 0, args);
@@ -169,28 +125,28 @@ public class HandlerCaller {
public Message obtainMessageIIOO(int what, int arg1, int arg2,
Object arg3, Object arg4) {
- SomeArgs args = obtainArgs();
+ SomeArgs args = SomeArgs.obtain();
args.arg1 = arg3;
args.arg2 = arg4;
return mH.obtainMessage(what, arg1, arg2, args);
}
public Message obtainMessageIOO(int what, int arg1, Object arg2, Object arg3) {
- SomeArgs args = obtainArgs();
+ SomeArgs args = SomeArgs.obtain();
args.arg1 = arg2;
args.arg2 = arg3;
return mH.obtainMessage(what, arg1, 0, args);
}
public Message obtainMessageOO(int what, Object arg1, Object arg2) {
- SomeArgs args = obtainArgs();
+ SomeArgs args = SomeArgs.obtain();
args.arg1 = arg1;
args.arg2 = arg2;
return mH.obtainMessage(what, 0, 0, args);
}
public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) {
- SomeArgs args = obtainArgs();
+ SomeArgs args = SomeArgs.obtain();
args.arg1 = arg1;
args.arg2 = arg2;
args.arg3 = arg3;
@@ -199,7 +155,7 @@ public class HandlerCaller {
public Message obtainMessageOOOO(int what, Object arg1, Object arg2,
Object arg3, Object arg4) {
- SomeArgs args = obtainArgs();
+ SomeArgs args = SomeArgs.obtain();
args.arg1 = arg1;
args.arg2 = arg2;
args.arg3 = arg3;
@@ -209,7 +165,7 @@ public class HandlerCaller {
public Message obtainMessageIIII(int what, int arg1, int arg2,
int arg3, int arg4) {
- SomeArgs args = obtainArgs();
+ SomeArgs args = SomeArgs.obtain();
args.argi1 = arg1;
args.argi2 = arg2;
args.argi3 = arg3;
@@ -219,7 +175,7 @@ public class HandlerCaller {
public Message obtainMessageIIIIII(int what, int arg1, int arg2,
int arg3, int arg4, int arg5, int arg6) {
- SomeArgs args = obtainArgs();
+ SomeArgs args = SomeArgs.obtain();
args.argi1 = arg1;
args.argi2 = arg2;
args.argi3 = arg3;
@@ -231,7 +187,7 @@ public class HandlerCaller {
public Message obtainMessageIIIIO(int what, int arg1, int arg2,
int arg3, int arg4, Object arg5) {
- SomeArgs args = obtainArgs();
+ SomeArgs args = SomeArgs.obtain();
args.arg1 = arg5;
args.argi1 = arg1;
args.argi2 = arg2;
diff --git a/core/java/com/android/internal/os/SomeArgs.java b/core/java/com/android/internal/os/SomeArgs.java
new file mode 100644
index 0000000..88e58dc
--- /dev/null
+++ b/core/java/com/android/internal/os/SomeArgs.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+/**
+ * Helper class for passing more arguments though a message
+ * and avoiding allocation of a custom class for wrapping the
+ * arguments. This class maintains a pool of instances and
+ * it is responsibility of the client to recycle and instance
+ * once it is no longer used.
+ */
+public final class SomeArgs {
+
+ private static final int MAX_POOL_SIZE = 10;
+
+ private static SomeArgs sPool;
+ private static int sPoolSize;
+ private static Object sPoolLock = new Object();
+
+ private SomeArgs mNext;
+
+ private boolean mInPool;
+
+ public Object arg1;
+ public Object arg2;
+ public Object arg3;
+ public Object arg4;
+ public int argi1;
+ public int argi2;
+ public int argi3;
+ public int argi4;
+ public int argi5;
+ public int argi6;
+
+ private SomeArgs() {
+ /* do nothing - reduce visibility */
+ }
+
+ public static SomeArgs obtain() {
+ synchronized (sPoolLock) {
+ if (sPoolSize > 0) {
+ SomeArgs args = sPool;
+ sPool = sPool.mNext;
+ args.mNext = null;
+ args.mInPool = false;
+ sPoolSize--;
+ return args;
+ } else {
+ return new SomeArgs();
+ }
+ }
+ }
+
+ public void recycle() {
+ if (mInPool) {
+ throw new IllegalStateException("Already recycled.");
+ }
+ synchronized (sPoolLock) {
+ clear();
+ if (sPoolSize < MAX_POOL_SIZE) {
+ mNext = sPool;
+ mInPool = true;
+ sPool = this;
+ sPoolSize++;
+ }
+ }
+ }
+
+ private void clear() {
+ arg1 = null;
+ arg2 = null;
+ arg3 = null;
+ arg4 = null;
+ argi1 = 0;
+ argi2 = 0;
+ argi3 = 0;
+ argi4 = 0;
+ argi5 = 0;
+ argi6 = 0;
+ }
+}
diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java
index ac1d594..b76e89d 100644
--- a/core/java/com/android/internal/view/BaseIWindow.java
+++ b/core/java/com/android/internal/view/BaseIWindow.java
@@ -34,7 +34,7 @@ public class BaseIWindow extends IWindow.Stub {
}
@Override
- public void resized(int w, int h, Rect contentInsets,
+ public void resized(Rect frame, Rect contentInsets,
Rect visibleInsets, boolean reportDraw, Configuration newConfig) {
if (reportDraw) {
try {
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 1e39492..747cf0b 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -17,6 +17,7 @@ package com.android.server;
import com.android.internal.content.PackageMonitor;
import com.android.internal.os.HandlerCaller;
+import com.android.internal.os.SomeArgs;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.view.IInputContext;
import com.android.internal.view.IInputMethod;
@@ -2024,7 +2025,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
@Override
public boolean handleMessage(Message msg) {
- HandlerCaller.SomeArgs args;
+ SomeArgs args;
switch (msg.what) {
case MSG_SHOW_IM_PICKER:
showInputMethodMenu();
@@ -2035,8 +2036,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
return true;
case MSG_SHOW_IM_SUBTYPE_ENABLER:
- args = (HandlerCaller.SomeArgs)msg.obj;
+ args = (SomeArgs)msg.obj;
showInputMethodAndSubtypeEnabler((String)args.arg1);
+ args.recycle();
return true;
case MSG_SHOW_IM_CONFIG:
@@ -2053,48 +2055,53 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
return true;
case MSG_BIND_INPUT:
- args = (HandlerCaller.SomeArgs)msg.obj;
+ args = (SomeArgs)msg.obj;
try {
((IInputMethod)args.arg1).bindInput((InputBinding)args.arg2);
} catch (RemoteException e) {
}
+ args.recycle();
return true;
case MSG_SHOW_SOFT_INPUT:
- args = (HandlerCaller.SomeArgs)msg.obj;
+ args = (SomeArgs)msg.obj;
try {
((IInputMethod)args.arg1).showSoftInput(msg.arg1,
(ResultReceiver)args.arg2);
} catch (RemoteException e) {
}
+ args.recycle();
return true;
case MSG_HIDE_SOFT_INPUT:
- args = (HandlerCaller.SomeArgs)msg.obj;
+ args = (SomeArgs)msg.obj;
try {
((IInputMethod)args.arg1).hideSoftInput(0,
(ResultReceiver)args.arg2);
} catch (RemoteException e) {
}
+ args.recycle();
return true;
case MSG_ATTACH_TOKEN:
- args = (HandlerCaller.SomeArgs)msg.obj;
+ args = (SomeArgs)msg.obj;
try {
if (DEBUG) Slog.v(TAG, "Sending attach of token: " + args.arg2);
((IInputMethod)args.arg1).attachToken((IBinder)args.arg2);
} catch (RemoteException e) {
}
+ args.recycle();
return true;
case MSG_CREATE_SESSION:
- args = (HandlerCaller.SomeArgs)msg.obj;
+ args = (SomeArgs)msg.obj;
try {
((IInputMethod)args.arg1).createSession(
(IInputMethodCallback)args.arg2);
} catch (RemoteException e) {
}
+ args.recycle();
return true;
// ---------------------------------------------------------
case MSG_START_INPUT:
- args = (HandlerCaller.SomeArgs)msg.obj;
+ args = (SomeArgs)msg.obj;
try {
SessionState session = (SessionState)args.arg1;
setEnabledSessionInMainThread(session);
@@ -2102,9 +2109,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
(EditorInfo)args.arg3);
} catch (RemoteException e) {
}
+ args.recycle();
return true;
case MSG_RESTART_INPUT:
- args = (HandlerCaller.SomeArgs)msg.obj;
+ args = (SomeArgs)msg.obj;
try {
SessionState session = (SessionState)args.arg1;
setEnabledSessionInMainThread(session);
@@ -2112,6 +2120,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
(EditorInfo)args.arg3);
} catch (RemoteException e) {
}
+ args.recycle();
return true;
// ---------------------------------------------------------
@@ -2124,13 +2133,14 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
return true;
case MSG_BIND_METHOD:
- args = (HandlerCaller.SomeArgs)msg.obj;
+ args = (SomeArgs)msg.obj;
try {
((IInputMethodClient)args.arg1).onBindMethod(
(InputBindResult)args.arg2);
} catch (RemoteException e) {
Slog.w(TAG, "Client died receiving input method " + args.arg2);
}
+ args.recycle();
return true;
case MSG_SET_ACTIVE:
try {
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 5b04810..680ae4c 100755
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -8973,9 +8973,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (DEBUG_ORIENTATION &&
winAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING) Slog.i(
TAG, "Resizing " + win + " WITH DRAW PENDING");
- win.mClient.resized((int)winAnimator.mSurfaceW,
- (int)winAnimator.mSurfaceH,
- win.mLastContentInsets, win.mLastVisibleInsets,
+ win.mClient.resized(win.mFrame, win.mLastContentInsets, win.mLastVisibleInsets,
winAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING,
configChanged ? win.mConfiguration : null);
win.mContentInsetsChanged = false;
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java
index e28375d..fa660e6 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java
@@ -47,7 +47,7 @@ public final class BridgeWindow implements IWindow {
}
@Override
- public void resized(int arg0, int arg1, Rect arg2, Rect arg3,
+ public void resized(Rect arg1, Rect arg2, Rect arg3,
boolean arg4, Configuration arg5) throws RemoteException {
// pass for now.
}