summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/view/IInputConnectionWrapper.java145
1 files changed, 86 insertions, 59 deletions
diff --git a/core/java/com/android/internal/view/IInputConnectionWrapper.java b/core/java/com/android/internal/view/IInputConnectionWrapper.java
index 9de1b21c9bb3..555263dd3699 100644
--- a/core/java/com/android/internal/view/IInputConnectionWrapper.java
+++ b/core/java/com/android/internal/view/IInputConnectionWrapper.java
@@ -17,6 +17,7 @@
package com.android.internal.view;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.os.SomeArgs;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -74,13 +75,6 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub {
@GuardedBy("mLock")
private boolean mFinished = false;
- static class SomeArgs {
- Object arg1;
- Object arg2;
- IInputContextCallback callback;
- int seq;
- }
-
class MyHandler extends Handler {
MyHandler(Looper looper) {
super(looper);
@@ -241,80 +235,100 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub {
case DO_GET_TEXT_AFTER_CURSOR: {
SomeArgs args = (SomeArgs)msg.obj;
try {
+ final IInputContextCallback callback = (IInputContextCallback) args.arg6;
+ final int callbackSeq = args.argi6;
InputConnection ic = getInputConnection();
if (ic == null || !isActive()) {
Log.w(TAG, "getTextAfterCursor on inactive InputConnection");
- args.callback.setTextAfterCursor(null, args.seq);
+ callback.setTextAfterCursor(null, callbackSeq);
return;
}
- args.callback.setTextAfterCursor(ic.getTextAfterCursor(
- msg.arg1, msg.arg2), args.seq);
+ callback.setTextAfterCursor(ic.getTextAfterCursor(
+ msg.arg1, msg.arg2), callbackSeq);
} catch (RemoteException e) {
Log.w(TAG, "Got RemoteException calling setTextAfterCursor", e);
+ } finally {
+ args.recycle();
}
return;
}
case DO_GET_TEXT_BEFORE_CURSOR: {
SomeArgs args = (SomeArgs)msg.obj;
try {
+ final IInputContextCallback callback = (IInputContextCallback) args.arg6;
+ final int callbackSeq = args.argi6;
InputConnection ic = getInputConnection();
if (ic == null || !isActive()) {
Log.w(TAG, "getTextBeforeCursor on inactive InputConnection");
- args.callback.setTextBeforeCursor(null, args.seq);
+ callback.setTextBeforeCursor(null, callbackSeq);
return;
}
- args.callback.setTextBeforeCursor(ic.getTextBeforeCursor(
- msg.arg1, msg.arg2), args.seq);
+ callback.setTextBeforeCursor(ic.getTextBeforeCursor(
+ msg.arg1, msg.arg2), callbackSeq);
} catch (RemoteException e) {
Log.w(TAG, "Got RemoteException calling setTextBeforeCursor", e);
+ } finally {
+ args.recycle();
}
return;
}
case DO_GET_SELECTED_TEXT: {
SomeArgs args = (SomeArgs)msg.obj;
try {
+ final IInputContextCallback callback = (IInputContextCallback) args.arg6;
+ final int callbackSeq = args.argi6;
InputConnection ic = getInputConnection();
if (ic == null || !isActive()) {
Log.w(TAG, "getSelectedText on inactive InputConnection");
- args.callback.setSelectedText(null, args.seq);
+ callback.setSelectedText(null, callbackSeq);
return;
}
- args.callback.setSelectedText(ic.getSelectedText(
- msg.arg1), args.seq);
+ callback.setSelectedText(ic.getSelectedText(
+ msg.arg1), callbackSeq);
} catch (RemoteException e) {
Log.w(TAG, "Got RemoteException calling setSelectedText", e);
+ } finally {
+ args.recycle();
}
return;
}
case DO_GET_CURSOR_CAPS_MODE: {
SomeArgs args = (SomeArgs)msg.obj;
try {
+ final IInputContextCallback callback = (IInputContextCallback) args.arg6;
+ final int callbackSeq = args.argi6;
InputConnection ic = getInputConnection();
if (ic == null || !isActive()) {
Log.w(TAG, "getCursorCapsMode on inactive InputConnection");
- args.callback.setCursorCapsMode(0, args.seq);
+ callback.setCursorCapsMode(0, callbackSeq);
return;
}
- args.callback.setCursorCapsMode(ic.getCursorCapsMode(msg.arg1),
- args.seq);
+ callback.setCursorCapsMode(ic.getCursorCapsMode(msg.arg1),
+ callbackSeq);
} catch (RemoteException e) {
Log.w(TAG, "Got RemoteException calling setCursorCapsMode", e);
+ } finally {
+ args.recycle();
}
return;
}
case DO_GET_EXTRACTED_TEXT: {
SomeArgs args = (SomeArgs)msg.obj;
try {
+ final IInputContextCallback callback = (IInputContextCallback) args.arg6;
+ final int callbackSeq = args.argi6;
InputConnection ic = getInputConnection();
if (ic == null || !isActive()) {
Log.w(TAG, "getExtractedText on inactive InputConnection");
- args.callback.setExtractedText(null, args.seq);
+ callback.setExtractedText(null, callbackSeq);
return;
}
- args.callback.setExtractedText(ic.getExtractedText(
- (ExtractedTextRequest)args.arg1, msg.arg1), args.seq);
+ callback.setExtractedText(ic.getExtractedText(
+ (ExtractedTextRequest)args.arg1, msg.arg1), callbackSeq);
} catch (RemoteException e) {
Log.w(TAG, "Got RemoteException calling setExtractedText", e);
+ } finally {
+ args.recycle();
}
return;
}
@@ -469,29 +483,37 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub {
return;
}
case DO_PERFORM_PRIVATE_COMMAND: {
- InputConnection ic = getInputConnection();
- if (ic == null || !isActive()) {
- Log.w(TAG, "performPrivateCommand on inactive InputConnection");
- return;
+ final SomeArgs args = (SomeArgs) msg.obj;
+ try {
+ final String action = (String) args.arg1;
+ final Bundle data = (Bundle) args.arg2;
+ InputConnection ic = getInputConnection();
+ if (ic == null || !isActive()) {
+ Log.w(TAG, "performPrivateCommand on inactive InputConnection");
+ return;
+ }
+ ic.performPrivateCommand(action, data);
+ } finally {
+ args.recycle();
}
- SomeArgs args = (SomeArgs)msg.obj;
- ic.performPrivateCommand((String)args.arg1,
- (Bundle)args.arg2);
- return;
}
case DO_REQUEST_UPDATE_CURSOR_ANCHOR_INFO: {
SomeArgs args = (SomeArgs)msg.obj;
try {
+ final IInputContextCallback callback = (IInputContextCallback) args.arg6;
+ final int callbackSeq = args.argi6;
InputConnection ic = getInputConnection();
if (ic == null || !isActive()) {
Log.w(TAG, "requestCursorAnchorInfo on inactive InputConnection");
- args.callback.setRequestUpdateCursorAnchorInfoResult(false, args.seq);
+ callback.setRequestUpdateCursorAnchorInfoResult(false, callbackSeq);
return;
}
- args.callback.setRequestUpdateCursorAnchorInfoResult(
- ic.requestCursorUpdates(msg.arg1), args.seq);
+ callback.setRequestUpdateCursorAnchorInfoResult(
+ ic.requestCursorUpdates(msg.arg1), callbackSeq);
} catch (RemoteException e) {
Log.w(TAG, "Got RemoteException calling requestCursorAnchorInfo", e);
+ } finally {
+ args.recycle();
}
return;
}
@@ -529,35 +551,39 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub {
final int flags = msg.arg1;
SomeArgs args = (SomeArgs) msg.obj;
try {
+ final IInputContextCallback callback = (IInputContextCallback) args.arg6;
+ final int callbackSeq = args.argi6;
InputConnection ic = getInputConnection();
if (ic == null || !isActive()) {
Log.w(TAG, "commitContent on inactive InputConnection");
- args.callback.setCommitContentResult(false, args.seq);
+ callback.setCommitContentResult(false, callbackSeq);
return;
}
final InputContentInfo inputContentInfo = (InputContentInfo) args.arg1;
if (inputContentInfo == null || !inputContentInfo.validate()) {
Log.w(TAG, "commitContent with invalid inputContentInfo="
+ inputContentInfo);
- args.callback.setCommitContentResult(false, args.seq);
+ callback.setCommitContentResult(false, callbackSeq);
return;
}
final boolean result =
ic.commitContent(inputContentInfo, flags, (Bundle) args.arg2);
- args.callback.setCommitContentResult(result, args.seq);
+ callback.setCommitContentResult(result, callbackSeq);
} catch (RemoteException e) {
Log.w(TAG, "Got RemoteException calling commitContent", e);
+ } finally {
+ args.recycle();
}
return;
}
}
Log.w(TAG, "Unhandled message code: " + msg.what);
}
-
+
Message obtainMessage(int what) {
return mH.obtainMessage(what);
}
-
+
Message obtainMessageII(int what, int arg1, int arg2) {
return mH.obtainMessage(what, arg1, arg2);
}
@@ -565,46 +591,47 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub {
Message obtainMessageO(int what, Object arg1) {
return mH.obtainMessage(what, 0, 0, arg1);
}
-
- Message obtainMessageISC(int what, int arg1, int seq, IInputContextCallback callback) {
- SomeArgs args = new SomeArgs();
- args.callback = callback;
- args.seq = seq;
+
+ Message obtainMessageISC(int what, int arg1, int callbackSeq, IInputContextCallback callback) {
+ final SomeArgs args = SomeArgs.obtain();
+ args.arg6 = callback;
+ args.argi6 = callbackSeq;
return mH.obtainMessage(what, arg1, 0, args);
}
-
- Message obtainMessageIISC(int what, int arg1, int arg2, int seq, IInputContextCallback callback) {
- SomeArgs args = new SomeArgs();
- args.callback = callback;
- args.seq = seq;
+
+ Message obtainMessageIISC(int what, int arg1, int arg2, int callbackSeq,
+ IInputContextCallback callback) {
+ final SomeArgs args = SomeArgs.obtain();
+ args.arg6 = callback;
+ args.argi6 = callbackSeq;
return mH.obtainMessage(what, arg1, arg2, args);
}
- Message obtainMessageIOOSC(int what, int arg1, Object objArg1, Object objArg2, int seq,
+ Message obtainMessageIOOSC(int what, int arg1, Object objArg1, Object objArg2, int callbackSeq,
IInputContextCallback callback) {
- SomeArgs args = new SomeArgs();
+ final SomeArgs args = SomeArgs.obtain();
args.arg1 = objArg1;
args.arg2 = objArg2;
- args.callback = callback;
- args.seq = seq;
+ args.arg6 = callback;
+ args.argi6 = callbackSeq;
return mH.obtainMessage(what, arg1, 0, args);
}
- Message obtainMessageIOSC(int what, int arg1, Object arg2, int seq,
+ Message obtainMessageIOSC(int what, int arg1, Object arg2, int callbackSeq,
IInputContextCallback callback) {
- SomeArgs args = new SomeArgs();
+ final SomeArgs args = SomeArgs.obtain();
args.arg1 = arg2;
- args.callback = callback;
- args.seq = seq;
+ args.arg6 = callback;
+ args.argi6 = callbackSeq;
return mH.obtainMessage(what, arg1, 0, args);
}
-
+
Message obtainMessageIO(int what, int arg1, Object arg2) {
return mH.obtainMessage(what, arg1, 0, arg2);
}
-
+
Message obtainMessageOO(int what, Object arg1, Object arg2) {
- SomeArgs args = new SomeArgs();
+ final SomeArgs args = SomeArgs.obtain();
args.arg1 = arg1;
args.arg2 = arg2;
return mH.obtainMessage(what, 0, 0, args);