2014-07-24 07:48:52 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2014 The Android Open Source Project
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package com.android.inputmethod.latin.settings;
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
import android.content.Intent;
|
|
|
|
import android.content.SharedPreferences;
|
|
|
|
import android.content.res.Resources;
|
|
|
|
import android.os.Bundle;
|
|
|
|
import android.os.Process;
|
|
|
|
import android.preference.Preference;
|
|
|
|
import android.preference.Preference.OnPreferenceClickListener;
|
|
|
|
import android.preference.PreferenceGroup;
|
|
|
|
import android.preference.TwoStatePreference;
|
|
|
|
|
|
|
|
import com.android.inputmethod.latin.DictionaryDumpBroadcastReceiver;
|
|
|
|
import com.android.inputmethod.latin.DictionaryFacilitator;
|
|
|
|
import com.android.inputmethod.latin.R;
|
|
|
|
import com.android.inputmethod.latin.debug.ExternalDictionaryGetterForDebug;
|
|
|
|
import com.android.inputmethod.latin.utils.ApplicationUtils;
|
|
|
|
import com.android.inputmethod.latin.utils.ResourceUtils;
|
|
|
|
|
|
|
|
import java.util.Locale;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* "Debug mode" settings sub screen.
|
|
|
|
*
|
|
|
|
* This settings sub screen handles a several preference options for debugging.
|
|
|
|
*/
|
|
|
|
public final class DebugSettingsFragment extends SubScreenFragment
|
|
|
|
implements OnPreferenceClickListener {
|
|
|
|
private static final String PREF_READ_EXTERNAL_DICTIONARY = "read_external_dictionary";
|
|
|
|
private static final String PREF_KEY_DUMP_DICTS = "pref_key_dump_dictionaries";
|
|
|
|
private static final String PREF_KEY_DUMP_DICT_PREFIX = "pref_key_dump_dictionaries";
|
|
|
|
|
|
|
|
private boolean mServiceNeedsRestart = false;
|
|
|
|
private Preference mReadExternalDictionaryPref;
|
|
|
|
private TwoStatePreference mDebugMode;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onCreate(Bundle icicle) {
|
|
|
|
super.onCreate(icicle);
|
|
|
|
addPreferencesFromResource(R.xml.prefs_screen_debug);
|
|
|
|
|
2014-08-13 06:24:14 +00:00
|
|
|
if (!Settings.HAS_UI_TO_ACCEPT_TYPED_WORD) {
|
|
|
|
removePreference(DebugSettings.PREF_SHOW_UI_TO_ACCEPT_TYPED_WORD);
|
|
|
|
}
|
|
|
|
|
2014-07-24 07:48:52 +00:00
|
|
|
mReadExternalDictionaryPref = findPreference(PREF_READ_EXTERNAL_DICTIONARY);
|
|
|
|
if (mReadExternalDictionaryPref != null) {
|
|
|
|
mReadExternalDictionaryPref.setOnPreferenceClickListener(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
final PreferenceGroup dictDumpPreferenceGroup =
|
|
|
|
(PreferenceGroup)findPreference(PREF_KEY_DUMP_DICTS);
|
|
|
|
for (final String dictName : DictionaryFacilitator.DICT_TYPE_TO_CLASS.keySet()) {
|
|
|
|
final Preference pref = new DictDumpPreference(getActivity(), dictName);
|
|
|
|
pref.setOnPreferenceClickListener(this);
|
|
|
|
dictDumpPreferenceGroup.addPreference(pref);
|
|
|
|
}
|
|
|
|
final Resources res = getResources();
|
|
|
|
setupKeyLongpressTimeoutSettings();
|
|
|
|
setupKeyPreviewAnimationDuration(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_DURATION,
|
|
|
|
res.getInteger(R.integer.config_key_preview_show_up_duration));
|
|
|
|
setupKeyPreviewAnimationDuration(DebugSettings.PREF_KEY_PREVIEW_DISMISS_DURATION,
|
|
|
|
res.getInteger(R.integer.config_key_preview_dismiss_duration));
|
2014-09-01 09:26:34 +00:00
|
|
|
final float defaultKeyPreviewShowUpStartScale = ResourceUtils.getFloatFromFraction(
|
|
|
|
res, R.fraction.config_key_preview_show_up_start_scale);
|
|
|
|
final float defaultKeyPreviewDismissEndScale = ResourceUtils.getFloatFromFraction(
|
|
|
|
res, R.fraction.config_key_preview_dismiss_end_scale);
|
|
|
|
setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_X_SCALE,
|
|
|
|
defaultKeyPreviewShowUpStartScale);
|
|
|
|
setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_Y_SCALE,
|
|
|
|
defaultKeyPreviewShowUpStartScale);
|
|
|
|
setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_X_SCALE,
|
|
|
|
defaultKeyPreviewDismissEndScale);
|
|
|
|
setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_Y_SCALE,
|
|
|
|
defaultKeyPreviewDismissEndScale);
|
2014-07-24 07:48:52 +00:00
|
|
|
|
|
|
|
mServiceNeedsRestart = false;
|
|
|
|
mDebugMode = (TwoStatePreference) findPreference(DebugSettings.PREF_DEBUG_MODE);
|
|
|
|
updateDebugMode();
|
|
|
|
}
|
|
|
|
|
|
|
|
private static class DictDumpPreference extends Preference {
|
|
|
|
public final String mDictName;
|
|
|
|
|
|
|
|
public DictDumpPreference(final Context context, final String dictName) {
|
|
|
|
super(context);
|
|
|
|
setKey(PREF_KEY_DUMP_DICT_PREFIX + dictName);
|
|
|
|
setTitle("Dump " + dictName + " dictionary");
|
|
|
|
mDictName = dictName;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean onPreferenceClick(final Preference pref) {
|
|
|
|
final Context context = getActivity();
|
|
|
|
if (pref == mReadExternalDictionaryPref) {
|
|
|
|
ExternalDictionaryGetterForDebug.chooseAndInstallDictionary(context);
|
|
|
|
mServiceNeedsRestart = true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (pref instanceof DictDumpPreference) {
|
|
|
|
final DictDumpPreference dictDumpPref = (DictDumpPreference)pref;
|
|
|
|
final String dictName = dictDumpPref.mDictName;
|
|
|
|
final Intent intent = new Intent(
|
|
|
|
DictionaryDumpBroadcastReceiver.DICTIONARY_DUMP_INTENT_ACTION);
|
|
|
|
intent.putExtra(DictionaryDumpBroadcastReceiver.DICTIONARY_NAME_KEY, dictName);
|
|
|
|
context.sendBroadcast(intent);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onStop() {
|
|
|
|
super.onStop();
|
|
|
|
if (mServiceNeedsRestart) {
|
|
|
|
Process.killProcess(Process.myPid());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
|
|
|
|
if (key.equals(DebugSettings.PREF_DEBUG_MODE) && mDebugMode != null) {
|
|
|
|
mDebugMode.setChecked(prefs.getBoolean(DebugSettings.PREF_DEBUG_MODE, false));
|
|
|
|
updateDebugMode();
|
|
|
|
mServiceNeedsRestart = true;
|
|
|
|
return;
|
|
|
|
}
|
2014-08-12 13:28:53 +00:00
|
|
|
if (key.equals(DebugSettings.PREF_FORCE_NON_DISTINCT_MULTITOUCH)
|
|
|
|
|| key.equals(DebugSettings.PREF_FORCE_PHYSICAL_KEYBOARD_SPECIAL_KEY)) {
|
2014-07-24 07:48:52 +00:00
|
|
|
mServiceNeedsRestart = true;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void updateDebugMode() {
|
|
|
|
boolean isDebugMode = mDebugMode.isChecked();
|
|
|
|
final String version = getString(
|
|
|
|
R.string.version_text, ApplicationUtils.getVersionName(getActivity()));
|
|
|
|
if (!isDebugMode) {
|
|
|
|
mDebugMode.setTitle(version);
|
|
|
|
mDebugMode.setSummary(null);
|
|
|
|
} else {
|
|
|
|
mDebugMode.setTitle(getString(R.string.prefs_debug_mode));
|
|
|
|
mDebugMode.setSummary(version);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setupKeyLongpressTimeoutSettings() {
|
|
|
|
final SharedPreferences prefs = getSharedPreferences();
|
|
|
|
final Resources res = getResources();
|
|
|
|
final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(
|
|
|
|
DebugSettings.PREF_KEY_LONGPRESS_TIMEOUT);
|
|
|
|
if (pref == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
|
|
|
|
@Override
|
|
|
|
public void writeValue(final int value, final String key) {
|
|
|
|
prefs.edit().putInt(key, value).apply();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void writeDefaultValue(final String key) {
|
|
|
|
prefs.edit().remove(key).apply();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int readValue(final String key) {
|
|
|
|
return Settings.readKeyLongpressTimeout(prefs, res);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int readDefaultValue(final String key) {
|
|
|
|
return Settings.readDefaultKeyLongpressTimeout(res);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getValueText(final int value) {
|
|
|
|
return res.getString(R.string.abbreviation_unit_milliseconds, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void feedbackValue(final int value) {}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setupKeyPreviewAnimationScale(final String prefKey, final float defaultValue) {
|
|
|
|
final SharedPreferences prefs = getSharedPreferences();
|
|
|
|
final Resources res = getResources();
|
|
|
|
final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey);
|
|
|
|
if (pref == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
|
|
|
|
private static final float PERCENTAGE_FLOAT = 100.0f;
|
|
|
|
|
|
|
|
private float getValueFromPercentage(final int percentage) {
|
|
|
|
return percentage / PERCENTAGE_FLOAT;
|
|
|
|
}
|
|
|
|
|
|
|
|
private int getPercentageFromValue(final float floatValue) {
|
|
|
|
return (int)(floatValue * PERCENTAGE_FLOAT);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void writeValue(final int value, final String key) {
|
|
|
|
prefs.edit().putFloat(key, getValueFromPercentage(value)).apply();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void writeDefaultValue(final String key) {
|
|
|
|
prefs.edit().remove(key).apply();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int readValue(final String key) {
|
|
|
|
return getPercentageFromValue(
|
|
|
|
Settings.readKeyPreviewAnimationScale(prefs, key, defaultValue));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int readDefaultValue(final String key) {
|
|
|
|
return getPercentageFromValue(defaultValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getValueText(final int value) {
|
|
|
|
if (value < 0) {
|
|
|
|
return res.getString(R.string.settings_system_default);
|
|
|
|
}
|
|
|
|
return String.format(Locale.ROOT, "%d%%", value);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void feedbackValue(final int value) {}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setupKeyPreviewAnimationDuration(final String prefKey, final int defaultValue) {
|
|
|
|
final SharedPreferences prefs = getSharedPreferences();
|
|
|
|
final Resources res = getResources();
|
|
|
|
final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey);
|
|
|
|
if (pref == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
|
|
|
|
@Override
|
|
|
|
public void writeValue(final int value, final String key) {
|
|
|
|
prefs.edit().putInt(key, value).apply();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void writeDefaultValue(final String key) {
|
|
|
|
prefs.edit().remove(key).apply();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int readValue(final String key) {
|
|
|
|
return Settings.readKeyPreviewAnimationDuration(prefs, key, defaultValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int readDefaultValue(final String key) {
|
|
|
|
return defaultValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getValueText(final int value) {
|
|
|
|
return res.getString(R.string.abbreviation_unit_milliseconds, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void feedbackValue(final int value) {}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|