mirror of
https://gitlab.futo.org/keyboard/latinime.git
synced 2024-09-28 14:54:30 +01:00
135 lines
5.8 KiB
Java
135 lines
5.8 KiB
Java
|
/*
|
||
|
* Copyright (C) 2011 The Android Open Source Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||
|
* use this file except in compliance with the License. You may obtain a copy of
|
||
|
* the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||
|
* License for the specific language governing permissions and limitations under
|
||
|
* the License.
|
||
|
*/
|
||
|
|
||
|
package com.android.inputmethod.keyboard;
|
||
|
|
||
|
import android.content.Context;
|
||
|
import android.content.res.Configuration;
|
||
|
import android.content.res.Resources;
|
||
|
import android.util.DisplayMetrics;
|
||
|
import android.view.inputmethod.EditorInfo;
|
||
|
|
||
|
import com.android.inputmethod.latin.LatinIME;
|
||
|
import com.android.inputmethod.latin.R;
|
||
|
import com.android.inputmethod.latin.SettingsValues;
|
||
|
import com.android.inputmethod.latin.SubtypeSwitcher;
|
||
|
import com.android.inputmethod.latin.Utils;
|
||
|
|
||
|
import java.util.Locale;
|
||
|
|
||
|
/**
|
||
|
* This class has a set of {@link KeyboardId}s. Each of them represents a different keyboard
|
||
|
* specific to a keyboard state, such as alphabet, symbols, and so on. Layouts in the same
|
||
|
* {@link KeyboardSet} are related to each other.
|
||
|
* A {@link KeyboardSet} needs to be created for each {@link android.view.inputmethod.EditorInfo}.
|
||
|
*/
|
||
|
public class KeyboardSet {
|
||
|
// TODO: Make these KeyboardId private.
|
||
|
public final KeyboardId mAlphabetId;
|
||
|
public final KeyboardId mSymbolsId;
|
||
|
public final KeyboardId mSymbolsShiftedId;
|
||
|
|
||
|
KeyboardSet(Builder builder) {
|
||
|
mAlphabetId = builder.getKeyboardId(false, false);
|
||
|
mSymbolsId = builder.getKeyboardId(true, false);
|
||
|
mSymbolsShiftedId = builder.getKeyboardId(true, true);
|
||
|
}
|
||
|
|
||
|
public static class Builder {
|
||
|
private final Resources mResources;
|
||
|
private final EditorInfo mEditorInfo;
|
||
|
|
||
|
private final int mMode;
|
||
|
private final boolean mVoiceKeyEnabled;
|
||
|
private final boolean mNoSettingsKey;
|
||
|
private final boolean mHasSettingsKey;
|
||
|
private final int mF2KeyMode;
|
||
|
private final boolean mVoiceKeyOnMain;
|
||
|
private final Locale mLocale;
|
||
|
private final Configuration mConf;
|
||
|
private final DisplayMetrics mMetrics;
|
||
|
|
||
|
public Builder(Context context, EditorInfo editorInfo, SettingsValues settingsValues) {
|
||
|
mResources = context.getResources();
|
||
|
mEditorInfo = editorInfo;
|
||
|
final SubtypeSwitcher subtypeSwitcher = SubtypeSwitcher.getInstance();
|
||
|
final String packageName = context.getPackageName();
|
||
|
|
||
|
mMode = Utils.getKeyboardMode(mEditorInfo);
|
||
|
final boolean settingsKeyEnabled = settingsValues.isSettingsKeyEnabled();
|
||
|
@SuppressWarnings("deprecation")
|
||
|
final boolean noMicrophone = Utils.inPrivateImeOptions(
|
||
|
packageName, LatinIME.IME_OPTION_NO_MICROPHONE, editorInfo)
|
||
|
|| Utils.inPrivateImeOptions(
|
||
|
null, LatinIME.IME_OPTION_NO_MICROPHONE_COMPAT, editorInfo);
|
||
|
mVoiceKeyEnabled = settingsValues.isVoiceKeyEnabled(editorInfo) && !noMicrophone;
|
||
|
mVoiceKeyOnMain = settingsValues.isVoiceKeyOnMain();
|
||
|
mNoSettingsKey = Utils.inPrivateImeOptions(
|
||
|
packageName, LatinIME.IME_OPTION_NO_SETTINGS_KEY, editorInfo);
|
||
|
mHasSettingsKey = settingsKeyEnabled && !mNoSettingsKey;
|
||
|
mF2KeyMode = getF2KeyMode(settingsKeyEnabled, mNoSettingsKey);
|
||
|
final boolean forceAscii = Utils.inPrivateImeOptions(
|
||
|
packageName, LatinIME.IME_OPTION_FORCE_ASCII, editorInfo);
|
||
|
final boolean asciiCapable = subtypeSwitcher.currentSubtypeContainsExtraValueKey(
|
||
|
LatinIME.SUBTYPE_EXTRA_VALUE_ASCII_CAPABLE);
|
||
|
mLocale = (forceAscii && !asciiCapable) ? Locale.US : subtypeSwitcher.getInputLocale();
|
||
|
mConf = mResources.getConfiguration();
|
||
|
mMetrics = mResources.getDisplayMetrics();
|
||
|
}
|
||
|
|
||
|
public KeyboardSet build() {
|
||
|
return new KeyboardSet(this);
|
||
|
}
|
||
|
|
||
|
KeyboardId getKeyboardId(boolean isSymbols, boolean isShift) {
|
||
|
final int xmlId = getXmlId(mMode, isSymbols, isShift);
|
||
|
final boolean hasShortCutKey = mVoiceKeyEnabled && (isSymbols != mVoiceKeyOnMain);
|
||
|
return new KeyboardId(mResources.getResourceEntryName(xmlId), xmlId, mLocale,
|
||
|
mConf.orientation, mMetrics.widthPixels, mMode, mEditorInfo, mHasSettingsKey,
|
||
|
mF2KeyMode, mNoSettingsKey, mVoiceKeyEnabled, hasShortCutKey);
|
||
|
}
|
||
|
|
||
|
private static int getXmlId(int mode, boolean isSymbols, boolean isShift) {
|
||
|
switch (mode) {
|
||
|
case KeyboardId.MODE_PHONE:
|
||
|
return (isSymbols && isShift) ? R.xml.kbd_phone_shift : R.xml.kbd_phone;
|
||
|
case KeyboardId.MODE_NUMBER:
|
||
|
return R.xml.kbd_number;
|
||
|
default:
|
||
|
if (isSymbols) {
|
||
|
return isShift ? R.xml.kbd_symbols_shift : R.xml.kbd_symbols;
|
||
|
}
|
||
|
return R.xml.kbd_qwerty;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static int getF2KeyMode(boolean settingsKeyEnabled, boolean noSettingsKey) {
|
||
|
if (noSettingsKey) {
|
||
|
// Never shows the Settings key
|
||
|
return KeyboardId.F2KEY_MODE_SHORTCUT_IME;
|
||
|
}
|
||
|
|
||
|
if (settingsKeyEnabled) {
|
||
|
return KeyboardId.F2KEY_MODE_SETTINGS;
|
||
|
} else {
|
||
|
// It should be alright to fall back to the Settings key on 7-inch layouts
|
||
|
// even when the Settings key is not explicitly enabled.
|
||
|
return KeyboardId.F2KEY_MODE_SHORTCUT_IME_OR_SETTINGS;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|