diff options
Diffstat (limited to 'src/com/android/settings/ButtonSettings.java')
| -rw-r--r-- | src/com/android/settings/ButtonSettings.java | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/com/android/settings/ButtonSettings.java b/src/com/android/settings/ButtonSettings.java index 6cb6895c6..95bb3d98c 100644 --- a/src/com/android/settings/ButtonSettings.java +++ b/src/com/android/settings/ButtonSettings.java @@ -16,8 +16,12 @@ 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; @@ -63,6 +67,7 @@ public class ButtonSettings extends SettingsPreferenceFragment implements 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_BLUETOOTH_INPUT_SETTINGS = "bluetooth_input_settings"; @@ -113,6 +118,7 @@ public class ButtonSettings extends SettingsPreferenceFragment implements private SwitchPreference mSwapVolumeButtons; private SwitchPreference mDisableNavigationKeys; private SwitchPreference mNavigationBarLeftPref; + private ListPreference mNavigationRecentsLongPressAction; private SwitchPreference mPowerEndCall; private SwitchPreference mHomeAnswerCall; @@ -182,6 +188,9 @@ public class ButtonSettings extends SettingsPreferenceFragment implements // 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); + // 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; @@ -402,6 +411,68 @@ public class ButtonSettings extends SettingsPreferenceFragment implements 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 = Settings.Secure.getString(getContentResolver(), + Settings.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(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)); + Settings.Secure.putString(getContentResolver(), Settings.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); @@ -452,6 +523,19 @@ public class ButtonSettings extends SettingsPreferenceFragment implements handleActionListChange(mVolumeKeyCursorControl, newValue, Settings.System.VOLUME_KEY_CURSOR_CONTROL); return true; + } else if (preference == mNavigationRecentsLongPressAction) { + // RecentsLongPressAction is handled differently because it intentionally uses Settings. + // 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; + } + Settings.Secure.putString(getContentResolver(), Settings.Secure.RECENTS_LONG_PRESS_ACTIVITY, putString); + return true; } return false; } |
