Home | History | Annotate | Download | only in ime
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of 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,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package android.inputmethodservice.cts.ime;
     18 
     19 import android.content.BroadcastReceiver;
     20 import android.content.Context;
     21 import android.content.Intent;
     22 import android.content.IntentFilter;
     23 import android.inputmethodservice.InputMethodService;
     24 import android.inputmethodservice.cts.common.ImeCommandConstants;
     25 import android.inputmethodservice.cts.ime.ImeCommandReceiver.ImeCommandCallbacks;
     26 import android.util.Log;
     27 
     28 /**
     29  * {@link ImeCommandConstants#ACTION_IME_COMMAND} intent receiver.
     30  */
     31 final class ImeCommandReceiver<T extends InputMethodService & ImeCommandCallbacks>
     32         extends BroadcastReceiver {
     33 
     34     private static final boolean DEBUG = false;
     35 
     36     interface ImeCommandCallbacks {
     37         /**
     38          * Callback method for {@link ImeCommandConstants#COMMAND_COMMIT_TEXT} intent.
     39          *
     40          * @param text text to be committed via {@link android.view.inputmethod.InputConnection}.
     41          * @param newCursorPosition new cursor position after commit.
     42          */
     43         void commandCommitText(final CharSequence text, final int newCursorPosition);
     44 
     45         /**
     46          * Callback method for {@link ImeCommandConstants#COMMAND_SWITCH_INPUT_METHOD} intent.
     47          *
     48          * @param imeId IME id to switch.
     49          */
     50         void commandSwitchInputMethod(final String imeId);
     51 
     52         /**
     53          * Callback method for {@link ImeCommandConstants#COMMAND_REQUEST_HIDE_SELF} intent.
     54          */
     55         void commandRequestHideSelf(final int flags);
     56     }
     57 
     58     private T mIme;
     59 
     60     void register(final T ime) {
     61         mIme = ime;
     62         ime.registerReceiver(this, new IntentFilter(ImeCommandConstants.ACTION_IME_COMMAND));
     63     }
     64 
     65     @Override
     66     public void onReceive(final Context context, final Intent intent) {
     67         final String command = intent.getStringExtra(ImeCommandConstants.EXTRA_COMMAND);
     68         if (DEBUG) {
     69             Log.d(mIme.getClass().getSimpleName(), "onReceive: command=" + command);
     70         }
     71 
     72         switch (command) {
     73             case ImeCommandConstants.COMMAND_COMMIT_TEXT: {
     74                 final CharSequence text = getCharSequence1(intent);
     75                 final int newCursorPosition = getInt1(intent);
     76                 mIme.commandCommitText(text, newCursorPosition);
     77                 return;
     78             }
     79             case ImeCommandConstants.COMMAND_SWITCH_INPUT_METHOD: {
     80                 final String imeId = getString1(intent);
     81                 mIme.commandSwitchInputMethod(imeId);
     82                 return;
     83             }
     84             case ImeCommandConstants.COMMAND_REQUEST_HIDE_SELF: {
     85                 final int flags = getInt1(intent);
     86                 mIme.commandRequestHideSelf(flags);
     87                 return;
     88             }
     89             case ImeCommandConstants.COMMAND_SWITCH_INPUT_METHOD_WITH_SUBTYPE: {
     90                 final String imeId = getString1(intent);
     91                 // we don't support mock imes with subtypes yet.
     92                 mIme.switchInputMethod(imeId, null /* subtype*/);
     93                 return;
     94             }
     95             case ImeCommandConstants.COMMAND_SWITCH_TO_NEXT_INPUT: {
     96                 mIme.switchToNextInputMethod(false);
     97                 return;
     98             }
     99             case ImeCommandConstants.COMMAND_SWITCH_TO_PREVIOUS_INPUT: {
    100                 mIme.switchToPreviousInputMethod();
    101                 return;
    102             }
    103             default: {
    104                 throw new UnsupportedOperationException("Unknown IME command: " + command);
    105             }
    106         }
    107     }
    108 
    109     private static CharSequence getCharSequence1(final Intent intent) {
    110         return intent.getCharSequenceExtra(ImeCommandConstants.EXTRA_ARG_CHARSEQUENCE1);
    111     }
    112 
    113     private static String getString1(final Intent intent) {
    114         return intent.getStringExtra(ImeCommandConstants.EXTRA_ARG_STRING1);
    115     }
    116 
    117     private static int getInt1(final Intent intent) {
    118         if (intent.hasExtra(ImeCommandConstants.EXTRA_ARG_INT1)) {
    119             return intent.getIntExtra(ImeCommandConstants.EXTRA_ARG_INT1, 0);
    120         }
    121         throw new IllegalArgumentException(
    122                 "Needs " + ImeCommandConstants.EXTRA_ARG_INT1 + " in " + intent);
    123     }
    124 }
    125