17a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard/*
27a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard * Copyright (C) 2011 The Android Open Source Project
37a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard *
48aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
58aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * you may not use this file except in compliance with the License.
68aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * You may obtain a copy of the License at
77a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard *
88aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
97a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard *
107a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard * Unless required by applicable law or agreed to in writing, software
118aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
128aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * See the License for the specific language governing permissions and
148aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * limitations under the License.
157a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard */
167a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
17a7d2fc6befa1b16883200a653fc01deb4d94944dKen Wakasapackage com.android.inputmethod.latin.settings;
187a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
191404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalardimport android.content.Context;
207a16a061e622539e54d7d649dcb8d4965aea575aJean Chalardimport android.content.SharedPreferences;
211404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalardimport android.content.pm.PackageInfo;
22d2736972598eda61a8e40a3d5b26156136e78d66Jean Chalardimport android.content.res.Configuration;
237a16a061e622539e54d7d649dcb8d4965aea575aJean Chalardimport android.content.res.Resources;
245254c01d4cc024527479d4dc5fab2ed2516c395cDan Zivkovicimport android.os.Build;
257a16a061e622539e54d7d649dcb8d4965aea575aJean Chalardimport android.util.Log;
267a16a061e622539e54d7d649dcb8d4965aea575aJean Chalardimport android.view.inputmethod.EditorInfo;
277a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
281404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalardimport com.android.inputmethod.compat.AppWorkaroundsUtils;
29a7d2fc6befa1b16883200a653fc01deb4d94944dKen Wakasaimport com.android.inputmethod.latin.InputAttributes;
30a7d2fc6befa1b16883200a653fc01deb4d94944dKen Wakasaimport com.android.inputmethod.latin.R;
31a7d2fc6befa1b16883200a653fc01deb4d94944dKen Wakasaimport com.android.inputmethod.latin.RichInputMethodManager;
321404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalardimport com.android.inputmethod.latin.utils.AsyncResultHolder;
33276b1a2ebc6d5ea3fa36fa9271cdc6310db34021Tadashi G. Takaokaimport com.android.inputmethod.latin.utils.ResourceUtils;
341404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalardimport com.android.inputmethod.latin.utils.TargetPackageInfoGetterTask;
357a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
367a16a061e622539e54d7d649dcb8d4965aea575aJean Chalardimport java.util.Arrays;
37c5c226c4243509c67af84d89e50013eaa3cc6033Jean Chalardimport java.util.Locale;
387a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
39d3a4c5132422b189c8dbb94dbbe84a9b9761b0a8Tadashi G. Takaokaimport javax.annotation.Nonnull;
40bc4ae6bdc0249f9282efea5d1fe7ccfefd6f93b0Jatin Mataniimport javax.annotation.Nullable;
41d3a4c5132422b189c8dbb94dbbe84a9b9761b0a8Tadashi G. Takaoka
4216c6f355700ee5cdaa029f4a25b8b3d40718e6abTadashi G. Takaoka/**
4316c6f355700ee5cdaa029f4a25b8b3d40718e6abTadashi G. Takaoka * When you call the constructor of this class, you may want to change the current system locale by
440c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaoka * using {@link com.android.inputmethod.latin.utils.RunInLocale}.
4516c6f355700ee5cdaa029f4a25b8b3d40718e6abTadashi G. Takaoka */
460807c897f40f22ee4df5d425a8c7f7c207000718Jatin Matani// Non-final for testing via mock library.
470807c897f40f22ee4df5d425a8c7f7c207000718Jatin Matanipublic class SettingsValues {
487a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard    private static final String TAG = SettingsValues.class.getSimpleName();
49fba1bd0ec4198fc227bffcdb9c90bb7a36baa5c8Ken Wakasa    // "floatMaxValue" and "floatNegativeInfinity" are special marker strings for
50fba1bd0ec4198fc227bffcdb9c90bb7a36baa5c8Ken Wakasa    // Float.NEGATIVE_INFINITE and Float.MAX_VALUE. Currently used for auto-correction settings.
51fba1bd0ec4198fc227bffcdb9c90bb7a36baa5c8Ken Wakasa    private static final String FLOAT_MAX_VALUE_MARKER_STRING = "floatMaxValue";
5270f2762e285fe85676de4270edee97de54674879Satoshi Kataoka    private static final String FLOAT_NEGATIVE_INFINITY_MARKER_STRING = "floatNegativeInfinity";
531404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard    private static final int TIMEOUT_TO_GET_TARGET_PACKAGE = 5; // seconds
54bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang    public static final float DEFAULT_SIZE_SCALE = 1.0f; // 100%
557a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
567a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard    // From resources:
57b90fa0fb2ce195cfaec878dea9702261290176c2Jean Chalard    public final SpacingAndPunctuations mSpacingAndPunctuations;
58a61b7245b030395451b4c42ec218a946aa95e030Yohei Yukawa    public final int mDelayInMillisecondsToUpdateOldSuggestions;
59554346e94c852222a16b8ade732832158cbd34afJean Chalard    public final long mDoubleSpacePeriodTimeout;
606bb6d30344259b41387f15f0e05df2388beb1d1cJean Chalard    // From configuration:
616bb6d30344259b41387f15f0e05df2388beb1d1cJean Chalard    public final Locale mLocale;
626bb6d30344259b41387f15f0e05df2388beb1d1cJean Chalard    public final boolean mHasHardwareKeyboard;
636bb6d30344259b41387f15f0e05df2388beb1d1cJean Chalard    public final int mDisplayOrientation;
64837b109f278d9e3be9b12e87dff4b3e6bdc97defJean Chalard    // From preferences, in the same order as xml/prefs.xml:
65837b109f278d9e3be9b12e87dff4b3e6bdc97defJean Chalard    public final boolean mAutoCap;
667a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard    public final boolean mVibrateOn;
67837b109f278d9e3be9b12e87dff4b3e6bdc97defJean Chalard    public final boolean mSoundOn;
687a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard    public final boolean mKeyPreviewPopupOn;
692fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    public final boolean mShowsVoiceInputKey;
7081d4e3cd66a9388c47c7dba55240ddf849b31934Tadashi G. Takaoka    public final boolean mIncludesOtherImesInLanguageSwitchList;
711a4aa7e307e6090011449446c2c6770b6a0cc987Tadashi G. Takaoka    public final boolean mShowsLanguageSwitchKey;
72837b109f278d9e3be9b12e87dff4b3e6bdc97defJean Chalard    public final boolean mUseContactsDict;
73d4bb7df412e13197570436e9b8ec7db4f1199a06Keisuke Kuroyanagi    public final boolean mUsePersonalizedDicts;
74139bd83f0c552e3fdb5f763b5f6fe25ad138802bKen Wakasa    public final boolean mUseDoubleSpacePeriod;
75bb61293675234f6e5e1312db70618be985b37a83Jean Chalard    public final boolean mBlockPotentiallyOffensive;
765455179b54eb8230577f518db082796a3055685aDan Zivkovic    // Use bigrams to predict the next word when there is no input for it yet
775455179b54eb8230577f518db082796a3055685aDan Zivkovic    public final boolean mBigramPredictionEnabled;
7862b8dddb6ddb057555a1665759f9cf197e480c9fTadashi G. Takaoka    public final boolean mGestureInputEnabled;
79724db044957eb3544323c9814cbb4f20e81b8594Ken Wakasa    public final boolean mGestureTrailEnabled;
8047e2bf329882ea45294ea6e6dd80b4d4eb3789e6Tadashi G. Takaoka    public final boolean mGestureFloatingPreviewTextEnabled;
81ff961ddf8c58df569c97684bfd83a01b2a9470aaTadashi G. Takaoka    public final boolean mSlidingKeyInputPreviewEnabled;
82cc5e4a444524f73a112d7223d7940d41cf60d1f4Tadashi G. Takaoka    public final int mKeyLongpressTimeout;
83f7e01e866ffa89b4dd7e66c471ed9fc275a637a2Tadashi G. Takaoka    public final boolean mEnableEmojiAltPhysicalKey;
84a2376cd2b4fea6b655fdcdf794cf16b7bbe1a161Chieu Nguyen    public final boolean mShowAppIcon;
85a2376cd2b4fea6b655fdcdf794cf16b7bbe1a161Chieu Nguyen    public final boolean mIsShowAppIconSettingInPreferences;
8693205b17ffb135f792dede75aaf2b5f6c6d5b56aChieu Nguyen    public final boolean mCloudSyncEnabled;
879aa7f66a15b7db2c0bf8924ba17ae9fe463441b5Yohei Yukawa    public final boolean mEnableMetricsLogging;
886fb586a527e7ffe5da187c8b345cdf897b8481c7Tadashi G. Takaoka    public final boolean mShouldShowLxxSuggestionUi;
89a5d4cb7769dce162c35573a806533af585063a82Jatin Matani    // Use split layout for keyboard.
90a5d4cb7769dce162c35573a806533af585063a82Jatin Matani    public final boolean mIsSplitKeyboardEnabled;
91a5d4cb7769dce162c35573a806533af585063a82Jatin Matani    public final int mScreenMetrics;
927a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
93dca729fddd69f03d8eaca238c62478a7fd77db96Jean Chalard    // From the input box
94d3a4c5132422b189c8dbb94dbbe84a9b9761b0a8Tadashi G. Takaoka    @Nonnull
95ff0735ada807239abeb4c6105b7d01d2bcea0aedTadashi G. Takaoka    public final InputAttributes mInputAttributes;
96dca729fddd69f03d8eaca238c62478a7fd77db96Jean Chalard
97c207e0a7dad0bdae054be47cafe878698f9401fcJean Chalard    // Deduced settings
98c207e0a7dad0bdae054be47cafe878698f9401fcJean Chalard    public final int mKeypressVibrationDuration;
99d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka    public final float mKeypressSoundVolume;
100837b109f278d9e3be9b12e87dff4b3e6bdc97defJean Chalard    public final int mKeyPreviewPopupDismissDelay;
101140adf204bdf68e25a760b371516e23f6ac51cf2Jean Chalard    private final boolean mAutoCorrectEnabled;
1020028ed3627ff4f37a62a80f3b2c857e373cd5090satok    public final float mAutoCorrectionThreshold;
10356577461d63ad3618598ceddfb9a73b797917061Jean Chalard    public final float mPlausibilityThreshold;
104ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka    public final boolean mAutoCorrectionEnabledPerUserSettings;
105ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka    private final boolean mSuggestionsEnabledPerUserSettings;
1061404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard    private final AsyncResultHolder<AppWorkaroundsUtils> mAppWorkarounds;
107c207e0a7dad0bdae054be47cafe878698f9401fcJean Chalard
108756791e6bf80c1fd86f9a236f4ba8da770a7305fSatoshi Kataoka    // Debug settings
109756791e6bf80c1fd86f9a236f4ba8da770a7305fSatoshi Kataoka    public final boolean mIsInternal;
110ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka    public final boolean mHasCustomKeyPreviewAnimationParams;
111bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang    public final boolean mHasKeyboardResize;
112bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang    public final float mKeyboardHeightScale;
113276b1a2ebc6d5ea3fa36fa9271cdc6310db34021Tadashi G. Takaoka    public final int mKeyPreviewShowUpDuration;
114276b1a2ebc6d5ea3fa36fa9271cdc6310db34021Tadashi G. Takaoka    public final int mKeyPreviewDismissDuration;
115ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka    public final float mKeyPreviewShowUpStartXScale;
116ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka    public final float mKeyPreviewShowUpStartYScale;
117ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka    public final float mKeyPreviewDismissEndXScale;
118ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka    public final float mKeyPreviewDismissEndYScale;
119756791e6bf80c1fd86f9a236f4ba8da770a7305fSatoshi Kataoka
120bc4ae6bdc0249f9282efea5d1fe7ccfefd6f93b0Jatin Matani    @Nullable public final String mAccount;
121bc4ae6bdc0249f9282efea5d1fe7ccfefd6f93b0Jatin Matani
122860c3b8e8cc65e2a2b26b4da0356b5bcff6450e6Tadashi G. Takaoka    public SettingsValues(final Context context, final SharedPreferences prefs, final Resources res,
123d3a4c5132422b189c8dbb94dbbe84a9b9761b0a8Tadashi G. Takaoka            @Nonnull final InputAttributes inputAttributes) {
124860c3b8e8cc65e2a2b26b4da0356b5bcff6450e6Tadashi G. Takaoka        mLocale = res.getConfiguration().locale;
1257a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard        // Get the resources
126a61b7245b030395451b4c42ec218a946aa95e030Yohei Yukawa        mDelayInMillisecondsToUpdateOldSuggestions =
127a61b7245b030395451b4c42ec218a946aa95e030Yohei Yukawa                res.getInteger(R.integer.config_delay_in_milliseconds_to_update_old_suggestions);
128b90fa0fb2ce195cfaec878dea9702261290176c2Jean Chalard        mSpacingAndPunctuations = new SpacingAndPunctuations(res);
1297a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
130dca729fddd69f03d8eaca238c62478a7fd77db96Jean Chalard        // Store the input attributes
131d3a4c5132422b189c8dbb94dbbe84a9b9761b0a8Tadashi G. Takaoka        mInputAttributes = inputAttributes;
132dca729fddd69f03d8eaca238c62478a7fd77db96Jean Chalard
1337a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard        // Get the settings preferences
134c40b807ca420123d90cd9479a453051f975b7629Jean Chalard        mAutoCap = prefs.getBoolean(Settings.PREF_AUTO_CAP, true);
135ce875664e0564f3e26d130a4d3e8b8e9a2e8a368Tadashi G. Takaoka        mVibrateOn = Settings.readVibrationEnabled(prefs, res);
136ce875664e0564f3e26d130a4d3e8b8e9a2e8a368Tadashi G. Takaoka        mSoundOn = Settings.readKeypressSoundEnabled(prefs, res);
137d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka        mKeyPreviewPopupOn = Settings.readKeyPreviewPopupEnabled(prefs, res);
138ff961ddf8c58df569c97684bfd83a01b2a9470aaTadashi G. Takaoka        mSlidingKeyInputPreviewEnabled = prefs.getBoolean(
139a3920c7e6af852764a3b5a6eecd27f51ab83f244Tadashi G. Takaoka                DebugSettings.PREF_SLIDING_KEY_INPUT_PREVIEW, true);
140aa4b2c71270576f25e7c80a4b63a1956cec5f4e2Tadashi G. Takaoka        mShowsVoiceInputKey = needsToShowVoiceInputKey(prefs, res)
1410351b816327ebddef0c4c1f95834645a4fab96feTadashi G. Takaoka                && mInputAttributes.mShouldShowVoiceInputKey
1425254c01d4cc024527479d4dc5fab2ed2516c395cDan Zivkovic                && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
1437ed40a13cc8d8a616fd131e5644238cd41aba84dTadashi G. Takaoka        mIncludesOtherImesInLanguageSwitchList = Settings.ENABLE_SHOW_LANGUAGE_SWITCH_KEY_SETTINGS
1447ed40a13cc8d8a616fd131e5644238cd41aba84dTadashi G. Takaoka                ? prefs.getBoolean(Settings.PREF_INCLUDE_OTHER_IMES_IN_LANGUAGE_SWITCH_LIST, false)
1457ed40a13cc8d8a616fd131e5644238cd41aba84dTadashi G. Takaoka                : true /* forcibly */;
1467ed40a13cc8d8a616fd131e5644238cd41aba84dTadashi G. Takaoka        mShowsLanguageSwitchKey = Settings.ENABLE_SHOW_LANGUAGE_SWITCH_KEY_SETTINGS
1477ed40a13cc8d8a616fd131e5644238cd41aba84dTadashi G. Takaoka                ? Settings.readShowsLanguageSwitchKey(prefs) : true /* forcibly */;
148c40b807ca420123d90cd9479a453051f975b7629Jean Chalard        mUseContactsDict = prefs.getBoolean(Settings.PREF_KEY_USE_CONTACTS_DICT, true);
149c2ba73ab41caf208123618c153e066180eb32c01Tadashi G. Takaoka        mUsePersonalizedDicts = prefs.getBoolean(Settings.PREF_KEY_USE_PERSONALIZED_DICTS, true);
1507aa47cb3748d82b6f8bf3713c3c9e05b3fca8979Jean Chalard        mUseDoubleSpacePeriod = prefs.getBoolean(Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, true)
1517aa47cb3748d82b6f8bf3713c3c9e05b3fca8979Jean Chalard                && inputAttributes.mIsGeneralTextInput;
152bb61293675234f6e5e1312db70618be985b37a83Jean Chalard        mBlockPotentiallyOffensive = Settings.readBlockPotentiallyOffensive(prefs, res);
153116e58c437526ea2503564317e2731b8126acaa4Chieu Nguyen        mAutoCorrectEnabled = Settings.readAutoCorrectEnabled(prefs, res);
154116e58c437526ea2503564317e2731b8126acaa4Chieu Nguyen        final String autoCorrectionThresholdRawValue = mAutoCorrectEnabled
155116e58c437526ea2503564317e2731b8126acaa4Chieu Nguyen                ? res.getString(R.string.auto_correction_threshold_mode_index_modest)
156116e58c437526ea2503564317e2731b8126acaa4Chieu Nguyen                : res.getString(R.string.auto_correction_threshold_mode_index_off);
1575455179b54eb8230577f518db082796a3055685aDan Zivkovic        mBigramPredictionEnabled = readBigramPredictionEnabled(prefs, res);
158554346e94c852222a16b8ade732832158cbd34afJean Chalard        mDoubleSpacePeriodTimeout = res.getInteger(R.integer.config_double_space_period_timeout);
1596bb6d30344259b41387f15f0e05df2388beb1d1cJean Chalard        mHasHardwareKeyboard = Settings.readHasHardwareKeyboard(res.getConfiguration());
1609aa7f66a15b7db2c0bf8924ba17ae9fe463441b5Yohei Yukawa        mEnableMetricsLogging = prefs.getBoolean(Settings.PREF_ENABLE_METRICS_LOGGING, true);
161a5d4cb7769dce162c35573a806533af585063a82Jatin Matani        mIsSplitKeyboardEnabled = prefs.getBoolean(Settings.PREF_ENABLE_SPLIT_KEYBOARD, false);
162395009c03eeda42b2b2114d005c3ed8d7e4bfd4bTadashi G. Takaoka        mScreenMetrics = Settings.readScreenMetrics(res);
163a5d4cb7769dce162c35573a806533af585063a82Jatin Matani
1646fb586a527e7ffe5da187c8b345cdf897b8481c7Tadashi G. Takaoka        mShouldShowLxxSuggestionUi = Settings.SHOULD_SHOW_LXX_SUGGESTION_UI
1656fb586a527e7ffe5da187c8b345cdf897b8481c7Tadashi G. Takaoka                && prefs.getBoolean(DebugSettings.PREF_SHOULD_SHOW_LXX_SUGGESTION_UI, true);
166c40b807ca420123d90cd9479a453051f975b7629Jean Chalard        // Compute other readable settings
167cc5e4a444524f73a112d7223d7940d41cf60d1f4Tadashi G. Takaoka        mKeyLongpressTimeout = Settings.readKeyLongpressTimeout(prefs, res);
168a7a7f4e00277b2d3c1c38d2b6fe558e177e1e8d2Tadashi G. Takaoka        mKeypressVibrationDuration = Settings.readKeypressVibrationDuration(prefs, res);
169d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka        mKeypressSoundVolume = Settings.readKeypressSoundVolume(prefs, res);
170d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka        mKeyPreviewPopupDismissDelay = Settings.readKeyPreviewPopupDismissDelay(prefs, res);
171f7e01e866ffa89b4dd7e66c471ed9fc275a637a2Tadashi G. Takaoka        mEnableEmojiAltPhysicalKey = prefs.getBoolean(
172f7e01e866ffa89b4dd7e66c471ed9fc275a637a2Tadashi G. Takaoka                Settings.PREF_ENABLE_EMOJI_ALT_PHYSICAL_KEY, true);
173a2376cd2b4fea6b655fdcdf794cf16b7bbe1a161Chieu Nguyen        mShowAppIcon = Settings.readShowSetupWizardIcon(prefs, context);
174a2376cd2b4fea6b655fdcdf794cf16b7bbe1a161Chieu Nguyen        mIsShowAppIconSettingInPreferences = prefs.contains(Settings.PREF_SHOW_SETUP_WIZARD_ICON);
175d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka        mAutoCorrectionThreshold = readAutoCorrectionThreshold(res,
1761aa547d94a379691ecca994d92bf3c2f212bad13Tadashi G. Takaoka                autoCorrectionThresholdRawValue);
17756577461d63ad3618598ceddfb9a73b797917061Jean Chalard        mPlausibilityThreshold = Settings.readPlausibilityThreshold(res);
178ce875664e0564f3e26d130a4d3e8b8e9a2e8a368Tadashi G. Takaoka        mGestureInputEnabled = Settings.readGestureInputEnabled(prefs, res);
179724db044957eb3544323c9814cbb4f20e81b8594Ken Wakasa        mGestureTrailEnabled = prefs.getBoolean(Settings.PREF_GESTURE_PREVIEW_TRAIL, true);
18093205b17ffb135f792dede75aaf2b5f6c6d5b56aChieu Nguyen        mCloudSyncEnabled = prefs.getBoolean(LocalSettingsConstants.PREF_ENABLE_CLOUD_SYNC, false);
181bc4ae6bdc0249f9282efea5d1fe7ccfefd6f93b0Jatin Matani        mAccount = prefs.getString(LocalSettingsConstants.PREF_ACCOUNT_NAME,
182bc4ae6bdc0249f9282efea5d1fe7ccfefd6f93b0Jatin Matani                null /* default */);
18395b7bd3ba5bc76dedb964f0fb9a858e072ea4e91David Faden        mGestureFloatingPreviewTextEnabled = !mInputAttributes.mDisableGestureFloatingPreviewText
18495b7bd3ba5bc76dedb964f0fb9a858e072ea4e91David Faden                && prefs.getBoolean(Settings.PREF_GESTURE_FLOATING_PREVIEW_TEXT, true);
185ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka        mAutoCorrectionEnabledPerUserSettings = mAutoCorrectEnabled
186ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka                && !mInputAttributes.mInputTypeNoAutoCorrect;
187ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka        mSuggestionsEnabledPerUserSettings = readSuggestionsEnabled(prefs);
188756791e6bf80c1fd86f9a236f4ba8da770a7305fSatoshi Kataoka        mIsInternal = Settings.isInternal(prefs);
189ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        mHasCustomKeyPreviewAnimationParams = prefs.getBoolean(
190ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                DebugSettings.PREF_HAS_CUSTOM_KEY_PREVIEW_ANIMATION_PARAMS, false);
191bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang        mHasKeyboardResize = prefs.getBoolean(DebugSettings.PREF_RESIZE_KEYBOARD, false);
192be819dbe2b7a5c418530a2fa1182766a4d31d6d5Tadashi G. Takaoka        mKeyboardHeightScale = Settings.readKeyboardHeight(prefs, DEFAULT_SIZE_SCALE);
193276b1a2ebc6d5ea3fa36fa9271cdc6310db34021Tadashi G. Takaoka        mKeyPreviewShowUpDuration = Settings.readKeyPreviewAnimationDuration(
194276b1a2ebc6d5ea3fa36fa9271cdc6310db34021Tadashi G. Takaoka                prefs, DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_DURATION,
195276b1a2ebc6d5ea3fa36fa9271cdc6310db34021Tadashi G. Takaoka                res.getInteger(R.integer.config_key_preview_show_up_duration));
196276b1a2ebc6d5ea3fa36fa9271cdc6310db34021Tadashi G. Takaoka        mKeyPreviewDismissDuration = Settings.readKeyPreviewAnimationDuration(
197276b1a2ebc6d5ea3fa36fa9271cdc6310db34021Tadashi G. Takaoka                prefs, DebugSettings.PREF_KEY_PREVIEW_DISMISS_DURATION,
198276b1a2ebc6d5ea3fa36fa9271cdc6310db34021Tadashi G. Takaoka                res.getInteger(R.integer.config_key_preview_dismiss_duration));
199ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        final float defaultKeyPreviewShowUpStartScale = ResourceUtils.getFloatFromFraction(
200ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                res, R.fraction.config_key_preview_show_up_start_scale);
201ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        final float defaultKeyPreviewDismissEndScale = ResourceUtils.getFloatFromFraction(
202ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                res, R.fraction.config_key_preview_dismiss_end_scale);
203ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        mKeyPreviewShowUpStartXScale = Settings.readKeyPreviewAnimationScale(
204ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                prefs, DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_X_SCALE,
205ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                defaultKeyPreviewShowUpStartScale);
206ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        mKeyPreviewShowUpStartYScale = Settings.readKeyPreviewAnimationScale(
207ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                prefs, DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_Y_SCALE,
208ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                defaultKeyPreviewShowUpStartScale);
209ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        mKeyPreviewDismissEndXScale = Settings.readKeyPreviewAnimationScale(
210ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                prefs, DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_X_SCALE,
211ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                defaultKeyPreviewDismissEndScale);
212ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        mKeyPreviewDismissEndYScale = Settings.readKeyPreviewAnimationScale(
213ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                prefs, DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_Y_SCALE,
214ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                defaultKeyPreviewDismissEndScale);
215aa161eb371d8042ef4c1f9207648b3aeacb65e4eJean Chalard        mDisplayOrientation = res.getConfiguration().orientation;
2165a53505fe4c0ae5d04bfcb3612908d3c93be90b1Dan Zivkovic        mAppWorkarounds = new AsyncResultHolder<>("AppWorkarounds");
2171404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard        final PackageInfo packageInfo = TargetPackageInfoGetterTask.getCachedPackageInfo(
2181404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard                mInputAttributes.mTargetApplicationPackageName);
2191404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard        if (null != packageInfo) {
2201404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard            mAppWorkarounds.set(new AppWorkaroundsUtils(packageInfo));
2211404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard        } else {
2221404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard            new TargetPackageInfoGetterTask(context, mAppWorkarounds)
2231404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard                    .execute(mInputAttributes.mTargetApplicationPackageName);
2241404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard        }
2257a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard    }
2267a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
2270807c897f40f22ee4df5d425a8c7f7c207000718Jatin Matani    public boolean isMetricsLoggingEnabled() {
2280807c897f40f22ee4df5d425a8c7f7c207000718Jatin Matani        return mEnableMetricsLogging;
2290807c897f40f22ee4df5d425a8c7f7c207000718Jatin Matani    }
2300807c897f40f22ee4df5d425a8c7f7c207000718Jatin Matani
231dca729fddd69f03d8eaca238c62478a7fd77db96Jean Chalard    public boolean isApplicationSpecifiedCompletionsOn() {
232dca729fddd69f03d8eaca238c62478a7fd77db96Jean Chalard        return mInputAttributes.mApplicationSpecifiedCompletionOn;
233dca729fddd69f03d8eaca238c62478a7fd77db96Jean Chalard    }
234dca729fddd69f03d8eaca238c62478a7fd77db96Jean Chalard
235ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka    public boolean needsToLookupSuggestions() {
2362e32e37d5bf95743eb56ef1b9560ffc5032bccf3Tadashi G. Takaoka        return mInputAttributes.mShouldShowSuggestions
237ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka                && (mAutoCorrectionEnabledPerUserSettings || isSuggestionsEnabledPerUserSettings());
2382010aad741bc1a7266913bcb8b8348d6e401c95bJean Chalard    }
2392010aad741bc1a7266913bcb8b8348d6e401c95bJean Chalard
240ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka    public boolean isSuggestionsEnabledPerUserSettings() {
241ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka        return mSuggestionsEnabledPerUserSettings;
242d2736972598eda61a8e40a3d5b26156136e78d66Jean Chalard    }
243d2736972598eda61a8e40a3d5b26156136e78d66Jean Chalard
2448ec36026c93d13c1118eda936ac12325e0085561Chieu Nguyen    public boolean isPersonalizationEnabled() {
2458ec36026c93d13c1118eda936ac12325e0085561Chieu Nguyen        return mUsePersonalizedDicts;
2468ec36026c93d13c1118eda936ac12325e0085561Chieu Nguyen    }
2478ec36026c93d13c1118eda936ac12325e0085561Chieu Nguyen
248848331222ea15d928faa1dd9422f5efba6be5092Tadashi G. Takaoka    public boolean isWordSeparator(final int code) {
249b90fa0fb2ce195cfaec878dea9702261290176c2Jean Chalard        return mSpacingAndPunctuations.isWordSeparator(code);
2507a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard    }
2517a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
252ae3b96b26ef86a9f342b4aeb2047abdaac5e57a5Jean Chalard    public boolean isWordConnector(final int code) {
253b90fa0fb2ce195cfaec878dea9702261290176c2Jean Chalard        return mSpacingAndPunctuations.isWordConnector(code);
2547a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard    }
2557a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
256af5fbe70ac9eff6979f444c3d938d28a0ec76ebdJean Chalard    public boolean isWordCodePoint(final int code) {
257281dbc397317707dfb55e4508815f8e906b66bb4Jean Chalard        return Character.isLetter(code) || isWordConnector(code)
258281dbc397317707dfb55e4508815f8e906b66bb4Jean Chalard                || Character.COMBINING_SPACING_MARK == Character.getType(code);
259af5fbe70ac9eff6979f444c3d938d28a0ec76ebdJean Chalard    }
260af5fbe70ac9eff6979f444c3d938d28a0ec76ebdJean Chalard
261ae3b96b26ef86a9f342b4aeb2047abdaac5e57a5Jean Chalard    public boolean isUsuallyPrecededBySpace(final int code) {
262b90fa0fb2ce195cfaec878dea9702261290176c2Jean Chalard        return mSpacingAndPunctuations.isUsuallyPrecededBySpace(code);
2637a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard    }
2647a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard
265ae3b96b26ef86a9f342b4aeb2047abdaac5e57a5Jean Chalard    public boolean isUsuallyFollowedBySpace(final int code) {
266b90fa0fb2ce195cfaec878dea9702261290176c2Jean Chalard        return mSpacingAndPunctuations.isUsuallyFollowedBySpace(code);
26700ed3be95cee472685bcba1ea861ac75c61db690Jean Chalard    }
26800ed3be95cee472685bcba1ea861ac75c61db690Jean Chalard
269ec60d60078b4837b657dc207bdbde1748749199eJean Chalard    public boolean shouldInsertSpacesAutomatically() {
270ec60d60078b4837b657dc207bdbde1748749199eJean Chalard        return mInputAttributes.mShouldInsertSpacesAutomatically;
271ec60d60078b4837b657dc207bdbde1748749199eJean Chalard    }
272ec60d60078b4837b657dc207bdbde1748749199eJean Chalard
2736fbbab3b8442ad010c53dc53a09535f7b0ef0323Tadashi G. Takaoka    public boolean isLanguageSwitchKeyEnabled() {
2741a4aa7e307e6090011449446c2c6770b6a0cc987Tadashi G. Takaoka        if (!mShowsLanguageSwitchKey) {
27581d4e3cd66a9388c47c7dba55240ddf849b31934Tadashi G. Takaoka            return false;
27681d4e3cd66a9388c47c7dba55240ddf849b31934Tadashi G. Takaoka        }
2776fbbab3b8442ad010c53dc53a09535f7b0ef0323Tadashi G. Takaoka        final RichInputMethodManager imm = RichInputMethodManager.getInstance();
27881d4e3cd66a9388c47c7dba55240ddf849b31934Tadashi G. Takaoka        if (mIncludesOtherImesInLanguageSwitchList) {
2796fbbab3b8442ad010c53dc53a09535f7b0ef0323Tadashi G. Takaoka            return imm.hasMultipleEnabledIMEsOrSubtypes(false /* include aux subtypes */);
28081d4e3cd66a9388c47c7dba55240ddf849b31934Tadashi G. Takaoka        }
2815f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka        return imm.hasMultipleEnabledSubtypesInThisIme(false /* include aux subtypes */);
28281d4e3cd66a9388c47c7dba55240ddf849b31934Tadashi G. Takaoka    }
28381d4e3cd66a9388c47c7dba55240ddf849b31934Tadashi G. Takaoka
284d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka    public boolean isSameInputType(final EditorInfo editorInfo) {
285d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka        return mInputAttributes.isSameInputType(editorInfo);
2869751a626ec9b2e771afa5b3757e8f8498a328683Tadashi G. Takaoka    }
2879751a626ec9b2e771afa5b3757e8f8498a328683Tadashi G. Takaoka
288aa161eb371d8042ef4c1f9207648b3aeacb65e4eJean Chalard    public boolean hasSameOrientation(final Configuration configuration) {
289aa161eb371d8042ef4c1f9207648b3aeacb65e4eJean Chalard        return mDisplayOrientation == configuration.orientation;
290aa161eb371d8042ef4c1f9207648b3aeacb65e4eJean Chalard    }
291aa161eb371d8042ef4c1f9207648b3aeacb65e4eJean Chalard
2921404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard    public boolean isBeforeJellyBean() {
29392392b21f2003e76a309d81b12ace2839d4783f9Jean Chalard        final AppWorkaroundsUtils appWorkaroundUtils
29492392b21f2003e76a309d81b12ace2839d4783f9Jean Chalard                = mAppWorkarounds.get(null, TIMEOUT_TO_GET_TARGET_PACKAGE);
29592392b21f2003e76a309d81b12ace2839d4783f9Jean Chalard        return null == appWorkaroundUtils ? false : appWorkaroundUtils.isBeforeJellyBean();
2961404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard    }
2971404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard
2981404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard    public boolean isBrokenByRecorrection() {
29992392b21f2003e76a309d81b12ace2839d4783f9Jean Chalard        final AppWorkaroundsUtils appWorkaroundUtils
30092392b21f2003e76a309d81b12ace2839d4783f9Jean Chalard                = mAppWorkarounds.get(null, TIMEOUT_TO_GET_TARGET_PACKAGE);
301605caf1b5fca04f348fae92f4db1a8f10ac7df92Keisuke Kuroyanagi        return null == appWorkaroundUtils ? false : appWorkaroundUtils.isBrokenByRecorrection();
3021404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard    }
3031404c1af850236da4fe4ed3825b70cb228a1da5bJean Chalard
304ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka    private static final String SUGGESTIONS_VISIBILITY_HIDE_VALUE_OBSOLETE = "2";
305ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka
306ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka    private static boolean readSuggestionsEnabled(final SharedPreferences prefs) {
307ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka        if (prefs.contains(Settings.PREF_SHOW_SUGGESTIONS_SETTING_OBSOLETE)) {
308ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka            final boolean alwaysHide = SUGGESTIONS_VISIBILITY_HIDE_VALUE_OBSOLETE.equals(
309ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka                    prefs.getString(Settings.PREF_SHOW_SUGGESTIONS_SETTING_OBSOLETE, null));
310ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka            prefs.edit()
311ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka                    .remove(Settings.PREF_SHOW_SUGGESTIONS_SETTING_OBSOLETE)
312ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka                    .putBoolean(Settings.PREF_SHOW_SUGGESTIONS, !alwaysHide)
313ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka                    .apply();
314ed432962175a6f783428bbdcd7168d20097ec05dJean Chalard        }
315ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka        return prefs.getBoolean(Settings.PREF_SHOW_SUGGESTIONS, true);
316ed432962175a6f783428bbdcd7168d20097ec05dJean Chalard    }
3170fe3611bee5095e7bd0fff2d0fdf8d5a13379132Jean Chalard
3185455179b54eb8230577f518db082796a3055685aDan Zivkovic    private static boolean readBigramPredictionEnabled(final SharedPreferences prefs,
3195455179b54eb8230577f518db082796a3055685aDan Zivkovic            final Resources res) {
3205455179b54eb8230577f518db082796a3055685aDan Zivkovic        return prefs.getBoolean(Settings.PREF_BIGRAM_PREDICTIONS, res.getBoolean(
3215455179b54eb8230577f518db082796a3055685aDan Zivkovic                R.bool.config_default_next_word_prediction));
3225455179b54eb8230577f518db082796a3055685aDan Zivkovic    }
3235455179b54eb8230577f518db082796a3055685aDan Zivkovic
324d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka    private static float readAutoCorrectionThreshold(final Resources res,
325d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka            final String currentAutoCorrectionSetting) {
326d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka        final String[] autoCorrectionThresholdValues = res.getStringArray(
327d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka                R.array.auto_correction_threshold_values);
328d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka        // When autoCorrectionThreshold is greater than 1.0, it's like auto correction is off.
329fba1bd0ec4198fc227bffcdb9c90bb7a36baa5c8Ken Wakasa        final float autoCorrectionThreshold;
330d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka        try {
331d2c6151d4d78e5e7d09080efd14e0a8f5933afb9Tadashi G. Takaoka            final int arrayIndex = Integer.parseInt(currentAutoCorrectionSetting);
332d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka            if (arrayIndex >= 0 && arrayIndex < autoCorrectionThresholdValues.length) {
33370f2762e285fe85676de4270edee97de54674879Satoshi Kataoka                final String val = autoCorrectionThresholdValues[arrayIndex];
334fba1bd0ec4198fc227bffcdb9c90bb7a36baa5c8Ken Wakasa                if (FLOAT_MAX_VALUE_MARKER_STRING.equals(val)) {
335fba1bd0ec4198fc227bffcdb9c90bb7a36baa5c8Ken Wakasa                    autoCorrectionThreshold = Float.MAX_VALUE;
336fba1bd0ec4198fc227bffcdb9c90bb7a36baa5c8Ken Wakasa                } else if (FLOAT_NEGATIVE_INFINITY_MARKER_STRING.equals(val)) {
33770f2762e285fe85676de4270edee97de54674879Satoshi Kataoka                    autoCorrectionThreshold = Float.NEGATIVE_INFINITY;
33870f2762e285fe85676de4270edee97de54674879Satoshi Kataoka                } else {
33970f2762e285fe85676de4270edee97de54674879Satoshi Kataoka                    autoCorrectionThreshold = Float.parseFloat(val);
34070f2762e285fe85676de4270edee97de54674879Satoshi Kataoka                }
341fba1bd0ec4198fc227bffcdb9c90bb7a36baa5c8Ken Wakasa            } else {
342fba1bd0ec4198fc227bffcdb9c90bb7a36baa5c8Ken Wakasa                autoCorrectionThreshold = Float.MAX_VALUE;
343d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka            }
344fba1bd0ec4198fc227bffcdb9c90bb7a36baa5c8Ken Wakasa        } catch (final NumberFormatException e) {
345d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka            // Whenever the threshold settings are correct, never come here.
346d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka            Log.w(TAG, "Cannot load auto correction threshold setting."
347d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka                    + " currentAutoCorrectionSetting: " + currentAutoCorrectionSetting
348d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka                    + ", autoCorrectionThresholdValues: "
34970f2762e285fe85676de4270edee97de54674879Satoshi Kataoka                    + Arrays.toString(autoCorrectionThresholdValues), e);
350fba1bd0ec4198fc227bffcdb9c90bb7a36baa5c8Ken Wakasa            return Float.MAX_VALUE;
351d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka        }
352d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka        return autoCorrectionThreshold;
353e234aed4288efd7b4336f3755a958c25a1540b98Jean Chalard    }
35421a89c1137cba469ad664a63259be370d1650a56Satoshi Kataoka
3552fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    private static boolean needsToShowVoiceInputKey(final SharedPreferences prefs,
3562fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            final Resources res) {
357fcaf47f007ebbaba4e65e2b7c0ec0e2983990bffTadashi G. Takaoka        // Migrate preference from {@link Settings#PREF_VOICE_MODE_OBSOLETE} to
358fcaf47f007ebbaba4e65e2b7c0ec0e2983990bffTadashi G. Takaoka        // {@link Settings#PREF_VOICE_INPUT_KEY}.
359fcaf47f007ebbaba4e65e2b7c0ec0e2983990bffTadashi G. Takaoka        if (prefs.contains(Settings.PREF_VOICE_MODE_OBSOLETE)) {
3602fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            final String voiceModeMain = res.getString(R.string.voice_mode_main);
3612fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            final String voiceMode = prefs.getString(
3622fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                    Settings.PREF_VOICE_MODE_OBSOLETE, voiceModeMain);
3632fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            final boolean shouldShowVoiceInputKey = voiceModeMain.equals(voiceMode);
364fcaf47f007ebbaba4e65e2b7c0ec0e2983990bffTadashi G. Takaoka            prefs.edit()
365fcaf47f007ebbaba4e65e2b7c0ec0e2983990bffTadashi G. Takaoka                    .putBoolean(Settings.PREF_VOICE_INPUT_KEY, shouldShowVoiceInputKey)
366fcaf47f007ebbaba4e65e2b7c0ec0e2983990bffTadashi G. Takaoka                    // Remove the obsolete preference if exists.
367fcaf47f007ebbaba4e65e2b7c0ec0e2983990bffTadashi G. Takaoka                    .remove(Settings.PREF_VOICE_MODE_OBSOLETE)
368fcaf47f007ebbaba4e65e2b7c0ec0e2983990bffTadashi G. Takaoka                    .apply();
36921a89c1137cba469ad664a63259be370d1650a56Satoshi Kataoka        }
37021a89c1137cba469ad664a63259be370d1650a56Satoshi Kataoka        return prefs.getBoolean(Settings.PREF_VOICE_INPUT_KEY, true);
37121a89c1137cba469ad664a63259be370d1650a56Satoshi Kataoka    }
372367a35d377076e387a542560f033434959d72d1dJean Chalard
373367a35d377076e387a542560f033434959d72d1dJean Chalard    public String dump() {
374367a35d377076e387a542560f033434959d72d1dJean Chalard        final StringBuilder sb = new StringBuilder("Current settings :");
375367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mSpacingAndPunctuations = ");
376367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mSpacingAndPunctuations.dump());
377a61b7245b030395451b4c42ec218a946aa95e030Yohei Yukawa        sb.append("\n   mDelayInMillisecondsToUpdateOldSuggestions = ");
378a61b7245b030395451b4c42ec218a946aa95e030Yohei Yukawa        sb.append("" + mDelayInMillisecondsToUpdateOldSuggestions);
379367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mAutoCap = ");
380367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mAutoCap);
381367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mVibrateOn = ");
382367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mVibrateOn);
383367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mSoundOn = ");
384367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mSoundOn);
385367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mKeyPreviewPopupOn = ");
386367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mKeyPreviewPopupOn);
387367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mShowsVoiceInputKey = ");
388367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mShowsVoiceInputKey);
389367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mIncludesOtherImesInLanguageSwitchList = ");
390367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mIncludesOtherImesInLanguageSwitchList);
391367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mShowsLanguageSwitchKey = ");
392367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mShowsLanguageSwitchKey);
393367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mUseContactsDict = ");
394367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mUseContactsDict);
395367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mUsePersonalizedDicts = ");
396367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mUsePersonalizedDicts);
397367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mUseDoubleSpacePeriod = ");
398367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mUseDoubleSpacePeriod);
399367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mBlockPotentiallyOffensive = ");
400367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mBlockPotentiallyOffensive);
4015455179b54eb8230577f518db082796a3055685aDan Zivkovic        sb.append("\n   mBigramPredictionEnabled = ");
4025455179b54eb8230577f518db082796a3055685aDan Zivkovic        sb.append("" + mBigramPredictionEnabled);
403367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mGestureInputEnabled = ");
404367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mGestureInputEnabled);
405367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mGestureTrailEnabled = ");
406367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mGestureTrailEnabled);
407367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mGestureFloatingPreviewTextEnabled = ");
408367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mGestureFloatingPreviewTextEnabled);
409367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mSlidingKeyInputPreviewEnabled = ");
410367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mSlidingKeyInputPreviewEnabled);
411367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mKeyLongpressTimeout = ");
412367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mKeyLongpressTimeout);
413367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mLocale = ");
414367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mLocale);
415367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mInputAttributes = ");
416367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mInputAttributes);
417367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mKeypressVibrationDuration = ");
418367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mKeypressVibrationDuration);
419367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mKeypressSoundVolume = ");
420367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mKeypressSoundVolume);
421367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mKeyPreviewPopupDismissDelay = ");
422367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mKeyPreviewPopupDismissDelay);
423367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mAutoCorrectEnabled = ");
424367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mAutoCorrectEnabled);
425367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mAutoCorrectionThreshold = ");
426367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mAutoCorrectionThreshold);
427ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka        sb.append("\n   mAutoCorrectionEnabledPerUserSettings = ");
428ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka        sb.append("" + mAutoCorrectionEnabledPerUserSettings);
429ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka        sb.append("\n   mSuggestionsEnabledPerUserSettings = ");
430ab661e3ef886a36b02fe094864ae4be6a3260f71Tadashi G. Takaoka        sb.append("" + mSuggestionsEnabledPerUserSettings);
431367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mDisplayOrientation = ");
432367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mDisplayOrientation);
433367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mAppWorkarounds = ");
434367a35d377076e387a542560f033434959d72d1dJean Chalard        final AppWorkaroundsUtils awu = mAppWorkarounds.get(null, 0);
435367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + (null == awu ? "null" : awu.toString()));
436367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mIsInternal = ");
437367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mIsInternal);
438367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mKeyPreviewShowUpDuration = ");
439367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mKeyPreviewShowUpDuration);
440367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("\n   mKeyPreviewDismissDuration = ");
441367a35d377076e387a542560f033434959d72d1dJean Chalard        sb.append("" + mKeyPreviewDismissDuration);
442ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        sb.append("\n   mKeyPreviewShowUpStartScaleX = ");
443ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        sb.append("" + mKeyPreviewShowUpStartXScale);
444ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        sb.append("\n   mKeyPreviewShowUpStartScaleY = ");
445ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        sb.append("" + mKeyPreviewShowUpStartYScale);
446ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        sb.append("\n   mKeyPreviewDismissEndScaleX = ");
447ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        sb.append("" + mKeyPreviewDismissEndXScale);
448ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        sb.append("\n   mKeyPreviewDismissEndScaleY = ");
449ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        sb.append("" + mKeyPreviewDismissEndYScale);
450367a35d377076e387a542560f033434959d72d1dJean Chalard        return sb.toString();
451367a35d377076e387a542560f033434959d72d1dJean Chalard    }
452ed432962175a6f783428bbdcd7168d20097ec05dJean Chalard}
453