diff options
-rw-r--r-- | core/java/com/android/internal/view/IInputConnectionWrapper.java | 145 |
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); |