summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/ButtonSettings.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/ButtonSettings.java')
-rw-r--r--src/com/android/settings/ButtonSettings.java762
1 files changed, 762 insertions, 0 deletions
diff --git a/src/com/android/settings/ButtonSettings.java b/src/com/android/settings/ButtonSettings.java
new file mode 100644
index 0000000..30ac090
--- /dev/null
+++ b/src/com/android/settings/ButtonSettings.java
@@ -0,0 +1,762 @@
+/*
+ * Copyright (C) 2013 The CyanogenMod 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.settings;
+
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.Handler;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceManager;
+import android.preference.PreferenceScreen;
+import android.preference.SwitchPreference;
+import android.provider.Settings;
+
+import android.util.Log;
+import android.view.IWindowManager;
+import android.view.KeyCharacterMap;
+import android.view.KeyEvent;
+import android.view.WindowManagerGlobal;
+
+import com.android.settings.cyanogenmod.ButtonBacklightBrightness;
+import com.android.settings.R;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
+
+import cyanogenmod.hardware.CMHardwareManager;
+import cyanogenmod.providers.CMSettings;
+
+import org.cyanogenmod.internal.logging.CMMetricsLogger;
+import org.cyanogenmod.internal.util.ScreenType;
+
+import java.util.List;
+
+import static android.provider.Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED;
+
+public class ButtonSettings extends SettingsPreferenceFragment implements
+ Preference.OnPreferenceChangeListener {
+ private static final String TAG = "SystemSettings";
+
+ private static final String KEY_BUTTON_BACKLIGHT = "button_backlight";
+ private static final String KEY_HOME_LONG_PRESS = "hardware_keys_home_long_press";
+ private static final String KEY_HOME_DOUBLE_TAP = "hardware_keys_home_double_tap";
+ private static final String KEY_MENU_PRESS = "hardware_keys_menu_press";
+ private static final String KEY_MENU_LONG_PRESS = "hardware_keys_menu_long_press";
+ private static final String KEY_ASSIST_PRESS = "hardware_keys_assist_press";
+ private static final String KEY_ASSIST_LONG_PRESS = "hardware_keys_assist_long_press";
+ private static final String KEY_APP_SWITCH_PRESS = "hardware_keys_app_switch_press";
+ private static final String KEY_APP_SWITCH_LONG_PRESS = "hardware_keys_app_switch_long_press";
+ private static final String KEY_VOLUME_KEY_CURSOR_CONTROL = "volume_key_cursor_control";
+ private static final String KEY_SWAP_VOLUME_BUTTONS = "swap_volume_buttons";
+ private static final String DISABLE_NAV_KEYS = "disable_nav_keys";
+ private static final String KEY_NAVIGATION_BAR_LEFT = "navigation_bar_left";
+ private static final String KEY_NAVIGATION_RECENTS_LONG_PRESS = "navigation_recents_long_press";
+ private static final String KEY_POWER_END_CALL = "power_end_call";
+ private static final String KEY_HOME_ANSWER_CALL = "home_answer_call";
+ private static final String KEY_VOLUME_MUSIC_CONTROLS = "volbtn_music_controls";
+ private static final String KEY_VOLUME_CONTROL_RING_STREAM = "volume_keys_control_ring_stream";
+ private static final String KEY_CAMERA_DOUBLE_TAP_POWER_GESTURE
+ = "camera_double_tap_power_gesture";
+
+ private static final String CATEGORY_POWER = "power_key";
+ private static final String CATEGORY_HOME = "home_key";
+ private static final String CATEGORY_BACK = "back_key";
+ private static final String CATEGORY_MENU = "menu_key";
+ private static final String CATEGORY_ASSIST = "assist_key";
+ private static final String CATEGORY_APPSWITCH = "app_switch_key";
+ private static final String CATEGORY_CAMERA = "camera_key";
+ private static final String CATEGORY_VOLUME = "volume_keys";
+ private static final String CATEGORY_BACKLIGHT = "key_backlight";
+ private static final String CATEGORY_NAVBAR = "navigation_bar_category";
+
+ // Available custom actions to perform on a key press.
+ // Must match values for KEY_HOME_LONG_PRESS_ACTION in:
+ // frameworks/base/core/java/android/provider/Settings.java
+ private static final int ACTION_NOTHING = 0;
+ private static final int ACTION_MENU = 1;
+ private static final int ACTION_APP_SWITCH = 2;
+ private static final int ACTION_SEARCH = 3;
+ private static final int ACTION_VOICE_SEARCH = 4;
+ private static final int ACTION_IN_APP_SEARCH = 5;
+ private static final int ACTION_LAUNCH_CAMERA = 6;
+ private static final int ACTION_SLEEP = 7;
+ private static final int ACTION_LAST_APP = 8;
+
+ // Masks for checking presence of hardware keys.
+ // Must match values in frameworks/base/core/res/res/values/config.xml
+ public static final int KEY_MASK_HOME = 0x01;
+ public static final int KEY_MASK_BACK = 0x02;
+ public static final int KEY_MASK_MENU = 0x04;
+ public static final int KEY_MASK_ASSIST = 0x08;
+ public static final int KEY_MASK_APP_SWITCH = 0x10;
+ public static final int KEY_MASK_CAMERA = 0x20;
+ public static final int KEY_MASK_VOLUME = 0x40;
+
+ private ListPreference mHomeLongPressAction;
+ private ListPreference mHomeDoubleTapAction;
+ private ListPreference mMenuPressAction;
+ private ListPreference mMenuLongPressAction;
+ private ListPreference mAssistPressAction;
+ private ListPreference mAssistLongPressAction;
+ private ListPreference mAppSwitchPressAction;
+ private ListPreference mAppSwitchLongPressAction;
+ private SwitchPreference mCameraWakeScreen;
+ private SwitchPreference mCameraSleepOnRelease;
+ private SwitchPreference mCameraLaunch;
+ private ListPreference mVolumeKeyCursorControl;
+ private SwitchPreference mVolumeWakeScreen;
+ private SwitchPreference mVolumeMusicControls;
+ private SwitchPreference mSwapVolumeButtons;
+ private SwitchPreference mDisableNavigationKeys;
+ private SwitchPreference mNavigationBarLeftPref;
+ private ListPreference mNavigationRecentsLongPressAction;
+ private SwitchPreference mPowerEndCall;
+ private SwitchPreference mHomeAnswerCall;
+ private SwitchPreference mCameraDoubleTapPowerGesture;
+
+ private PreferenceCategory mNavigationPreferencesCat;
+
+ private Handler mHandler;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ addPreferencesFromResource(R.xml.button_settings);
+
+ final Resources res = getResources();
+ final ContentResolver resolver = getActivity().getContentResolver();
+ final PreferenceScreen prefScreen = getPreferenceScreen();
+
+ final int deviceKeys = getResources().getInteger(
+ com.android.internal.R.integer.config_deviceHardwareKeys);
+ final int deviceWakeKeys = getResources().getInteger(
+ com.android.internal.R.integer.config_deviceHardwareWakeKeys);
+
+ final boolean hasPowerKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_POWER);
+ final boolean hasHomeKey = (deviceKeys & KEY_MASK_HOME) != 0;
+ final boolean hasBackKey = (deviceKeys & KEY_MASK_BACK) != 0;
+ final boolean hasMenuKey = (deviceKeys & KEY_MASK_MENU) != 0;
+ final boolean hasAssistKey = (deviceKeys & KEY_MASK_ASSIST) != 0;
+ final boolean hasAppSwitchKey = (deviceKeys & KEY_MASK_APP_SWITCH) != 0;
+ final boolean hasCameraKey = (deviceKeys & KEY_MASK_CAMERA) != 0;
+ final boolean hasVolumeKeys = (deviceKeys & KEY_MASK_VOLUME) != 0;
+
+ final boolean showHomeWake = (deviceWakeKeys & KEY_MASK_HOME) != 0;
+ final boolean showBackWake = (deviceWakeKeys & KEY_MASK_BACK) != 0;
+ final boolean showMenuWake = (deviceWakeKeys & KEY_MASK_MENU) != 0;
+ final boolean showAssistWake = (deviceWakeKeys & KEY_MASK_ASSIST) != 0;
+ final boolean showAppSwitchWake = (deviceWakeKeys & KEY_MASK_APP_SWITCH) != 0;
+ final boolean showCameraWake = (deviceWakeKeys & KEY_MASK_CAMERA) != 0;
+ final boolean showVolumeWake = (deviceWakeKeys & KEY_MASK_VOLUME) != 0;
+
+ boolean hasAnyBindableKey = false;
+ final PreferenceCategory powerCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_POWER);
+ final PreferenceCategory homeCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_HOME);
+ final PreferenceCategory backCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_BACK);
+ final PreferenceCategory menuCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_MENU);
+ final PreferenceCategory assistCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_ASSIST);
+ final PreferenceCategory appSwitchCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_APPSWITCH);
+ final PreferenceCategory volumeCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_VOLUME);
+ final PreferenceCategory cameraCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_CAMERA);
+
+ // Power button ends calls.
+ mPowerEndCall = (SwitchPreference) findPreference(KEY_POWER_END_CALL);
+
+ // Double press power to launch camera.
+ mCameraDoubleTapPowerGesture
+ = (SwitchPreference) findPreference(KEY_CAMERA_DOUBLE_TAP_POWER_GESTURE);
+
+ // Home button answers calls.
+ mHomeAnswerCall = (SwitchPreference) findPreference(KEY_HOME_ANSWER_CALL);
+
+ mHandler = new Handler();
+
+ // Force Navigation bar related options
+ mDisableNavigationKeys = (SwitchPreference) findPreference(DISABLE_NAV_KEYS);
+
+ mNavigationPreferencesCat = (PreferenceCategory) findPreference(CATEGORY_NAVBAR);
+
+ // Navigation bar left
+ mNavigationBarLeftPref = (SwitchPreference) findPreference(KEY_NAVIGATION_BAR_LEFT);
+
+ // Navigation bar recents long press activity needs custom setup
+ mNavigationRecentsLongPressAction =
+ initRecentsLongPressAction(KEY_NAVIGATION_RECENTS_LONG_PRESS);
+
+ final CMHardwareManager hardware = CMHardwareManager.getInstance(getActivity());
+
+ // Only visible on devices that does not have a navigation bar already,
+ // and don't even try unless the existing keys can be disabled
+ boolean needsNavigationBar = false;
+ if (hardware.isSupported(CMHardwareManager.FEATURE_KEY_DISABLE)) {
+ try {
+ IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
+ needsNavigationBar = wm.needsNavigationBar();
+ } catch (RemoteException e) {
+ }
+
+ if (needsNavigationBar) {
+ prefScreen.removePreference(mDisableNavigationKeys);
+ } else {
+ // Remove keys that can be provided by the navbar
+ updateDisableNavkeysOption();
+ mNavigationPreferencesCat.setEnabled(mDisableNavigationKeys.isChecked());
+ updateDisableNavkeysCategories(mDisableNavigationKeys.isChecked());
+ }
+ } else {
+ prefScreen.removePreference(mDisableNavigationKeys);
+ }
+
+ if (hasPowerKey) {
+ if (!Utils.isVoiceCapable(getActivity())) {
+ powerCategory.removePreference(mPowerEndCall);
+ mPowerEndCall = null;
+ }
+ if (mCameraDoubleTapPowerGesture != null &&
+ isCameraDoubleTapPowerGestureAvailable(getResources())) {
+ // Update double tap power to launch camera if available.
+ mCameraDoubleTapPowerGesture.setOnPreferenceChangeListener(this);
+ int cameraDoubleTapPowerDisabled = Settings.Secure.getInt(
+ getContentResolver(), CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0);
+ mCameraDoubleTapPowerGesture.setChecked(cameraDoubleTapPowerDisabled == 0);
+ } else {
+ powerCategory.removePreference(mCameraDoubleTapPowerGesture);
+ mCameraDoubleTapPowerGesture = null;
+ }
+ } else {
+ prefScreen.removePreference(powerCategory);
+ }
+
+ if (hasHomeKey) {
+ if (!showHomeWake) {
+ homeCategory.removePreference(findPreference(CMSettings.System.HOME_WAKE_SCREEN));
+ }
+
+ if (!Utils.isVoiceCapable(getActivity())) {
+ homeCategory.removePreference(mHomeAnswerCall);
+ mHomeAnswerCall = null;
+ }
+
+ int defaultLongPressAction = res.getInteger(
+ com.android.internal.R.integer.config_longPressOnHomeBehavior);
+ if (defaultLongPressAction < ACTION_NOTHING ||
+ defaultLongPressAction > ACTION_LAST_APP) {
+ defaultLongPressAction = ACTION_NOTHING;
+ }
+
+ int defaultDoubleTapAction = res.getInteger(
+ com.android.internal.R.integer.config_doubleTapOnHomeBehavior);
+ if (defaultDoubleTapAction < ACTION_NOTHING ||
+ defaultDoubleTapAction > ACTION_LAST_APP) {
+ defaultDoubleTapAction = ACTION_NOTHING;
+ }
+
+ int longPressAction = CMSettings.System.getInt(resolver,
+ CMSettings.System.KEY_HOME_LONG_PRESS_ACTION,
+ defaultLongPressAction);
+ mHomeLongPressAction = initActionList(KEY_HOME_LONG_PRESS, longPressAction);
+
+ int doubleTapAction = CMSettings.System.getInt(resolver,
+ CMSettings.System.KEY_HOME_DOUBLE_TAP_ACTION,
+ defaultDoubleTapAction);
+ mHomeDoubleTapAction = initActionList(KEY_HOME_DOUBLE_TAP, doubleTapAction);
+
+ hasAnyBindableKey = true;
+ } else {
+ prefScreen.removePreference(homeCategory);
+ }
+
+ if (hasBackKey) {
+ if (!showBackWake) {
+ backCategory.removePreference(findPreference(CMSettings.System.BACK_WAKE_SCREEN));
+ prefScreen.removePreference(backCategory);
+ }
+ } else {
+ prefScreen.removePreference(backCategory);
+ }
+
+ if (hasMenuKey) {
+ if (!showMenuWake) {
+ menuCategory.removePreference(findPreference(CMSettings.System.MENU_WAKE_SCREEN));
+ }
+
+ int pressAction = CMSettings.System.getInt(resolver,
+ CMSettings.System.KEY_MENU_ACTION, ACTION_MENU);
+ mMenuPressAction = initActionList(KEY_MENU_PRESS, pressAction);
+
+ int longPressAction = CMSettings.System.getInt(resolver,
+ CMSettings.System.KEY_MENU_LONG_PRESS_ACTION,
+ hasAssistKey ? ACTION_NOTHING : ACTION_SEARCH);
+ mMenuLongPressAction = initActionList(KEY_MENU_LONG_PRESS, longPressAction);
+
+ hasAnyBindableKey = true;
+ } else {
+ prefScreen.removePreference(menuCategory);
+ }
+
+ if (hasAssistKey) {
+ if (!showAssistWake) {
+ assistCategory.removePreference(findPreference(CMSettings.System.ASSIST_WAKE_SCREEN));
+ }
+
+ int pressAction = CMSettings.System.getInt(resolver,
+ CMSettings.System.KEY_ASSIST_ACTION, ACTION_SEARCH);
+ mAssistPressAction = initActionList(KEY_ASSIST_PRESS, pressAction);
+
+ int longPressAction = CMSettings.System.getInt(resolver,
+ CMSettings.System.KEY_ASSIST_LONG_PRESS_ACTION, ACTION_VOICE_SEARCH);
+ mAssistLongPressAction = initActionList(KEY_ASSIST_LONG_PRESS, longPressAction);
+
+ hasAnyBindableKey = true;
+ } else {
+ prefScreen.removePreference(assistCategory);
+ }
+
+ if (hasAppSwitchKey) {
+ if (!showAppSwitchWake) {
+ appSwitchCategory.removePreference(findPreference(
+ CMSettings.System.APP_SWITCH_WAKE_SCREEN));
+ }
+
+ int pressAction = CMSettings.System.getInt(resolver,
+ CMSettings.System.KEY_APP_SWITCH_ACTION, ACTION_APP_SWITCH);
+ mAppSwitchPressAction = initActionList(KEY_APP_SWITCH_PRESS, pressAction);
+
+ int longPressAction = CMSettings.System.getInt(resolver,
+ CMSettings.System.KEY_APP_SWITCH_LONG_PRESS_ACTION, ACTION_NOTHING);
+ mAppSwitchLongPressAction = initActionList(KEY_APP_SWITCH_LONG_PRESS, longPressAction);
+
+ hasAnyBindableKey = true;
+ } else {
+ prefScreen.removePreference(appSwitchCategory);
+ }
+
+ if (hasCameraKey) {
+ mCameraWakeScreen = (SwitchPreference) findPreference(CMSettings.System.CAMERA_WAKE_SCREEN);
+ mCameraSleepOnRelease =
+ (SwitchPreference) findPreference(CMSettings.System.CAMERA_SLEEP_ON_RELEASE);
+ mCameraLaunch = (SwitchPreference) findPreference(CMSettings.System.CAMERA_LAUNCH);
+
+ if (!showCameraWake) {
+ prefScreen.removePreference(mCameraWakeScreen);
+ }
+ // Only show 'Camera sleep on release' if the device has a focus key
+ if (res.getBoolean(com.android.internal.R.bool.config_singleStageCameraKey)) {
+ prefScreen.removePreference(mCameraSleepOnRelease);
+ }
+ } else {
+ prefScreen.removePreference(cameraCategory);
+ }
+
+ if (Utils.hasVolumeRocker(getActivity())) {
+ if (!showVolumeWake) {
+ volumeCategory.removePreference(findPreference(CMSettings.System.VOLUME_WAKE_SCREEN));
+ }
+
+ int cursorControlAction = Settings.System.getInt(resolver,
+ Settings.System.VOLUME_KEY_CURSOR_CONTROL, 0);
+ mVolumeKeyCursorControl = initActionList(KEY_VOLUME_KEY_CURSOR_CONTROL,
+ cursorControlAction);
+
+ int swapVolumeKeys = CMSettings.System.getInt(getContentResolver(),
+ CMSettings.System.SWAP_VOLUME_KEYS_ON_ROTATION, 0);
+ mSwapVolumeButtons = (SwitchPreference)
+ prefScreen.findPreference(KEY_SWAP_VOLUME_BUTTONS);
+ if (mSwapVolumeButtons != null) {
+ mSwapVolumeButtons.setChecked(swapVolumeKeys > 0);
+ }
+ } else {
+ prefScreen.removePreference(volumeCategory);
+ }
+
+ try {
+ // Only show the navigation bar category on devices that have a navigation bar
+ // unless we are forcing it via development settings
+ boolean forceNavbar = CMSettings.Secure.getInt(getContentResolver(),
+ CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, 0) == 1;
+ boolean hasNavBar = WindowManagerGlobal.getWindowManagerService().hasNavigationBar()
+ || forceNavbar;
+
+ if (!ScreenType.isPhone(getActivity())) {
+ mNavigationPreferencesCat.removePreference(mNavigationBarLeftPref);
+ }
+
+ if (!hasNavBar && (needsNavigationBar ||
+ !hardware.isSupported(CMHardwareManager.FEATURE_KEY_DISABLE))) {
+ // Hide navigation bar category
+ prefScreen.removePreference(mNavigationPreferencesCat);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error getting navigation bar status");
+ }
+
+ final ButtonBacklightBrightness backlight =
+ (ButtonBacklightBrightness) findPreference(KEY_BUTTON_BACKLIGHT);
+ if (!backlight.isButtonSupported() && !backlight.isKeyboardSupported()) {
+ prefScreen.removePreference(backlight);
+ }
+
+ if (mCameraWakeScreen != null) {
+ if (mCameraSleepOnRelease != null && !getResources().getBoolean(
+ com.android.internal.R.bool.config_singleStageCameraKey)) {
+ mCameraSleepOnRelease.setDependency(CMSettings.System.CAMERA_WAKE_SCREEN);
+ }
+ }
+ mVolumeWakeScreen = (SwitchPreference) findPreference(CMSettings.System.VOLUME_WAKE_SCREEN);
+ mVolumeMusicControls = (SwitchPreference) findPreference(KEY_VOLUME_MUSIC_CONTROLS);
+
+ if (mVolumeWakeScreen != null) {
+ if (mVolumeMusicControls != null) {
+ mVolumeMusicControls.setDependency(CMSettings.System.VOLUME_WAKE_SCREEN);
+ mVolumeWakeScreen.setDisableDependentsState(true);
+ }
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ // Power button ends calls.
+ if (mPowerEndCall != null) {
+ final int incallPowerBehavior = Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR,
+ Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_DEFAULT);
+ final boolean powerButtonEndsCall =
+ (incallPowerBehavior == Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP);
+ mPowerEndCall.setChecked(powerButtonEndsCall);
+ }
+
+ // Home button answers calls.
+ if (mHomeAnswerCall != null) {
+ final int incallHomeBehavior = CMSettings.Secure.getInt(getContentResolver(),
+ CMSettings.Secure.RING_HOME_BUTTON_BEHAVIOR,
+ CMSettings.Secure.RING_HOME_BUTTON_BEHAVIOR_DEFAULT);
+ final boolean homeButtonAnswersCall =
+ (incallHomeBehavior == CMSettings.Secure.RING_HOME_BUTTON_BEHAVIOR_ANSWER);
+ mHomeAnswerCall.setChecked(homeButtonAnswersCall);
+ }
+ }
+
+ private ListPreference initActionList(String key, int value) {
+ ListPreference list = (ListPreference) getPreferenceScreen().findPreference(key);
+ if (list == null) return null;
+ list.setValue(Integer.toString(value));
+ list.setSummary(list.getEntry());
+ list.setOnPreferenceChangeListener(this);
+ return list;
+ }
+
+ private ListPreference initRecentsLongPressAction(String key) {
+ ListPreference list = (ListPreference) getPreferenceScreen().findPreference(key);
+ list.setOnPreferenceChangeListener(this);
+
+ // Read the componentName from Settings.Secure, this is the user's prefered setting
+ String componentString = CMSettings.Secure.getString(getContentResolver(),
+ CMSettings.Secure.RECENTS_LONG_PRESS_ACTIVITY);
+ ComponentName targetComponent = null;
+ if (componentString == null) {
+ list.setSummary(getString(R.string.hardware_keys_action_last_app));
+ } else {
+ targetComponent = ComponentName.unflattenFromString(componentString);
+ }
+
+ // Dyanamically generate the list array,
+ // query PackageManager for all Activites that are registered for ACTION_RECENTS_LONG_PRESS
+ PackageManager pm = getPackageManager();
+ Intent intent = new Intent(cyanogenmod.content.Intent.ACTION_RECENTS_LONG_PRESS);
+ List<ResolveInfo> recentsActivities = pm.queryIntentActivities(intent,
+ PackageManager.MATCH_DEFAULT_ONLY);
+ if (recentsActivities.size() == 0) {
+ // No entries available, disable
+ list.setSummary(getString(R.string.hardware_keys_action_last_app));
+ CMSettings.Secure.putString(getContentResolver(),
+ CMSettings.Secure.RECENTS_LONG_PRESS_ACTIVITY, null);
+ list.setEnabled(false);
+ return list;
+ }
+
+ CharSequence[] entries = new CharSequence[recentsActivities.size() + 1];
+ CharSequence[] values = new CharSequence[recentsActivities.size() + 1];
+ // First entry is always default last app
+ entries[0] = getString(R.string.hardware_keys_action_last_app);
+ values[0] = "";
+ list.setValue(values[0].toString());
+ int i = 1;
+ for (ResolveInfo info : recentsActivities) {
+ try {
+ // Use pm.getApplicationInfo for the label,
+ // we cannot rely on ResolveInfo that comes back from queryIntentActivities.
+ entries[i] = pm.getApplicationInfo(info.activityInfo.packageName, 0).loadLabel(pm);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "Error package not found: " + info.activityInfo.packageName, e);
+ // Fallback to package name
+ entries[i] = info.activityInfo.packageName;
+ }
+
+ // Set the value to the ComponentName that will handle this intent
+ ComponentName entryComponent = new ComponentName(info.activityInfo.packageName,
+ info.activityInfo.name);
+ values[i] = entryComponent.flattenToString();
+ if (targetComponent != null) {
+ if (entryComponent.equals(targetComponent)) {
+ // Update the selected value and the preference summary
+ list.setSummary(entries[i]);
+ list.setValue(values[i].toString());
+ }
+ }
+ i++;
+ }
+ list.setEntries(entries);
+ list.setEntryValues(values);
+ return list;
+ }
+
+ private void handleActionListChange(ListPreference pref, Object newValue, String setting) {
+ String value = (String) newValue;
+ int index = pref.findIndexOfValue(value);
+ pref.setSummary(pref.getEntries()[index]);
+ CMSettings.System.putInt(getContentResolver(), setting, Integer.valueOf(value));
+ }
+
+ private void handleSystemActionListChange(ListPreference pref, Object newValue, String setting) {
+ String value = (String) newValue;
+ int index = pref.findIndexOfValue(value);
+ pref.setSummary(pref.getEntries()[index]);
+ Settings.System.putInt(getContentResolver(), setting, Integer.valueOf(value));
+ }
+
+ @Override
+ protected int getMetricsCategory() {
+ return CMMetricsLogger.BUTTON_SETTINGS;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ if (preference == mHomeLongPressAction) {
+ handleActionListChange(mHomeLongPressAction, newValue,
+ CMSettings.System.KEY_HOME_LONG_PRESS_ACTION);
+ return true;
+ } else if (preference == mHomeDoubleTapAction) {
+ handleActionListChange(mHomeDoubleTapAction, newValue,
+ CMSettings.System.KEY_HOME_DOUBLE_TAP_ACTION);
+ return true;
+ } else if (preference == mMenuPressAction) {
+ handleActionListChange(mMenuPressAction, newValue,
+ CMSettings.System.KEY_MENU_ACTION);
+ return true;
+ } else if (preference == mMenuLongPressAction) {
+ handleActionListChange(mMenuLongPressAction, newValue,
+ CMSettings.System.KEY_MENU_LONG_PRESS_ACTION);
+ return true;
+ } else if (preference == mAssistPressAction) {
+ handleActionListChange(mAssistPressAction, newValue,
+ CMSettings.System.KEY_ASSIST_ACTION);
+ return true;
+ } else if (preference == mAssistLongPressAction) {
+ handleActionListChange(mAssistLongPressAction, newValue,
+ CMSettings.System.KEY_ASSIST_LONG_PRESS_ACTION);
+ return true;
+ } else if (preference == mAppSwitchPressAction) {
+ handleActionListChange(mAppSwitchPressAction, newValue,
+ CMSettings.System.KEY_APP_SWITCH_ACTION);
+ return true;
+ } else if (preference == mAppSwitchLongPressAction) {
+ handleActionListChange(mAppSwitchLongPressAction, newValue,
+ CMSettings.System.KEY_APP_SWITCH_LONG_PRESS_ACTION);
+ return true;
+ } else if (preference == mVolumeKeyCursorControl) {
+ handleSystemActionListChange(mVolumeKeyCursorControl, newValue,
+ Settings.System.VOLUME_KEY_CURSOR_CONTROL);
+ return true;
+ } else if (preference == mNavigationRecentsLongPressAction) {
+ // RecentsLongPressAction is handled differently because it intentionally uses
+ // Settings.System
+ String putString = (String) newValue;
+ int index = mNavigationRecentsLongPressAction.findIndexOfValue(putString);
+ CharSequence summary = mNavigationRecentsLongPressAction.getEntries()[index];
+ // Update the summary
+ mNavigationRecentsLongPressAction.setSummary(summary);
+ if (putString.length() == 0) {
+ putString = null;
+ }
+ CMSettings.Secure.putString(getContentResolver(),
+ CMSettings.Secure.RECENTS_LONG_PRESS_ACTIVITY, putString);
+ return true;
+ } else if (preference == mCameraDoubleTapPowerGesture) {
+ boolean value = (Boolean) newValue;
+ Settings.Secure.putInt(getContentResolver(), CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED,
+ value ? 0 : 1 /* Backwards because setting is for disabling */);
+ return true;
+ }
+ return false;
+ }
+
+ private static void writeDisableNavkeysOption(Context context, boolean enabled) {
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ final int defaultBrightness = context.getResources().getInteger(
+ com.android.internal.R.integer.config_buttonBrightnessSettingDefault);
+
+ CMSettings.Secure.putInt(context.getContentResolver(),
+ CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, enabled ? 1 : 0);
+ CMHardwareManager hardware = CMHardwareManager.getInstance(context);
+ hardware.set(CMHardwareManager.FEATURE_KEY_DISABLE, enabled);
+
+ /* Save/restore button timeouts to disable them in softkey mode */
+ if (enabled) {
+ CMSettings.Secure.putInt(context.getContentResolver(),
+ CMSettings.Secure.BUTTON_BRIGHTNESS, 0);
+ } else {
+ int oldBright = prefs.getInt(ButtonBacklightBrightness.KEY_BUTTON_BACKLIGHT,
+ defaultBrightness);
+ CMSettings.Secure.putInt(context.getContentResolver(),
+ CMSettings.Secure.BUTTON_BRIGHTNESS, oldBright);
+ }
+ }
+
+ private void updateDisableNavkeysOption() {
+ boolean enabled = CMSettings.Secure.getInt(getActivity().getContentResolver(),
+ CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, 0) != 0;
+
+ mDisableNavigationKeys.setChecked(enabled);
+ }
+
+ private void updateDisableNavkeysCategories(boolean navbarEnabled) {
+ final PreferenceScreen prefScreen = getPreferenceScreen();
+
+ /* Disable hw-key options if they're disabled */
+ final PreferenceCategory homeCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_HOME);
+ final PreferenceCategory backCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_BACK);
+ final PreferenceCategory menuCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_MENU);
+ final PreferenceCategory assistCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_ASSIST);
+ final PreferenceCategory appSwitchCategory =
+ (PreferenceCategory) prefScreen.findPreference(CATEGORY_APPSWITCH);
+ final ButtonBacklightBrightness backlight =
+ (ButtonBacklightBrightness) prefScreen.findPreference(KEY_BUTTON_BACKLIGHT);
+
+ /* Toggle backlight control depending on navbar state, force it to
+ off if enabling */
+ if (backlight != null) {
+ backlight.setEnabled(!navbarEnabled);
+ backlight.updateSummary();
+ }
+
+ /* Toggle hardkey control availability depending on navbar state */
+ if (homeCategory != null) {
+ homeCategory.setEnabled(!navbarEnabled);
+ }
+ if (backCategory != null) {
+ backCategory.setEnabled(!navbarEnabled);
+ }
+ if (menuCategory != null) {
+ menuCategory.setEnabled(!navbarEnabled);
+ }
+ if (assistCategory != null) {
+ assistCategory.setEnabled(!navbarEnabled);
+ }
+ if (appSwitchCategory != null) {
+ appSwitchCategory.setEnabled(!navbarEnabled);
+ }
+ }
+
+ public static void restoreKeyDisabler(Context context) {
+ CMHardwareManager hardware = CMHardwareManager.getInstance(context);
+ if (!hardware.isSupported(CMHardwareManager.FEATURE_KEY_DISABLE)) {
+ return;
+ }
+
+ writeDisableNavkeysOption(context, CMSettings.Secure.getInt(context.getContentResolver(),
+ CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, 0) != 0);
+ }
+
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ if (preference == mSwapVolumeButtons) {
+ int value = mSwapVolumeButtons.isChecked()
+ ? (ScreenType.isTablet(getActivity()) ? 2 : 1) : 0;
+ CMSettings.System.putInt(getActivity().getContentResolver(),
+ CMSettings.System.SWAP_VOLUME_KEYS_ON_ROTATION, value);
+ } else if (preference == mDisableNavigationKeys) {
+ mDisableNavigationKeys.setEnabled(false);
+ mNavigationPreferencesCat.setEnabled(false);
+ writeDisableNavkeysOption(getActivity(), mDisableNavigationKeys.isChecked());
+ updateDisableNavkeysOption();
+ updateDisableNavkeysCategories(true);
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ mDisableNavigationKeys.setEnabled(true);
+ mNavigationPreferencesCat.setEnabled(mDisableNavigationKeys.isChecked());
+ updateDisableNavkeysCategories(mDisableNavigationKeys.isChecked());
+ }
+ }, 1000);
+ } else if (preference == mPowerEndCall) {
+ handleTogglePowerButtonEndsCallPreferenceClick();
+ return true;
+ } else if (preference == mHomeAnswerCall) {
+ handleToggleHomeButtonAnswersCallPreferenceClick();
+ return true;
+ }
+
+ return super.onPreferenceTreeClick(preferenceScreen, preference);
+ }
+
+ private void handleTogglePowerButtonEndsCallPreferenceClick() {
+ Settings.Secure.putInt(getContentResolver(),
+ Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR, (mPowerEndCall.isChecked()
+ ? Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_HANGUP
+ : Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_SCREEN_OFF));
+ }
+
+ private void handleToggleHomeButtonAnswersCallPreferenceClick() {
+ CMSettings.Secure.putInt(getContentResolver(),
+ CMSettings.Secure.RING_HOME_BUTTON_BEHAVIOR, (mHomeAnswerCall.isChecked()
+ ? CMSettings.Secure.RING_HOME_BUTTON_BEHAVIOR_ANSWER
+ : CMSettings.Secure.RING_HOME_BUTTON_BEHAVIOR_DO_NOTHING));
+ }
+
+ private static boolean isCameraDoubleTapPowerGestureAvailable(Resources res) {
+ return res.getBoolean(
+ com.android.internal.R.bool.config_cameraDoubleTapPowerGestureEnabled);
+ }
+}