Search in sources :

Example 46 with ImeSubtypeListItem

use of com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem in project android_frameworks_base by crdroidandroid.

the class InputMethodSubtypeSwitchingControllerTest method addDummyImeSubtypeListItems.

private static void addDummyImeSubtypeListItems(List<ImeSubtypeListItem> items, String imeName, String imeLabel, List<String> subtypeLocales, boolean supportsSwitchingToNextInputMethod) {
    final ResolveInfo ri = new ResolveInfo();
    final ServiceInfo si = new ServiceInfo();
    final ApplicationInfo ai = new ApplicationInfo();
    ai.packageName = DUMMY_PACKAGE_NAME;
    ai.enabled = true;
    si.applicationInfo = ai;
    si.enabled = true;
    si.packageName = DUMMY_PACKAGE_NAME;
    si.name = imeName;
    si.exported = true;
    si.nonLocalizedLabel = imeLabel;
    ri.serviceInfo = si;
    List<InputMethodSubtype> subtypes = null;
    if (subtypeLocales != null) {
        subtypes = new ArrayList<>();
        for (String subtypeLocale : subtypeLocales) {
            subtypes.add(createDummySubtype(subtypeLocale));
        }
    }
    final InputMethodInfo imi = new InputMethodInfo(ri, DUMMY_IS_AUX_IME, DUMMY_SETTING_ACTIVITY_NAME, subtypes, DUMMY_IS_DEFAULT_RES_ID, DUMMY_FORCE_DEFAULT, supportsSwitchingToNextInputMethod);
    if (subtypes == null) {
        items.add(new ImeSubtypeListItem(imeName, null, /* variableName */
        imi, NOT_A_SUBTYPE_ID, null, SYSTEM_LOCALE));
    } else {
        for (int i = 0; i < subtypes.size(); ++i) {
            final String subtypeLocale = subtypeLocales.get(i);
            items.add(new ImeSubtypeListItem(imeName, subtypeLocale, imi, i, subtypeLocale, SYSTEM_LOCALE));
        }
    }
}
Also used : ResolveInfo(android.content.pm.ResolveInfo) ServiceInfo(android.content.pm.ServiceInfo) InputMethodSubtype(android.view.inputmethod.InputMethodSubtype) ApplicationInfo(android.content.pm.ApplicationInfo) InputMethodInfo(android.view.inputmethod.InputMethodInfo) ImeSubtypeListItem(com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem)

Example 47 with ImeSubtypeListItem

use of com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem in project android_frameworks_base by crdroidandroid.

the class InputMethodSubtypeSwitchingControllerTest method testControllerImplWithUserAction.

@SmallTest
public void testControllerImplWithUserAction() throws Exception {
    final List<ImeSubtypeListItem> enabledItems = createEnabledImeSubtypes();
    final ImeSubtypeListItem latinIme_en_US = enabledItems.get(0);
    final ImeSubtypeListItem latinIme_fr = enabledItems.get(1);
    final ImeSubtypeListItem switchingUnawarelatinIme_en_UK = enabledItems.get(2);
    final ImeSubtypeListItem switchingUnawarelatinIme_hi = enabledItems.get(3);
    final ImeSubtypeListItem subtypeUnawareIme = enabledItems.get(4);
    final ImeSubtypeListItem japaneseIme_ja_JP = enabledItems.get(5);
    final ImeSubtypeListItem switchUnawareJapaneseIme_ja_JP = enabledItems.get(6);
    final ControllerImpl controller = ControllerImpl.createFrom(null, /* currentInstance */
    enabledItems);
    // === switching-aware loop ===
    assertRotationOrder(controller, false, /* onlyCurrentIme */
    latinIme_en_US, latinIme_fr, japaneseIme_ja_JP);
    // Then notify that a user did something for latinIme_fr.
    onUserAction(controller, latinIme_fr);
    assertRotationOrder(controller, false, /* onlyCurrentIme */
    latinIme_fr, latinIme_en_US, japaneseIme_ja_JP);
    // Then notify that a user did something for latinIme_fr again.
    onUserAction(controller, latinIme_fr);
    assertRotationOrder(controller, false, /* onlyCurrentIme */
    latinIme_fr, latinIme_en_US, japaneseIme_ja_JP);
    // Then notify that a user did something for japaneseIme_ja_JP.
    onUserAction(controller, latinIme_fr);
    assertRotationOrder(controller, false, /* onlyCurrentIme */
    japaneseIme_ja_JP, latinIme_fr, latinIme_en_US);
    // Check onlyCurrentIme == true.
    assertNextInputMethod(controller, true, /* onlyCurrentIme */
    japaneseIme_ja_JP, null, null);
    assertRotationOrder(controller, true, /* onlyCurrentIme */
    latinIme_fr, latinIme_en_US);
    assertRotationOrder(controller, true, /* onlyCurrentIme */
    latinIme_en_US, latinIme_fr);
    // === switching-unaware loop ===
    assertRotationOrder(controller, false, /* onlyCurrentIme */
    switchingUnawarelatinIme_en_UK, switchingUnawarelatinIme_hi, subtypeUnawareIme, switchUnawareJapaneseIme_ja_JP);
    // User action should be ignored for switching unaware IMEs.
    onUserAction(controller, switchingUnawarelatinIme_hi);
    assertRotationOrder(controller, false, /* onlyCurrentIme */
    switchingUnawarelatinIme_en_UK, switchingUnawarelatinIme_hi, subtypeUnawareIme, switchUnawareJapaneseIme_ja_JP);
    // User action should be ignored for switching unaware IMEs.
    onUserAction(controller, switchUnawareJapaneseIme_ja_JP);
    assertRotationOrder(controller, false, /* onlyCurrentIme */
    switchingUnawarelatinIme_en_UK, switchingUnawarelatinIme_hi, subtypeUnawareIme, switchUnawareJapaneseIme_ja_JP);
    // Check onlyCurrentIme == true.
    assertRotationOrder(controller, true, /* onlyCurrentIme */
    switchingUnawarelatinIme_en_UK, switchingUnawarelatinIme_hi);
    assertNextInputMethod(controller, true, /* onlyCurrentIme */
    subtypeUnawareIme, null, null);
    assertNextInputMethod(controller, true, /* onlyCurrentIme */
    switchUnawareJapaneseIme_ja_JP, null, null);
    // Rotation order should be preserved when created with the same subtype list.
    final List<ImeSubtypeListItem> sameEnabledItems = createEnabledImeSubtypes();
    final ControllerImpl newController = ControllerImpl.createFrom(controller, sameEnabledItems);
    assertRotationOrder(newController, false, /* onlyCurrentIme */
    japaneseIme_ja_JP, latinIme_fr, latinIme_en_US);
    assertRotationOrder(newController, false, /* onlyCurrentIme */
    switchingUnawarelatinIme_en_UK, switchingUnawarelatinIme_hi, subtypeUnawareIme, switchUnawareJapaneseIme_ja_JP);
    // Rotation order should be initialized when created with a different subtype list.
    final List<ImeSubtypeListItem> differentEnabledItems = Arrays.asList(latinIme_en_US, latinIme_fr, switchingUnawarelatinIme_en_UK, switchUnawareJapaneseIme_ja_JP);
    final ControllerImpl anotherController = ControllerImpl.createFrom(controller, differentEnabledItems);
    assertRotationOrder(anotherController, false, /* onlyCurrentIme */
    latinIme_en_US, latinIme_fr);
    assertRotationOrder(anotherController, false, /* onlyCurrentIme */
    switchingUnawarelatinIme_en_UK, switchUnawareJapaneseIme_ja_JP);
}
Also used : ControllerImpl(com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ControllerImpl) ImeSubtypeListItem(com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem) SmallTest(android.test.suitebuilder.annotation.SmallTest)

Example 48 with ImeSubtypeListItem

use of com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem in project android_frameworks_base by crdroidandroid.

the class InputMethodManagerService method switchToNextInputMethod.

@Override
public boolean switchToNextInputMethod(IBinder token, boolean onlyCurrentIme) {
    if (!calledFromValidUser()) {
        return false;
    }
    synchronized (mMethodMap) {
        if (!calledWithValidToken(token)) {
            final int uid = Binder.getCallingUid();
            Slog.e(TAG, "Ignoring switchToNextInputMethod due to an invalid token. uid:" + uid + " token:" + token);
            return false;
        }
        final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked(onlyCurrentIme, mMethodMap.get(mCurMethodId), mCurrentSubtype, true);
        if (nextSubtype == null) {
            return false;
        }
        setInputMethodWithSubtypeIdLocked(token, nextSubtype.mImi.getId(), nextSubtype.mSubtypeId);
        return true;
    }
}
Also used : ImeSubtypeListItem(com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem)

Example 49 with ImeSubtypeListItem

use of com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem in project android_frameworks_base by crdroidandroid.

the class InputMethodManagerService method handleSwitchInputMethod.

private void handleSwitchInputMethod(final boolean forwardDirection) {
    synchronized (mMethodMap) {
        final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked(false, mMethodMap.get(mCurMethodId), mCurrentSubtype, forwardDirection);
        if (nextSubtype == null) {
            return;
        }
        setInputMethodLocked(nextSubtype.mImi.getId(), nextSubtype.mSubtypeId);
        final InputMethodInfo newInputMethodInfo = mMethodMap.get(mCurMethodId);
        if (newInputMethodInfo == null) {
            return;
        }
        final CharSequence toastText = InputMethodUtils.getImeAndSubtypeDisplayName(mContext, newInputMethodInfo, mCurrentSubtype);
        if (!TextUtils.isEmpty(toastText)) {
            if (mSubtypeSwitchedByShortCutToast == null) {
                mSubtypeSwitchedByShortCutToast = Toast.makeText(mContext, toastText, Toast.LENGTH_SHORT);
            } else {
                mSubtypeSwitchedByShortCutToast.setText(toastText);
            }
            mSubtypeSwitchedByShortCutToast.show();
        }
    }
}
Also used : InputMethodInfo(android.view.inputmethod.InputMethodInfo) ImeSubtypeListItem(com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem)

Example 50 with ImeSubtypeListItem

use of com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem in project android_frameworks_base by crdroidandroid.

the class InputMethodManagerService method showInputMethodMenu.

private void showInputMethodMenu(boolean showAuxSubtypes) {
    if (DEBUG)
        Slog.v(TAG, "Show switching menu. showAuxSubtypes=" + showAuxSubtypes);
    final Context context = mContext;
    final boolean isScreenLocked = isScreenLocked();
    final String lastInputMethodId = mSettings.getSelectedInputMethod();
    int lastInputMethodSubtypeId = mSettings.getSelectedInputMethodSubtypeId(lastInputMethodId);
    if (DEBUG)
        Slog.v(TAG, "Current IME: " + lastInputMethodId);
    synchronized (mMethodMap) {
        final HashMap<InputMethodInfo, List<InputMethodSubtype>> immis = mSettings.getExplicitlyOrImplicitlyEnabledInputMethodsAndSubtypeListLocked(mContext);
        if (immis == null || immis.size() == 0) {
            return;
        }
        hideInputMethodMenuLocked();
        final List<ImeSubtypeListItem> imList = mSwitchingController.getSortedInputMethodAndSubtypeListLocked(showAuxSubtypes, isScreenLocked);
        if (lastInputMethodSubtypeId == NOT_A_SUBTYPE_ID) {
            final InputMethodSubtype currentSubtype = getCurrentInputMethodSubtypeLocked();
            if (currentSubtype != null) {
                final InputMethodInfo currentImi = mMethodMap.get(mCurMethodId);
                lastInputMethodSubtypeId = InputMethodUtils.getSubtypeIdFromHashCode(currentImi, currentSubtype.hashCode());
            }
        }
        final int N = imList.size();
        mIms = new InputMethodInfo[N];
        mSubtypeIds = new int[N];
        int checkedItem = 0;
        for (int i = 0; i < N; ++i) {
            final ImeSubtypeListItem item = imList.get(i);
            mIms[i] = item.mImi;
            mSubtypeIds[i] = item.mSubtypeId;
            if (mIms[i].getId().equals(lastInputMethodId)) {
                int subtypeId = mSubtypeIds[i];
                if ((subtypeId == NOT_A_SUBTYPE_ID) || (lastInputMethodSubtypeId == NOT_A_SUBTYPE_ID && subtypeId == 0) || (subtypeId == lastInputMethodSubtypeId)) {
                    checkedItem = i;
                }
            }
        }
        final Context settingsContext = new ContextThemeWrapper(context, com.android.internal.R.style.Theme_DeviceDefault_Settings);
        mDialogBuilder = new AlertDialog.Builder(settingsContext);
        mDialogBuilder.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                hideInputMethodMenu();
            }
        });
        final Context dialogContext = mDialogBuilder.getContext();
        final TypedArray a = dialogContext.obtainStyledAttributes(null, com.android.internal.R.styleable.DialogPreference, com.android.internal.R.attr.alertDialogStyle, 0);
        final Drawable dialogIcon = a.getDrawable(com.android.internal.R.styleable.DialogPreference_dialogIcon);
        a.recycle();
        mDialogBuilder.setIcon(dialogIcon);
        final LayoutInflater inflater = dialogContext.getSystemService(LayoutInflater.class);
        final View tv = inflater.inflate(com.android.internal.R.layout.input_method_switch_dialog_title, null);
        mDialogBuilder.setCustomTitle(tv);
        // Setup layout for a toggle switch of the hardware keyboard
        mSwitchingDialogTitleView = tv;
        mSwitchingDialogTitleView.findViewById(com.android.internal.R.id.hard_keyboard_section).setVisibility(mWindowManagerInternal.isHardKeyboardAvailable() ? View.VISIBLE : View.GONE);
        final Switch hardKeySwitch = (Switch) mSwitchingDialogTitleView.findViewById(com.android.internal.R.id.hard_keyboard_switch);
        hardKeySwitch.setChecked(mShowImeWithHardKeyboard);
        hardKeySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                mSettings.setShowImeWithHardKeyboard(isChecked);
                // Ensure that the input method dialog is dismissed when changing
                // the hardware keyboard state.
                hideInputMethodMenu();
            }
        });
        final ImeSubtypeListAdapter adapter = new ImeSubtypeListAdapter(dialogContext, com.android.internal.R.layout.input_method_switch_item, imList, checkedItem);
        final OnClickListener choiceListener = new OnClickListener() {

            @Override
            public void onClick(final DialogInterface dialog, final int which) {
                synchronized (mMethodMap) {
                    if (mIms == null || mIms.length <= which || mSubtypeIds == null || mSubtypeIds.length <= which) {
                        return;
                    }
                    final InputMethodInfo im = mIms[which];
                    int subtypeId = mSubtypeIds[which];
                    adapter.mCheckedItem = which;
                    adapter.notifyDataSetChanged();
                    hideInputMethodMenu();
                    if (im != null) {
                        if (subtypeId < 0 || subtypeId >= im.getSubtypeCount()) {
                            subtypeId = NOT_A_SUBTYPE_ID;
                        }
                        setInputMethodLocked(im.getId(), subtypeId);
                    }
                }
            }
        };
        mDialogBuilder.setSingleChoiceItems(adapter, checkedItem, choiceListener);
        mSwitchingDialog = mDialogBuilder.create();
        mSwitchingDialog.setCanceledOnTouchOutside(true);
        mSwitchingDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG);
        mSwitchingDialog.getWindow().getAttributes().privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
        mSwitchingDialog.getWindow().getAttributes().setTitle("Select input method");
        updateSystemUi(mCurToken, mImeWindowVis, mBackDisposition);
        mSwitchingDialog.show();
    }
}
Also used : AlertDialog(android.app.AlertDialog) DialogInterface(android.content.DialogInterface) InputMethodInfo(android.view.inputmethod.InputMethodInfo) TypedArray(android.content.res.TypedArray) ArrayList(java.util.ArrayList) List(java.util.List) LocaleList(android.os.LocaleList) OnCancelListener(android.content.DialogInterface.OnCancelListener) IInputContext(com.android.internal.view.IInputContext) Context(android.content.Context) InputMethodSubtype(android.view.inputmethod.InputMethodSubtype) OnCheckedChangeListener(android.widget.CompoundButton.OnCheckedChangeListener) Drawable(android.graphics.drawable.Drawable) View(android.view.View) TextView(android.widget.TextView) ImeSubtypeListItem(com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem) ContextThemeWrapper(android.view.ContextThemeWrapper) Switch(android.widget.Switch) LayoutInflater(android.view.LayoutInflater) OnClickListener(android.content.DialogInterface.OnClickListener) CompoundButton(android.widget.CompoundButton)

Aggregations

ImeSubtypeListItem (com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ImeSubtypeListItem)50 SmallTest (android.test.suitebuilder.annotation.SmallTest)15 InputMethodInfo (android.view.inputmethod.InputMethodInfo)15 InputMethodSubtype (android.view.inputmethod.InputMethodSubtype)15 ControllerImpl (com.android.internal.inputmethod.InputMethodSubtypeSwitchingController.ControllerImpl)10 ArrayList (java.util.ArrayList)10 AlertDialog (android.app.AlertDialog)5 Context (android.content.Context)5 DialogInterface (android.content.DialogInterface)5 OnCancelListener (android.content.DialogInterface.OnCancelListener)5 OnClickListener (android.content.DialogInterface.OnClickListener)5 ApplicationInfo (android.content.pm.ApplicationInfo)5 ResolveInfo (android.content.pm.ResolveInfo)5 ServiceInfo (android.content.pm.ServiceInfo)5 TypedArray (android.content.res.TypedArray)5 Drawable (android.graphics.drawable.Drawable)5 LocaleList (android.os.LocaleList)5 ContextThemeWrapper (android.view.ContextThemeWrapper)5 LayoutInflater (android.view.LayoutInflater)5 View (android.view.View)5