1 /* 2 * Copyright (C) 2007-2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy of 6 * the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 17 package android.view.inputmethod; 18 19 import android.os.Bundle; 20 import android.os.Handler; 21 import android.view.KeyEvent; 22 23 /** 24 * <p>Wrapper class for proxying calls to another InputConnection. Subclass and have fun! 25 */ 26 public class InputConnectionWrapper implements InputConnection { 27 private InputConnection mTarget; 28 final boolean mMutable; 29 @InputConnectionInspector.MissingMethodFlags 30 private int mMissingMethodFlags; 31 32 /** 33 * Initializes a wrapper. 34 * 35 * <p><b>Caveat:</b> Although the system can accept {@code (InputConnection) null} in some 36 * places, you cannot emulate such a behavior by non-null {@link InputConnectionWrapper} that 37 * has {@code null} in {@code target}.</p> 38 * @param target the {@link InputConnection} to be proxied. 39 * @param mutable set {@code true} to protect this object from being reconfigured to target 40 * another {@link InputConnection}. Note that this is ignored while the target is {@code null}. 41 */ InputConnectionWrapper(InputConnection target, boolean mutable)42 public InputConnectionWrapper(InputConnection target, boolean mutable) { 43 mMutable = mutable; 44 mTarget = target; 45 mMissingMethodFlags = InputConnectionInspector.getMissingMethodFlags(target); 46 } 47 48 /** 49 * Change the target of the input connection. 50 * 51 * <p><b>Caveat:</b> Although the system can accept {@code (InputConnection) null} in some 52 * places, you cannot emulate such a behavior by non-null {@link InputConnectionWrapper} that 53 * has {@code null} in {@code target}.</p> 54 * @param target the {@link InputConnection} to be proxied. 55 * @throws SecurityException when this wrapper has non-null target and is immutable. 56 */ setTarget(InputConnection target)57 public void setTarget(InputConnection target) { 58 if (mTarget != null && !mMutable) { 59 throw new SecurityException("not mutable"); 60 } 61 mTarget = target; 62 mMissingMethodFlags = InputConnectionInspector.getMissingMethodFlags(target); 63 } 64 65 /** 66 * @hide 67 */ 68 @InputConnectionInspector.MissingMethodFlags getMissingMethodFlags()69 public int getMissingMethodFlags() { 70 return mMissingMethodFlags; 71 } 72 73 /** 74 * {@inheritDoc} 75 * @throws NullPointerException if the target is {@code null}. 76 */ getTextBeforeCursor(int n, int flags)77 public CharSequence getTextBeforeCursor(int n, int flags) { 78 return mTarget.getTextBeforeCursor(n, flags); 79 } 80 81 /** 82 * {@inheritDoc} 83 * @throws NullPointerException if the target is {@code null}. 84 */ getTextAfterCursor(int n, int flags)85 public CharSequence getTextAfterCursor(int n, int flags) { 86 return mTarget.getTextAfterCursor(n, flags); 87 } 88 89 /** 90 * {@inheritDoc} 91 * @throws NullPointerException if the target is {@code null}. 92 */ getSelectedText(int flags)93 public CharSequence getSelectedText(int flags) { 94 return mTarget.getSelectedText(flags); 95 } 96 97 /** 98 * {@inheritDoc} 99 * @throws NullPointerException if the target is {@code null}. 100 */ getCursorCapsMode(int reqModes)101 public int getCursorCapsMode(int reqModes) { 102 return mTarget.getCursorCapsMode(reqModes); 103 } 104 105 /** 106 * {@inheritDoc} 107 * @throws NullPointerException if the target is {@code null}. 108 */ getExtractedText(ExtractedTextRequest request, int flags)109 public ExtractedText getExtractedText(ExtractedTextRequest request, int flags) { 110 return mTarget.getExtractedText(request, flags); 111 } 112 113 /** 114 * {@inheritDoc} 115 * @throws NullPointerException if the target is {@code null}. 116 */ deleteSurroundingTextInCodePoints(int beforeLength, int afterLength)117 public boolean deleteSurroundingTextInCodePoints(int beforeLength, int afterLength) { 118 return mTarget.deleteSurroundingTextInCodePoints(beforeLength, afterLength); 119 } 120 121 /** 122 * {@inheritDoc} 123 * @throws NullPointerException if the target is {@code null}. 124 */ deleteSurroundingText(int beforeLength, int afterLength)125 public boolean deleteSurroundingText(int beforeLength, int afterLength) { 126 return mTarget.deleteSurroundingText(beforeLength, afterLength); 127 } 128 129 /** 130 * {@inheritDoc} 131 * @throws NullPointerException if the target is {@code null}. 132 */ setComposingText(CharSequence text, int newCursorPosition)133 public boolean setComposingText(CharSequence text, int newCursorPosition) { 134 return mTarget.setComposingText(text, newCursorPosition); 135 } 136 137 /** 138 * {@inheritDoc} 139 * @throws NullPointerException if the target is {@code null}. 140 */ setComposingRegion(int start, int end)141 public boolean setComposingRegion(int start, int end) { 142 return mTarget.setComposingRegion(start, end); 143 } 144 145 /** 146 * {@inheritDoc} 147 * @throws NullPointerException if the target is {@code null}. 148 */ finishComposingText()149 public boolean finishComposingText() { 150 return mTarget.finishComposingText(); 151 } 152 153 /** 154 * {@inheritDoc} 155 * @throws NullPointerException if the target is {@code null}. 156 */ commitText(CharSequence text, int newCursorPosition)157 public boolean commitText(CharSequence text, int newCursorPosition) { 158 return mTarget.commitText(text, newCursorPosition); 159 } 160 161 /** 162 * {@inheritDoc} 163 * @throws NullPointerException if the target is {@code null}. 164 */ commitCompletion(CompletionInfo text)165 public boolean commitCompletion(CompletionInfo text) { 166 return mTarget.commitCompletion(text); 167 } 168 169 /** 170 * {@inheritDoc} 171 * @throws NullPointerException if the target is {@code null}. 172 */ commitCorrection(CorrectionInfo correctionInfo)173 public boolean commitCorrection(CorrectionInfo correctionInfo) { 174 return mTarget.commitCorrection(correctionInfo); 175 } 176 177 /** 178 * {@inheritDoc} 179 * @throws NullPointerException if the target is {@code null}. 180 */ setSelection(int start, int end)181 public boolean setSelection(int start, int end) { 182 return mTarget.setSelection(start, end); 183 } 184 185 /** 186 * {@inheritDoc} 187 * @throws NullPointerException if the target is {@code null}. 188 */ performEditorAction(int editorAction)189 public boolean performEditorAction(int editorAction) { 190 return mTarget.performEditorAction(editorAction); 191 } 192 193 /** 194 * {@inheritDoc} 195 * @throws NullPointerException if the target is {@code null}. 196 */ performContextMenuAction(int id)197 public boolean performContextMenuAction(int id) { 198 return mTarget.performContextMenuAction(id); 199 } 200 201 /** 202 * {@inheritDoc} 203 * @throws NullPointerException if the target is {@code null}. 204 */ beginBatchEdit()205 public boolean beginBatchEdit() { 206 return mTarget.beginBatchEdit(); 207 } 208 209 /** 210 * {@inheritDoc} 211 * @throws NullPointerException if the target is {@code null}. 212 */ endBatchEdit()213 public boolean endBatchEdit() { 214 return mTarget.endBatchEdit(); 215 } 216 217 /** 218 * {@inheritDoc} 219 * @throws NullPointerException if the target is {@code null}. 220 */ sendKeyEvent(KeyEvent event)221 public boolean sendKeyEvent(KeyEvent event) { 222 return mTarget.sendKeyEvent(event); 223 } 224 225 /** 226 * {@inheritDoc} 227 * @throws NullPointerException if the target is {@code null}. 228 */ clearMetaKeyStates(int states)229 public boolean clearMetaKeyStates(int states) { 230 return mTarget.clearMetaKeyStates(states); 231 } 232 233 /** 234 * {@inheritDoc} 235 * @throws NullPointerException if the target is {@code null}. 236 */ reportFullscreenMode(boolean enabled)237 public boolean reportFullscreenMode(boolean enabled) { 238 return mTarget.reportFullscreenMode(enabled); 239 } 240 241 /** 242 * {@inheritDoc} 243 * @throws NullPointerException if the target is {@code null}. 244 */ performPrivateCommand(String action, Bundle data)245 public boolean performPrivateCommand(String action, Bundle data) { 246 return mTarget.performPrivateCommand(action, data); 247 } 248 249 /** 250 * {@inheritDoc} 251 * @throws NullPointerException if the target is {@code null}. 252 */ requestCursorUpdates(int cursorUpdateMode)253 public boolean requestCursorUpdates(int cursorUpdateMode) { 254 return mTarget.requestCursorUpdates(cursorUpdateMode); 255 } 256 257 /** 258 * {@inheritDoc} 259 * @throws NullPointerException if the target is {@code null}. 260 */ getHandler()261 public Handler getHandler() { 262 return mTarget.getHandler(); 263 } 264 265 /** 266 * {@inheritDoc} 267 * @throws NullPointerException if the target is {@code null}. 268 */ closeConnection()269 public void closeConnection() { 270 mTarget.closeConnection(); 271 } 272 273 /** 274 * {@inheritDoc} 275 * @throws NullPointerException if the target is {@code null}. 276 */ commitContent(InputContentInfo inputContentInfo, int flags, Bundle opts)277 public boolean commitContent(InputContentInfo inputContentInfo, int flags, Bundle opts) { 278 return mTarget.commitContent(inputContentInfo, flags, opts); 279 } 280 } 281