remove more unused code, solve some warnings, ...

This commit is contained in:
Helium314 2024-01-01 19:20:28 +01:00
parent 92c08e40ef
commit 7c5b96a034
40 changed files with 94 additions and 500 deletions

View file

@ -125,10 +125,6 @@
</intent-filter>
</activity>
<!-- Unexported activity used for tests. -->
<activity android:name=".settings.TestFragmentActivity"
android:exported="false" />
<!-- Broadcast receivers -->
<receiver android:name="SystemBroadcastReceiver"
android:exported="true">

View file

@ -10,7 +10,7 @@ import android.os.Build
import android.os.Build.VERSION_CODES
import android.view.inputmethod.InputMethodSubtype
import org.dslul.openboard.inputmethod.latin.common.LocaleUtils
import org.dslul.openboard.inputmethod.latin.settings.locale
import org.dslul.openboard.inputmethod.latin.utils.locale
import java.util.*
object InputMethodSubtypeCompatUtils {

View file

@ -131,7 +131,7 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions {
.setNumberRowEnabled(settingsValues.mShowsNumberRow)
.setLanguageSwitchKeyEnabled(settingsValues.isLanguageSwitchKeyEnabled())
.setEmojiKeyEnabled(settingsValues.mShowsEmojiKey)
.setSplitLayoutEnabled(ProductionFlags.IS_SPLIT_KEYBOARD_SUPPORTED && settingsValues.mIsSplitKeyboardEnabled)
.setSplitLayoutEnabled(settingsValues.mIsSplitKeyboardEnabled)
.setOneHandedModeEnabled(oneHandedModeEnabled)
.build();
try {

View file

@ -69,7 +69,6 @@ import org.dslul.openboard.inputmethod.latin.permissions.PermissionsManager;
import org.dslul.openboard.inputmethod.latin.personalization.PersonalizationHelper;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsActivity;
import org.dslul.openboard.inputmethod.latin.settings.SubtypeSettingsKt;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import org.dslul.openboard.inputmethod.latin.suggestions.SuggestionStripView;
import org.dslul.openboard.inputmethod.latin.suggestions.SuggestionStripViewAccessor;
@ -84,6 +83,7 @@ import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.latin.utils.StatsUtils;
import org.dslul.openboard.inputmethod.latin.utils.StatsUtilsManager;
import org.dslul.openboard.inputmethod.latin.utils.SubtypeLocaleUtils;
import org.dslul.openboard.inputmethod.latin.utils.SubtypeSettingsKt;
import org.dslul.openboard.inputmethod.latin.utils.ViewLayoutUtils;
import java.io.FileDescriptor;

View file

@ -19,11 +19,11 @@ import android.view.inputmethod.InputMethodSubtype;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.compat.InputMethodSubtypeCompatUtils;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SubtypeSettingsKt;
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils;
import org.dslul.openboard.inputmethod.latin.utils.LanguageOnSpacebarUtils;
import org.dslul.openboard.inputmethod.latin.utils.ScriptUtils;
import org.dslul.openboard.inputmethod.latin.utils.SubtypeLocaleUtils;
import org.dslul.openboard.inputmethod.latin.utils.SubtypeSettingsKt;
import java.util.Collections;
import java.util.HashMap;

View file

@ -74,16 +74,6 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary {
ContentResolver cres = context.getContentResolver();
mObserver = new ContentObserver(null) {
@Override
public void onChange(final boolean self) {
// This hook is deprecated as of API level 16 (Build.VERSION_CODES.JELLY_BEAN),
// but should still be supported for cases where the IME is running on an older
// version of the platform.
onChange(self, null);
}
// The following hook is only available as of API level 16
// (Build.VERSION_CODES.JELLY_BEAN), and as such it will only work on JellyBean+
// devices. On older versions of the platform, the hook above will be called instead.
@Override
public void onChange(final boolean self, final Uri uri) {
setNeedsToRecreate();
@ -98,9 +88,7 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary {
public static UserBinaryDictionary getDictionary(
final Context context, final Locale locale, final File dictFile,
final String dictNamePrefix, @Nullable final String account) {
return new UserBinaryDictionary(
context, locale, false /* alsoUseMoreRestrictiveLocales */,
dictFile, dictNamePrefix + NAME);
return new UserBinaryDictionary(context, locale, false, dictFile, dictNamePrefix + NAME);
}
@Override

View file

@ -1,21 +0,0 @@
/*
* Copyright (C) 2011 The Android Open Source Project
* modified
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
*/
package org.dslul.openboard.inputmethod.latin;
/**
* Information container for a word list.
*/
public final class WordListInfo {
public final String mId;
public final String mLocale;
public final String mRawChecksum;
public WordListInfo(final String id, final String locale, final String rawChecksum) {
mId = id;
mLocale = locale;
mRawChecksum = rawChecksum;
}
}

View file

@ -1,13 +0,0 @@
/*
* Copyright (C) 2011 The Android Open Source Project
* modified
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
*/
package org.dslul.openboard.inputmethod.latin.define
object JniLibName {
const val JNI_LIB_NAME = "jni_latinime"
const val JNI_LIB_NAME_GOOGLE = "jni_latinimegoogle"
const val JNI_LIB_IMPORT_FILE_NAME = "libjni_latinime.so"
}

View file

@ -16,9 +16,4 @@ object ProductionFlags {
* [org.dslul.openboard.inputmethod.latin.SuggestedWords.mRawSuggestions].
*/
const val INCLUDE_RAW_SUGGESTIONS = false
/**
* When `false`, the split keyboard is not yet ready to be enabled.
*/
const val IS_SPLIT_KEYBOARD_SUPPORTED = true
}

View file

@ -1,47 +0,0 @@
/*
* Copyright (C) 2013 The Android Open Source Project
* modified
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
*/
package org.dslul.openboard.inputmethod.latin.settings;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceFragment;
import android.view.inputmethod.InputMethodSubtype;
import androidx.annotation.NonNull;
import org.dslul.openboard.inputmethod.latin.RichInputMethodManager;
import org.dslul.openboard.inputmethod.latin.RichInputMethodSubtype;
/**
* Utility class for managing additional features settings.
*/
@SuppressWarnings("unused")
public class AdditionalFeaturesSettingUtils {
public static final int ADDITIONAL_FEATURES_SETTINGS_SIZE = 0;
private AdditionalFeaturesSettingUtils() {
// This utility class is not publicly instantiable.
}
public static void addAdditionalFeaturesPreferences(
final Context context, final PreferenceFragment settingsFragment) {
// do nothing.
}
public static void readAdditionalFeaturesPreferencesIntoArray(final Context context,
final SharedPreferences prefs, final int[] additionalFeaturesPreferences) {
// do nothing.
}
@NonNull
public static RichInputMethodSubtype createRichInputMethodSubtype(
@NonNull final RichInputMethodManager imm,
@NonNull final InputMethodSubtype subtype,
final Context context) {
return new RichInputMethodSubtype(subtype);
}
}

View file

@ -25,8 +25,9 @@ import org.dslul.openboard.inputmethod.latin.BuildConfig
import org.dslul.openboard.inputmethod.latin.R
import org.dslul.openboard.inputmethod.latin.SystemBroadcastReceiver
import org.dslul.openboard.inputmethod.latin.common.FileUtils
import org.dslul.openboard.inputmethod.latin.define.JniLibName
import org.dslul.openboard.inputmethod.latin.settings.SeekBarDialogPreference.ValueProxy
import org.dslul.openboard.inputmethod.latin.utils.JniUtils
import org.dslul.openboard.inputmethod.latin.utils.infoDialog
import java.io.File
import java.io.FileInputStream
import java.io.IOException
@ -118,7 +119,7 @@ class AdvancedSettingsFragment : SubScreenFragment() {
libraryFilePicker.launch(intent)
}
.setNegativeButton(android.R.string.cancel, null)
libfile = File(requireContext().filesDir.absolutePath + File.separator + JniLibName.JNI_LIB_IMPORT_FILE_NAME)
libfile = File(requireContext().filesDir.absolutePath + File.separator + JniUtils.JNI_LIB_IMPORT_FILE_NAME)
if (libfile?.exists() == true) {
builder.setNeutralButton(R.string.load_gesture_library_button_delete) { _, _ ->
libfile?.delete()

View file

@ -86,7 +86,7 @@ class AppearanceSettingsFragment : SubScreenFragment() {
val metrics = requireContext().resources.displayMetrics
val widthDp = metrics.widthPixels / metrics.density
val heightDp = metrics.heightPixels / metrics.density
if (!ProductionFlags.IS_SPLIT_KEYBOARD_SUPPORTED || (min(widthDp, heightDp) < 600 && max(widthDp, heightDp) < 720)) {
if ((min(widthDp, heightDp) < 600 && max(widthDp, heightDp) < 720)) {
removePreference(Settings.PREF_ENABLE_SPLIT_KEYBOARD)
removePreference(Settings.PREF_SPLIT_SPACER_SCALE)
}

View file

@ -25,7 +25,7 @@ import org.dslul.openboard.inputmethod.latin.utils.ApplicationUtils;
/**
* "Debug mode" settings sub screen.
*
* <p>
* This settings sub screen handles a several preference options for debugging.
*/
public final class DebugSettingsFragment extends SubScreenFragment
@ -73,8 +73,7 @@ public final class DebugSettingsFragment extends SubScreenFragment
@Override
public boolean onPreferenceClick(@NonNull final Preference pref) {
if (pref instanceof DictDumpPreference) {
final DictDumpPreference dictDumpPref = (DictDumpPreference)pref;
if (pref instanceof final DictDumpPreference dictDumpPref) {
final String dictName = dictDumpPref.mDictName;
final Intent intent = new Intent(
DictionaryDumpBroadcastReceiver.DICTIONARY_DUMP_INTENT_ACTION);
@ -95,7 +94,7 @@ public final class DebugSettingsFragment extends SubScreenFragment
@Override
public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
if (key.equals(DebugSettings.PREF_DEBUG_MODE) && mDebugMode != null) {
if (DebugSettings.PREF_DEBUG_MODE.equals(key) && mDebugMode != null) {
final boolean enabled = prefs.getBoolean(DebugSettings.PREF_DEBUG_MODE, false);
mDebugMode.setChecked(enabled);
findPreference(DebugSettings.PREF_SHOW_SUGGESTION_INFOS).setVisible(enabled);

View file

@ -7,14 +7,13 @@
package org.dslul.openboard.inputmethod.latin.settings;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Bundle;
import org.dslul.openboard.inputmethod.latin.R;
/**
* "Gesture typing preferences" settings sub screen.
*
* <p>
* This settings sub screen handles the following gesture typing preferences.
* - Enable gesture typing
* - Dynamic floating preview
@ -36,12 +35,8 @@ public final class GestureSettingsFragment extends SubScreenFragment {
private void refreshSettingsEnablement() {
final SharedPreferences prefs = getSharedPreferences();
final Resources res = getResources();
setPreferenceVisible(Settings.PREF_GESTURE_PREVIEW_TRAIL,
Settings.readGestureInputEnabled(prefs));
setPreferenceVisible(Settings.PREF_GESTURE_FLOATING_PREVIEW_TEXT,
Settings.readGestureInputEnabled(prefs));
setPreferenceVisible(Settings.PREF_GESTURE_SPACE_AWARE,
Settings.readGestureInputEnabled(prefs));
setPreferenceVisible(Settings.PREF_GESTURE_PREVIEW_TRAIL, Settings.readGestureInputEnabled(prefs));
setPreferenceVisible(Settings.PREF_GESTURE_FLOATING_PREVIEW_TEXT, Settings.readGestureInputEnabled(prefs));
setPreferenceVisible(Settings.PREF_GESTURE_SPACE_AWARE, Settings.readGestureInputEnabled(prefs));
}
}

View file

@ -23,6 +23,10 @@ import org.dslul.openboard.inputmethod.latin.R
import org.dslul.openboard.inputmethod.latin.common.LocaleUtils
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils
import org.dslul.openboard.inputmethod.latin.utils.SubtypeLocaleUtils
import org.dslul.openboard.inputmethod.latin.utils.addEnabledSubtype
import org.dslul.openboard.inputmethod.latin.utils.isAdditionalSubtype
import org.dslul.openboard.inputmethod.latin.utils.locale
import org.dslul.openboard.inputmethod.latin.utils.removeEnabledSubtype
import org.dslul.openboard.inputmethod.latin.utils.showMissingDictionaryDialog
import org.dslul.openboard.inputmethod.latin.utils.toLocale

View file

@ -4,12 +4,11 @@ package org.dslul.openboard.inputmethod.latin.settings
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.text.InputType
import android.os.Build
import android.text.method.LinkMovementMethod
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.widget.EditText
import android.widget.ImageView
import android.widget.ScrollView
import android.widget.TextView
@ -19,7 +18,6 @@ import androidx.core.view.get
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.size
import androidx.core.widget.doAfterTextChanged
import org.dslul.openboard.inputmethod.dictionarypack.DictionaryPackConstants
import org.dslul.openboard.inputmethod.keyboard.KeyboardLayoutSet
import org.dslul.openboard.inputmethod.keyboard.KeyboardSwitcher
@ -45,7 +43,7 @@ class LanguageSettingsDialog(
private val mainLocaleString = infos.first().subtype.locale()
private val mainLocale = mainLocaleString.toLocale()
private var hasInternalDictForLanguage = false
private lateinit var userDicts: MutableSet<File>
private val userDicts = mutableSetOf<File>()
init {
setTitle(infos.first().displayName)
@ -282,9 +280,9 @@ class LanguageSettingsDialog(
dialog.show()
(dialog.findViewById<View>(android.R.id.message) as? TextView)?.movementMethod = LinkMovementMethod.getInstance()
}
val (_userDicts, _hasInternalDictForLanguage) = getUserAndInternalDictionaries(context, mainLocaleString)
userDicts = _userDicts.toMutableSet()
hasInternalDictForLanguage = _hasInternalDictForLanguage
val userDictsAndHasInternal = getUserAndInternalDictionaries(context, mainLocaleString)
hasInternalDictForLanguage = userDictsAndHasInternal.second
userDicts.addAll(userDictsAndHasInternal.first)
if (hasInternalDictForLanguage) {
binding.dictionaries.addView(TextView(context, null, R.style.PreferenceCategoryTitleText).apply {
setText(R.string.internal_dictionary_summary)
@ -332,8 +330,13 @@ class LanguageSettingsDialog(
}
rowBinding.languageText.setOnClickListener {
if (header == null) return@setOnClickListener
val locale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
context.resources.configuration.locales[0]
} else {
@Suppress("Deprecation") context.resources.configuration.locale
}
Builder(context)
.setMessage(header.info(context.resources.configuration.locale))
.setMessage(header.info(locale))
.setPositiveButton(android.R.string.ok, null)
.show()
}

View file

@ -22,7 +22,11 @@ import org.dslul.openboard.inputmethod.latin.common.LocaleUtils
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils
import org.dslul.openboard.inputmethod.latin.utils.DictionaryInfoUtils
import org.dslul.openboard.inputmethod.latin.utils.SubtypeLocaleUtils
import org.dslul.openboard.inputmethod.latin.utils.getAllAvailableSubtypes
import org.dslul.openboard.inputmethod.latin.utils.getDictionaryLocales
import org.dslul.openboard.inputmethod.latin.utils.getEnabledSubtypes
import org.dslul.openboard.inputmethod.latin.utils.getSystemLocales
import org.dslul.openboard.inputmethod.latin.utils.locale
import java.util.*
// not a SettingsFragment, because with androidx.preferences it's very complicated or

View file

@ -25,6 +25,7 @@ import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.RichInputMethodManager;
import org.dslul.openboard.inputmethod.latin.utils.MoreKeysUtilsKt;
import org.dslul.openboard.inputmethod.latin.utils.SubtypeSettingsKt;
import org.dslul.openboard.inputmethod.latin.utils.ToolbarUtilsKt;
import kotlin.collections.ArraysKt;

View file

@ -37,6 +37,7 @@ import org.dslul.openboard.inputmethod.latin.utils.JniUtils;
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils;
import org.dslul.openboard.inputmethod.latin.utils.RunInLocale;
import org.dslul.openboard.inputmethod.latin.utils.StatsUtils;
import org.dslul.openboard.inputmethod.latin.utils.SubtypeSettingsKt;
import org.dslul.openboard.inputmethod.latin.utils.ToolbarKey;
import org.dslul.openboard.inputmethod.latin.utils.ToolbarUtilsKt;

View file

@ -15,6 +15,7 @@ import android.os.Bundle;
import org.dslul.openboard.inputmethod.latin.permissions.PermissionsManager;
import org.dslul.openboard.inputmethod.latin.utils.NewDictionaryAdder;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
@ -24,12 +25,7 @@ public final class SettingsActivity extends AppCompatActivity
private static final String DEFAULT_FRAGMENT = SettingsFragment.class.getName();
public static final String EXTRA_ENTRY_KEY = "entry";
public static final String EXTRA_ENTRY_VALUE_LONG_PRESS_COMMA = "long_press_comma";
public static final String EXTRA_ENTRY_VALUE_APP_ICON = "app_icon";
public static final String EXTRA_ENTRY_VALUE_NOTICE_DIALOG = "important_notice";
public static final String EXTRA_ENTRY_VALUE_SYSTEM_SETTINGS = "system_settings";
private boolean mShowHomeAsUp;
@Override
protected void onCreate(final Bundle savedState) {
@ -68,7 +64,7 @@ public final class SettingsActivity extends AppCompatActivity
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionsManager.get(this).onRequestPermissionsResult(requestCode, permissions, grantResults);
}

View file

@ -12,14 +12,10 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings.Secure;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.inputmethod.InputMethodSubtype;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
@ -36,8 +32,8 @@ import org.dslul.openboard.inputmethod.latin.utils.ApplicationUtils;
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils;
import org.dslul.openboard.inputmethod.latin.utils.DictionaryUtilsKt;
import org.dslul.openboard.inputmethod.latin.utils.ExecutorUtils;
import org.dslul.openboard.inputmethod.latin.utils.FeedbackUtils;
import org.dslul.openboard.inputmethod.latin.utils.JniUtils;
import org.dslul.openboard.inputmethod.latin.utils.SubtypeSettingsKt;
import java.util.List;
import java.io.BufferedOutputStream;
@ -50,13 +46,6 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public final class SettingsFragment extends PreferenceFragmentCompat {
// We don't care about menu grouping.
private static final int NO_MENU_GROUP = Menu.NONE;
// The first menu item id and order.
private static final int MENU_ABOUT = Menu.FIRST;
// The second menu item id and order.
private static final int MENU_HELP_AND_FEEDBACK = Menu.FIRST + 1;
// for storing crash report files, so onActivityResult can actually use them
private final ArrayList<File> crashReportFiles = new ArrayList<>();
@Override
@ -100,41 +89,6 @@ public final class SettingsFragment extends PreferenceFragmentCompat {
askAboutCrashReports();
}
@Override
public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) {
if (FeedbackUtils.isHelpAndFeedbackFormSupported()) {
menu.add(NO_MENU_GROUP, MENU_HELP_AND_FEEDBACK /* itemId */,
MENU_HELP_AND_FEEDBACK /* order */, R.string.help_and_feedback);
}
final int aboutResId = FeedbackUtils.getAboutKeyboardTitleResId();
if (aboutResId != 0) {
menu.add(NO_MENU_GROUP, MENU_ABOUT /* itemId */, MENU_ABOUT /* order */, aboutResId);
}
}
@Override
public boolean onOptionsItemSelected(@NonNull final MenuItem item) {
final Activity activity = getActivity();
if (!isUserSetupComplete(activity)) {
// If setup is not complete, it's not safe to launch Help or other activities
// because they might go to the Play Store. See b/19866981.
return true;
}
final int itemId = item.getItemId();
if (itemId == MENU_HELP_AND_FEEDBACK) {
FeedbackUtils.showHelpAndFeedbackForm(activity);
return true;
}
if (itemId == MENU_ABOUT) {
final Intent aboutIntent = FeedbackUtils.getAboutKeyboardIntent(activity);
if (aboutIntent != null) {
startActivity(aboutIntent);
return true;
}
}
return super.onOptionsItemSelected(item);
}
private static boolean isUserSetupComplete(final Activity activity) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
return true;

View file

@ -28,6 +28,7 @@ import org.dslul.openboard.inputmethod.latin.spellcheck.AndroidSpellCheckerServi
import org.dslul.openboard.inputmethod.latin.utils.AsyncResultHolder;
import org.dslul.openboard.inputmethod.latin.utils.MoreKeysUtilsKt;
import org.dslul.openboard.inputmethod.latin.utils.ScriptUtils;
import org.dslul.openboard.inputmethod.latin.utils.SubtypeSettingsKt;
import org.dslul.openboard.inputmethod.latin.utils.TargetPackageInfoGetterTask;
import java.util.Arrays;

View file

@ -8,7 +8,6 @@ package org.dslul.openboard.inputmethod.latin.settings;
import android.content.res.Resources;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.keyboard.internal.MoreKeySpec;
import org.dslul.openboard.inputmethod.latin.PunctuationSuggestions;
import org.dslul.openboard.inputmethod.latin.R;
@ -61,25 +60,6 @@ public final class SpacingAndPunctuations {
mSuggestPuncList = PunctuationSuggestions.newPunctuationSuggestions(suggestPuncsSpec);
}
@UsedForTesting
public SpacingAndPunctuations(final SpacingAndPunctuations model,
final int[] overrideSortedWordSeparators) {
mSortedSymbolsPrecededBySpace = model.mSortedSymbolsPrecededBySpace;
mSortedSymbolsFollowedBySpace = model.mSortedSymbolsFollowedBySpace;
mSortedSymbolsClusteringTogether = model.mSortedSymbolsClusteringTogether;
mSortedWordConnectors = model.mSortedWordConnectors;
mSortedSometimesWordConnectors = model.mSortedSometimesWordConnectors;
mSortedWordSeparators = overrideSortedWordSeparators;
mSortedSentenceTerminators = model.mSortedSentenceTerminators;
mSuggestPuncList = model.mSuggestPuncList;
mSentenceSeparator = model.mSentenceSeparator;
mAbbreviationMarker = model.mAbbreviationMarker;
mSentenceSeparatorAndSpace = model.mSentenceSeparatorAndSpace;
mCurrentLanguageHasSpaces = model.mCurrentLanguageHasSpaces;
mUsesAmericanTypography = model.mUsesAmericanTypography;
mUsesGermanRules = model.mUsesGermanRules;
}
public boolean isWordSeparator(final int code) {
return Arrays.binarySearch(mSortedWordSeparators, code) >= 0;
}
@ -130,27 +110,25 @@ public final class SpacingAndPunctuations {
}
public String dump() {
final StringBuilder sb = new StringBuilder();
sb.append("mSortedSymbolsPrecededBySpace = ");
sb.append("" + Arrays.toString(mSortedSymbolsPrecededBySpace));
sb.append("\n mSortedSymbolsFollowedBySpace = ");
sb.append("" + Arrays.toString(mSortedSymbolsFollowedBySpace));
sb.append("\n mSortedWordConnectors = ");
sb.append("" + Arrays.toString(mSortedWordConnectors));
sb.append("\n mSortedWordSeparators = ");
sb.append("" + Arrays.toString(mSortedWordSeparators));
sb.append("\n mSuggestPuncList = ");
sb.append("" + mSuggestPuncList);
sb.append("\n mSentenceSeparator = ");
sb.append("" + mSentenceSeparator);
sb.append("\n mSentenceSeparatorAndSpace = ");
sb.append("" + mSentenceSeparatorAndSpace);
sb.append("\n mCurrentLanguageHasSpaces = ");
sb.append("" + mCurrentLanguageHasSpaces);
sb.append("\n mUsesAmericanTypography = ");
sb.append("" + mUsesAmericanTypography);
sb.append("\n mUsesGermanRules = ");
sb.append("" + mUsesGermanRules);
return sb.toString();
return "mSortedSymbolsPrecededBySpace = " +
"" + Arrays.toString(mSortedSymbolsPrecededBySpace) +
"\n mSortedSymbolsFollowedBySpace = " +
"" + Arrays.toString(mSortedSymbolsFollowedBySpace) +
"\n mSortedWordConnectors = " +
"" + Arrays.toString(mSortedWordConnectors) +
"\n mSortedWordSeparators = " +
"" + Arrays.toString(mSortedWordSeparators) +
"\n mSuggestPuncList = " +
"" + mSuggestPuncList +
"\n mSentenceSeparator = " +
"" + mSentenceSeparator +
"\n mSentenceSeparatorAndSpace = " +
"" + mSentenceSeparatorAndSpace +
"\n mCurrentLanguageHasSpaces = " +
"" + mCurrentLanguageHasSpaces +
"\n mUsesAmericanTypography = " +
"" + mUsesAmericanTypography +
"\n mUsesGermanRules = " +
"" + mUsesGermanRules;
}
}

View file

@ -11,14 +11,12 @@ import android.app.backup.BackupManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceFragmentCompat;
@ -53,19 +51,6 @@ public abstract class SubScreenFragment extends PreferenceFragmentCompat
}
}
static void updateListPreferenceSummaryToCurrentValue(final String prefKey,
final PreferenceScreen screen) {
// Because the "%s" summary trick of {@link ListPreference} doesn't work properly before
// KitKat, we need to update the summary programmatically.
final ListPreference listPreference = (ListPreference)screen.findPreference(prefKey);
if (listPreference == null) {
return;
}
final CharSequence[] entries = listPreference.getEntries();
final int entryIndex = listPreference.findIndexOfValue(listPreference.getValue());
listPreference.setSummary(entryIndex < 0 ? null : entries[entryIndex]);
}
final void setPreferenceVisible(final String prefKey, final boolean visible) {
setPreferenceVisible(prefKey, visible, getPreferenceScreen());
}
@ -74,24 +59,10 @@ public abstract class SubScreenFragment extends PreferenceFragmentCompat
removePreference(prefKey, getPreferenceScreen());
}
final void updateListPreferenceSummaryToCurrentValue(final String prefKey) {
updateListPreferenceSummaryToCurrentValue(prefKey, getPreferenceScreen());
}
final SharedPreferences getSharedPreferences() {
return getPreferenceManager().getSharedPreferences();
}
/**
* Gets the application name to display on the UI.
*/
final String getApplicationName() {
final Context context = getActivity();
final Resources res = getResources();
final int applicationLabelRes = context.getApplicationInfo().labelRes;
return res.getString(applicationLabelRes);
}
@Override
public void onCreatePreferences(final Bundle savedInstanceState, final String s) {
// this must be overridden, but is useless, because it's called during onCreate

View file

@ -1,45 +0,0 @@
/*
* Copyright (C) 2014 The Android Open Source Project
* modified
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
*/
package org.dslul.openboard.inputmethod.latin.settings;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.os.Bundle;
/**
* Test activity to use when testing preference fragments. <br/>
* Usage: <br/>
* Create an ActivityInstrumentationTestCase2 for this activity
* and call setIntent() with an intent that specifies the fragment to load in the activity.
* The fragment can then be obtained from this activity and used for testing/verification.
*/
public final class TestFragmentActivity extends Activity {
/**
* The fragment name that should be loaded when starting this activity.
* This must be specified when starting this activity, as this activity is only
* meant to test fragments from instrumentation tests.
*/
public static final String EXTRA_SHOW_FRAGMENT = "show_fragment";
public Fragment mFragment;
@Override
protected void onCreate(final Bundle savedState) {
super.onCreate(savedState);
final Intent intent = getIntent();
final String fragmentName = intent.getStringExtra(EXTRA_SHOW_FRAGMENT);
if (fragmentName == null) {
throw new IllegalArgumentException("No fragment name specified for testing");
}
mFragment = Fragment.instantiate(this, fragmentName);
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().add(mFragment, fragmentName).commit();
}
}

View file

@ -30,10 +30,10 @@ import org.dslul.openboard.inputmethod.latin.common.StringUtils;
import org.dslul.openboard.inputmethod.latin.define.DebugFlags;
import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
import org.dslul.openboard.inputmethod.latin.settings.SubtypeSettingsKt;
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils;
import org.dslul.openboard.inputmethod.latin.utils.ScriptUtils;
import org.dslul.openboard.inputmethod.latin.utils.StatsUtils;
import org.dslul.openboard.inputmethod.latin.utils.SubtypeSettingsKt;
import org.dslul.openboard.inputmethod.latin.utils.SuggestionResults;
import java.util.ArrayList;

View file

@ -58,7 +58,7 @@ import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import org.dslul.openboard.inputmethod.latin.suggestions.MoreSuggestionsView.MoreSuggestionsListener;
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils;
import org.dslul.openboard.inputmethod.latin.utils.DialogUtils;
import org.dslul.openboard.inputmethod.latin.utils.DialogUtilsKt;
import org.dslul.openboard.inputmethod.latin.utils.ToolbarKey;
import org.dslul.openboard.inputmethod.latin.utils.ToolbarUtilsKt;
@ -439,7 +439,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
// apparently toast is not working on some Android versions, probably
// Android 13 with the notification permission
// Toast.makeText(getContext(), text, Toast.LENGTH_LONG).show();
final PopupMenu uglyWorkaround = new PopupMenu(DialogUtils.getPlatformDialogThemeContext(getContext()), wordView);
final PopupMenu uglyWorkaround = new PopupMenu(DialogUtilsKt.getPlatformDialogThemeContext(getContext()), wordView);
uglyWorkaround.getMenu().add(Menu.NONE, 1, Menu.NONE, text);
uglyWorkaround.show();
}

View file

@ -18,7 +18,6 @@ import org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser.MORE_KE
import org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser.SimpleKeyboardParser
import org.dslul.openboard.inputmethod.keyboard.internal.keyboard_parser.addLocaleKeyTextsToParams
import org.dslul.openboard.inputmethod.latin.R
import org.dslul.openboard.inputmethod.latin.settings.infoDialog
import java.io.File
import java.io.IOException
import java.math.BigInteger

View file

@ -6,26 +6,10 @@
package org.dslul.openboard.inputmethod.latin.utils;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.latin.define.DebugFlags;
/**
* A class for logging and debugging utility methods.
*/
public final class DebugLogUtils {
private final static String TAG = DebugLogUtils.class.getSimpleName();
private final static boolean sDBG = DebugFlags.DEBUG_ENABLED;
/**
* Calls .toString() on its non-null argument or returns "null"
* @param o the object to convert to a string
* @return the result of .toString() or null
*/
public static String s(final Object o) {
return null == o ? "null" : o.toString();
}
/**
* Get the string representation of the current stack trace, for debugging purposes.
* @return a readable, carriage-return-separated string for the current stack trace.
@ -47,7 +31,7 @@ public final class DebugLogUtils {
final StackTraceElement[] frames = e.getStackTrace();
// Start at 1 because the first frame is here and we don't care about it
for (int j = 1; j < frames.length && j < limit + 1; ++j) {
sb.append(frames[j].toString() + "\n");
sb.append(frames[j].toString()).append("\n");
}
}
return sb.toString();
@ -66,40 +50,4 @@ public final class DebugLogUtils {
}
return sb.toString();
}
/**
* Helper log method to ease null-checks and adding spaces.
*
* This sends all arguments to the log, separated by spaces. Any null argument is converted
* to the "null" string. It uses a very visible tag and log level for debugging purposes.
*
* @param args the stuff to send to the log
*/
public static void l(final Object... args) {
if (!sDBG) return;
final StringBuilder sb = new StringBuilder();
for (final Object o : args) {
sb.append(s(o));
sb.append(" ");
}
Log.e(TAG, sb.toString());
}
/**
* Helper log method to put stuff in red.
*
* This does the same as #l but prints in red
*
* @param args the stuff to send to the log
*/
public static void r(final Object... args) {
if (!sDBG) return;
final StringBuilder sb = new StringBuilder("\u001B[31m");
for (final Object o : args) {
sb.append(s(o));
sb.append(" ");
}
sb.append("\u001B[0m");
Log.e(TAG, sb.toString());
}
}

View file

@ -1,25 +0,0 @@
/*
* Copyright (C) 2014 The Android Open Source Project
* modified
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
*/
package org.dslul.openboard.inputmethod.latin.utils;
import android.content.Context;
import android.view.ContextThemeWrapper;
import org.dslul.openboard.inputmethod.latin.R;
public final class DialogUtils {
private DialogUtils() {
// This utility class is not publicly instantiable.
}
// this is necessary for dialogs and popup menus created outside an activity
public static Context getPlatformDialogThemeContext(final Context context) {
// Because {@link AlertDialog.Builder.create()} doesn't honor the specified theme with
// createThemeContextWrapper=false, the result dialog box has unneeded paddings around it.
return new ContextThemeWrapper(context, R.style.platformActivityTheme);
}
}

View file

@ -1,9 +1,15 @@
package org.dslul.openboard.inputmethod.latin.settings
package org.dslul.openboard.inputmethod.latin.utils
import android.content.Context
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.view.ContextThemeWrapper
import org.dslul.openboard.inputmethod.latin.R
// maybe rather put to DialogUtils (and convert that to kotlin)
fun getPlatformDialogThemeContext(context: Context): Context {
// Because {@link AlertDialog.Builder.create()} doesn't honor the specified theme with
// createThemeContextWrapper=false, the result dialog box has unneeded paddings around it.
return ContextThemeWrapper(context, R.style.platformActivityTheme)
}
fun confirmDialog(context: Context, message: String, confirmButton: String, onConfirmed: (() -> Unit)) {
AlertDialog.Builder(context)
@ -19,6 +25,7 @@ fun infoDialog(context: Context, messageId: Int) {
.setNegativeButton(android.R.string.ok, null)
.show()
}
fun infoDialog(context: Context, message: String) {
AlertDialog.Builder(context)
.setMessage(message)

View file

@ -11,8 +11,6 @@ import androidx.core.content.edit
import org.dslul.openboard.inputmethod.latin.BinaryDictionaryGetter
import org.dslul.openboard.inputmethod.latin.R
import org.dslul.openboard.inputmethod.latin.settings.Settings
import org.dslul.openboard.inputmethod.latin.settings.getEnabledSubtypes
import org.dslul.openboard.inputmethod.latin.settings.locale
import java.io.File
import java.util.*
import kotlin.collections.HashSet

View file

@ -1,28 +0,0 @@
/*
* Copyright (C) 2013 The Android Open Source Project
* modified
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
*/
package org.dslul.openboard.inputmethod.latin.utils;
import android.content.Context;
import android.content.Intent;
@SuppressWarnings("unused")
public class FeedbackUtils {
public static boolean isHelpAndFeedbackFormSupported() {
return false;
}
public static void showHelpAndFeedbackForm(Context context) {
}
public static int getAboutKeyboardTitleResId() {
return 0;
}
public static Intent getAboutKeyboardIntent(Context context) {
return null;
}
}

View file

@ -1,48 +0,0 @@
/*
* Copyright (C) 2013 The Android Open Source Project
* modified
* SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
*/
package org.dslul.openboard.inputmethod.latin.utils;
import org.dslul.openboard.inputmethod.latin.settings.AdvancedSettingsFragment;
import org.dslul.openboard.inputmethod.latin.settings.AppearanceSettingsFragment;
import org.dslul.openboard.inputmethod.latin.settings.CorrectionSettingsFragment;
import org.dslul.openboard.inputmethod.latin.settings.DebugSettingsFragment;
import org.dslul.openboard.inputmethod.latin.settings.GestureSettingsFragment;
import org.dslul.openboard.inputmethod.latin.settings.LanguageSettingsFragment;
import org.dslul.openboard.inputmethod.latin.settings.PreferencesSettingsFragment;
import org.dslul.openboard.inputmethod.latin.settings.SettingsFragment;
import org.dslul.openboard.inputmethod.latin.settings.AboutFragment;
import org.dslul.openboard.inputmethod.latin.spellcheck.SpellCheckerSettingsFragment;
import org.dslul.openboard.inputmethod.latin.userdictionary.UserDictionaryAddWordFragment;
import org.dslul.openboard.inputmethod.latin.userdictionary.UserDictionaryList;
import org.dslul.openboard.inputmethod.latin.userdictionary.UserDictionaryLocalePicker;
import org.dslul.openboard.inputmethod.latin.userdictionary.UserDictionarySettings;
import java.util.HashSet;
public class FragmentUtils {
private static final HashSet<String> sLatinImeFragments = new HashSet<>();
static {
sLatinImeFragments.add(PreferencesSettingsFragment.class.getName());
sLatinImeFragments.add(AppearanceSettingsFragment.class.getName());
sLatinImeFragments.add(GestureSettingsFragment.class.getName());
sLatinImeFragments.add(CorrectionSettingsFragment.class.getName());
sLatinImeFragments.add(AdvancedSettingsFragment.class.getName());
sLatinImeFragments.add(DebugSettingsFragment.class.getName());
sLatinImeFragments.add(SettingsFragment.class.getName());
sLatinImeFragments.add(AboutFragment.class.getName());
sLatinImeFragments.add(SpellCheckerSettingsFragment.class.getName());
sLatinImeFragments.add(UserDictionaryAddWordFragment.class.getName());
sLatinImeFragments.add(UserDictionaryList.class.getName());
sLatinImeFragments.add(UserDictionaryLocalePicker.class.getName());
sLatinImeFragments.add(UserDictionarySettings.class.getName());
sLatinImeFragments.add(LanguageSettingsFragment.class.getName());
}
public static boolean isValidFragment(String fragmentName) {
return sLatinImeFragments.contains(fragmentName);
}
}

View file

@ -58,7 +58,7 @@ fun createInputMethodPickerDialog(latinIme: LatinIME, richImm: RichInputMethodMa
items.add(SpannableStringBuilder().append(title).append(subtitle))
}
val dialog = AlertDialog.Builder(DialogUtils.getPlatformDialogThemeContext(latinIme))
val dialog = AlertDialog.Builder(getPlatformDialogThemeContext(latinIme))
.setTitle(R.string.select_input_method)
.setSingleChoiceItems(items.toTypedArray(), currentSubtypeIndex) { di, i ->
di.dismiss()

View file

@ -7,14 +7,16 @@
package org.dslul.openboard.inputmethod.latin.utils;
import android.app.Application;
import org.dslul.openboard.inputmethod.latin.utils.Log;
import org.dslul.openboard.inputmethod.latin.BuildConfig;
import org.dslul.openboard.inputmethod.latin.define.JniLibName;
import java.io.File;
public final class JniUtils {
private static final String TAG = JniUtils.class.getSimpleName();
public static final String JNI_LIB_NAME = "jni_latinime";
public static final String JNI_LIB_NAME_GOOGLE = "jni_latinimegoogle";
public static final String JNI_LIB_IMPORT_FILE_NAME = "libjni_latinime.so";
public static boolean sHaveGestureLib = false;
static {
@ -28,10 +30,10 @@ public final class JniUtils {
// fall back to hardcoded default path, may not work on all phones
filesDir = "/data/data/" + BuildConfig.APPLICATION_ID + "/files";
}
final File userSuppliedLibrary = new File(filesDir + File.separator + JniLibName.JNI_LIB_IMPORT_FILE_NAME);
final File userSuppliedLibrary = new File(filesDir + File.separator + JNI_LIB_IMPORT_FILE_NAME);
if (userSuppliedLibrary.exists()) {
try {
System.load(filesDir + File.separator + JniLibName.JNI_LIB_IMPORT_FILE_NAME);
System.load(filesDir + File.separator + JNI_LIB_IMPORT_FILE_NAME);
sHaveGestureLib = true; // this is an assumption, any way to actually check?
} catch (Throwable t) { // catch everything, maybe provided library simply doesn't work
Log.w(TAG, "Could not load user-supplied library", t);
@ -41,18 +43,18 @@ public final class JniUtils {
if (!sHaveGestureLib) {
// try loading google library, will fail unless it's in system and this is a system app
try {
System.loadLibrary(JniLibName.JNI_LIB_NAME_GOOGLE);
System.loadLibrary(JNI_LIB_NAME_GOOGLE);
sHaveGestureLib = true;
} catch (UnsatisfiedLinkError ul) {
Log.w(TAG, "Could not load system glide typing library " + JniLibName.JNI_LIB_NAME_GOOGLE, ul);
Log.w(TAG, "Could not load system glide typing library " + JNI_LIB_NAME_GOOGLE, ul);
}
}
if (!sHaveGestureLib) {
// try loading built-in library
try {
System.loadLibrary(JniLibName.JNI_LIB_NAME);
System.loadLibrary(JNI_LIB_NAME);
} catch (UnsatisfiedLinkError ul) {
Log.w(TAG, "Could not load native library " + JniLibName.JNI_LIB_NAME, ul);
Log.w(TAG, "Could not load native library " + JNI_LIB_NAME, ul);
}
}
}

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only
package org.dslul.openboard.inputmethod.latin.settings
package org.dslul.openboard.inputmethod.latin.utils
import android.content.Context
import android.content.SharedPreferences
@ -11,15 +11,10 @@ import android.widget.Toast
import androidx.core.app.LocaleManagerCompat
import androidx.core.content.edit
import org.dslul.openboard.inputmethod.keyboard.KeyboardSwitcher
import org.dslul.openboard.inputmethod.latin.BuildConfig
import org.dslul.openboard.inputmethod.latin.R
import org.dslul.openboard.inputmethod.latin.RichInputMethodManager
import org.dslul.openboard.inputmethod.latin.define.DebugFlags
import org.dslul.openboard.inputmethod.latin.utils.AdditionalSubtypeUtils
import org.dslul.openboard.inputmethod.latin.utils.CUSTOM_LAYOUT_PREFIX
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils
import org.dslul.openboard.inputmethod.latin.utils.Log
import org.dslul.openboard.inputmethod.latin.utils.SubtypeLocaleUtils
import org.dslul.openboard.inputmethod.latin.settings.Settings
import org.xmlpull.v1.XmlPullParser
import java.io.File
import java.util.*

View file

@ -37,8 +37,7 @@ public final class ViewLayoutUtils {
public static void placeViewAt(final View view, final int x, final int y, final int w,
final int h) {
final ViewGroup.LayoutParams lp = view.getLayoutParams();
if (lp instanceof MarginLayoutParams) {
final MarginLayoutParams marginLayoutParams = (MarginLayoutParams)lp;
if (lp instanceof final MarginLayoutParams marginLayoutParams) {
marginLayoutParams.width = w;
marginLayoutParams.height = h;
marginLayoutParams.setMargins(x, y, 0, 0);
@ -63,14 +62,12 @@ public final class ViewLayoutUtils {
public static void updateLayoutGravityOf(final View view, final int layoutGravity) {
final ViewGroup.LayoutParams lp = view.getLayoutParams();
if (lp instanceof LinearLayout.LayoutParams) {
final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)lp;
if (lp instanceof final LinearLayout.LayoutParams params) {
if (params.gravity != layoutGravity) {
params.gravity = layoutGravity;
view.setLayoutParams(params);
}
} else if (lp instanceof FrameLayout.LayoutParams) {
final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)lp;
} else if (lp instanceof final FrameLayout.LayoutParams params) {
if (params.gravity != layoutGravity) {
params.gravity = layoutGravity;
view.setLayoutParams(params);

View file

@ -18,36 +18,24 @@ public final class XmlParseUtils {
// This utility class is not publicly instantiable.
}
@SuppressWarnings("serial")
public static class ParseException extends XmlPullParserException {
public ParseException(final String msg, final XmlPullParser parser) {
super(msg + " at " + parser.getPositionDescription());
}
}
@SuppressWarnings("serial")
public static final class IllegalStartTag extends ParseException {
public IllegalStartTag(final XmlPullParser parser, final String tag, final String parent) {
super("Illegal start tag " + tag + " in " + parent, parser);
}
}
@SuppressWarnings("serial")
public static final class IllegalEndTag extends ParseException {
public IllegalEndTag(final XmlPullParser parser, final String tag, final String parent) {
super("Illegal end tag " + tag + " in " + parent, parser);
}
}
@SuppressWarnings("serial")
public static final class IllegalAttribute extends ParseException {
public IllegalAttribute(final XmlPullParser parser, final String tag,
final String attribute) {
super("Tag " + tag + " has illegal attribute " + attribute, parser);
}
}
@SuppressWarnings("serial")
public static final class NonEmptyTag extends ParseException{
public NonEmptyTag(final XmlPullParser parser, final String tag) {
super(tag + " must be empty tag", parser);

View file

@ -101,7 +101,7 @@
zz: QWERTY/qwerty
-->
<!-- TODO: use <lang>_keyboard icon instead of a common keyboard icon. -->
<!-- TODO: Remove "AsciiCapable" from the extra values when we can stop supporting JB-MR1 -->
<!-- "AsciiCapable" is kept in extra values, as per recommendation in Android documentation -->
<!-- Note: SupportTouchPositionCorrection extra value is obsolete and maintained for backward
compatibility. -->
<!-- If IME doesn't have an applicable subtype, the first subtype will be used as a default
@ -437,7 +437,7 @@
android:imeSubtypeExtraValue="KeyboardLayoutSet=hindi_compact,EmojiCapable"
android:isAsciiCapable="false"
/>
<!-- TODO: This Hinglish keyboard is a preliminary layout.
<!-- This Hinglish keyboard is a preliminary layout.
This isn't based on the final specification.
Was disabled because there is no LM yet, and this layout does not offer anything different. -->
<subtype android:icon="@drawable/ic_ime_switcher"
@ -804,7 +804,7 @@
android:imeSubtypeExtraValue="KeyboardLayoutSet=sr,SupportTouchPositionCorrection,EmojiCapable"
android:isAsciiCapable="false"
/>
<!-- TODO: This Serbian Latin keyboard is a preliminary layout.
<!-- This Serbian Latin keyboard is a preliminary layout.
This isn't based on the final specification. -->
<subtype android:icon="@drawable/ic_ime_switcher"
android:label="@string/subtype_sr_ZZ"
@ -917,7 +917,7 @@
android:imeSubtypeExtraValue="KeyboardLayoutSet=urdu,EmojiCapable"
android:isAsciiCapable="false"
/>
<!-- TODO: This Uzbek keyboard is a preliminary layout.
<!-- This Uzbek keyboard is a preliminary layout.
This isn't based on the final specification. -->
<subtype android:icon="@drawable/ic_ime_switcher"
android:label="@string/subtype_generic"