diff options
Diffstat (limited to 'src/com/android/settings/cyanogenmod/NotificationDrawer.java')
-rw-r--r-- | src/com/android/settings/cyanogenmod/NotificationDrawer.java | 597 |
1 files changed, 597 insertions, 0 deletions
diff --git a/src/com/android/settings/cyanogenmod/NotificationDrawer.java b/src/com/android/settings/cyanogenmod/NotificationDrawer.java new file mode 100644 index 0000000..fd45989 --- /dev/null +++ b/src/com/android/settings/cyanogenmod/NotificationDrawer.java @@ -0,0 +1,597 @@ +/* + * Copyright (C) 2011 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.cyanogenmod; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import android.app.ListFragment; +import android.content.ContentResolver; +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.net.wimax.WimaxHelper; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.ListPreference; +import android.preference.MultiSelectListPreference; +import android.preference.Preference; +import android.preference.PreferenceCategory; +import android.preference.PreferenceScreen; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +import com.android.internal.telephony.Phone; +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; + +import static com.android.internal.util.cm.QSUtils.deviceSupportsMobileData; + +public class NotificationDrawer extends SettingsPreferenceFragment implements + Preference.OnPreferenceChangeListener { + private static final String TAG = "PowerWidget"; + private static final String SEPARATOR = "OV=I=XseparatorX=I=VO"; + private static final String UI_COLLAPSE_BEHAVIOUR = "notification_drawer_collapse_on_dismiss"; + private static final String UI_EXP_WIDGET = "expanded_widget"; + private static final String UI_EXP_WIDGET_HIDE_ONCHANGE = "expanded_hide_onchange"; + private static final String UI_EXP_WIDGET_HIDE_SCROLLBAR = "expanded_hide_scrollbar"; + private static final String UI_EXP_WIDGET_HAPTIC_FEEDBACK = "expanded_haptic_feedback"; + + private ListPreference mCollapseOnDismiss; + private CheckBoxPreference mPowerWidget; + private CheckBoxPreference mPowerWidgetHideOnChange; + private CheckBoxPreference mPowerWidgetHideScrollBar; + private ListPreference mPowerWidgetHapticFeedback; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (getPreferenceManager() != null) { + addPreferencesFromResource(R.xml.notification_drawer); + + ContentResolver resolver = getActivity().getContentResolver(); + PreferenceScreen prefSet = getPreferenceScreen(); + + int collapseBehaviour = Settings.System.getInt(resolver, + Settings.System.STATUS_BAR_COLLAPSE_ON_DISMISS, + Settings.System.STATUS_BAR_COLLAPSE_IF_NO_CLEARABLE); + mCollapseOnDismiss = (ListPreference) prefSet.findPreference(UI_COLLAPSE_BEHAVIOUR); + mCollapseOnDismiss.setValue(String.valueOf(collapseBehaviour)); + mCollapseOnDismiss.setOnPreferenceChangeListener(this); + updateCollapseBehaviourSummary(collapseBehaviour); + + mPowerWidget = (CheckBoxPreference) prefSet.findPreference(UI_EXP_WIDGET); + mPowerWidget.setOnPreferenceChangeListener(this); + mPowerWidgetHideOnChange = (CheckBoxPreference) prefSet + .findPreference(UI_EXP_WIDGET_HIDE_ONCHANGE); + mPowerWidgetHideOnChange.setOnPreferenceChangeListener(this); + mPowerWidgetHideScrollBar = (CheckBoxPreference) prefSet + .findPreference(UI_EXP_WIDGET_HIDE_SCROLLBAR); + mPowerWidgetHideScrollBar.setOnPreferenceChangeListener(this); + + mPowerWidgetHapticFeedback = (ListPreference) prefSet + .findPreference(UI_EXP_WIDGET_HAPTIC_FEEDBACK); + mPowerWidgetHapticFeedback.setOnPreferenceChangeListener(this); + mPowerWidgetHapticFeedback.setSummary(mPowerWidgetHapticFeedback.getEntry()); + + mPowerWidget.setChecked(Settings.System.getInt(resolver, + Settings.System.EXPANDED_VIEW_WIDGET, 0) == 1); + mPowerWidgetHideOnChange.setChecked(Settings.System.getInt(resolver, + Settings.System.EXPANDED_HIDE_ONCHANGE, 0) == 1); + mPowerWidgetHideScrollBar.setChecked(Settings.System.getInt(resolver, + Settings.System.EXPANDED_HIDE_SCROLLBAR, 0) == 1); + mPowerWidgetHapticFeedback.setValue(Integer.toString(Settings.System.getInt( + resolver, Settings.System.EXPANDED_HAPTIC_FEEDBACK, 2))); + } + } + + private void updateCollapseBehaviourSummary(int setting) { + String[] summaries = getResources().getStringArray( + R.array.notification_drawer_collapse_on_dismiss_summaries); + mCollapseOnDismiss.setSummary(summaries[setting]); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + ContentResolver resolver = getActivity().getContentResolver(); + + if (preference == mCollapseOnDismiss) { + int value = Integer.valueOf((String) newValue); + Settings.System.putInt(resolver, + Settings.System.STATUS_BAR_COLLAPSE_ON_DISMISS, value); + updateCollapseBehaviourSummary(value); + return true; + } else if (preference == mPowerWidget) { + boolean value = (Boolean) newValue; + Settings.System.putInt(resolver, + Settings.System.EXPANDED_VIEW_WIDGET, value ? 1 : 0); + return true; + } else if (preference == mPowerWidgetHideOnChange) { + boolean value = (Boolean) newValue; + Settings.System.putInt(resolver, + Settings.System.EXPANDED_HIDE_ONCHANGE, value ? 1 : 0); + return true; + } else if (preference == mPowerWidgetHideScrollBar) { + boolean value = (Boolean) newValue; + Settings.System.putInt(resolver, + Settings.System.EXPANDED_HIDE_SCROLLBAR, value ? 1 : 0); + return true; + } else if (preference == mPowerWidgetHapticFeedback) { + int intValue = Integer.parseInt((String) newValue); + int index = mPowerWidgetHapticFeedback.findIndexOfValue((String) newValue); + Settings.System.putInt(resolver, + Settings.System.EXPANDED_HAPTIC_FEEDBACK, intValue); + mPowerWidgetHapticFeedback.setSummary(mPowerWidgetHapticFeedback.getEntries()[index]); + return true; + } + + return false; + } + + public static class PowerWidgetChooser extends SettingsPreferenceFragment + implements Preference.OnPreferenceChangeListener { + + public PowerWidgetChooser() { + } + + private static final String TAG = "PowerWidgetActivity"; + + private static final String BUTTONS_CATEGORY = "pref_buttons"; + private static final String BUTTON_MODES_CATEGORY = "pref_buttons_modes"; + private static final String SELECT_BUTTON_KEY_PREFIX = "pref_button_"; + + private static final String EXP_BRIGHTNESS_MODE = "pref_brightness_mode"; + private static final String EXP_NETWORK_MODE = "pref_network_mode"; + private static final String EXP_SCREENTIMEOUT_MODE = "pref_screentimeout_mode"; + private static final String EXP_RING_MODE = "pref_ring_mode"; + private static final String EXP_FLASH_MODE = "pref_flash_mode"; + + private HashMap<CheckBoxPreference, String> mCheckBoxPrefs = new HashMap<CheckBoxPreference, String>(); + + MultiSelectListPreference mBrightnessMode; + ListPreference mNetworkMode; + ListPreference mScreenTimeoutMode; + MultiSelectListPreference mRingMode; + ListPreference mFlashMode; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + addPreferencesFromResource(R.xml.power_widget); + + PreferenceScreen prefSet = getPreferenceScreen(); + PackageManager pm = getPackageManager(); + + if (getActivity().getApplicationContext() == null) { + return; + } + + mBrightnessMode = (MultiSelectListPreference) prefSet + .findPreference(EXP_BRIGHTNESS_MODE); + String storedBrightnessMode = Settings.System.getString(getActivity() + .getApplicationContext().getContentResolver(), + Settings.System.EXPANDED_BRIGHTNESS_MODE); + if (storedBrightnessMode != null) { + String[] brightnessModeArray = TextUtils.split(storedBrightnessMode, SEPARATOR); + mBrightnessMode.setValues(new HashSet<String>(Arrays.asList(brightnessModeArray))); + updateSummary(storedBrightnessMode, mBrightnessMode, R.string.pref_brightness_mode_summary); + } + mBrightnessMode.setOnPreferenceChangeListener(this); + mNetworkMode = (ListPreference) prefSet.findPreference(EXP_NETWORK_MODE); + mNetworkMode.setOnPreferenceChangeListener(this); + mScreenTimeoutMode = (ListPreference) prefSet.findPreference(EXP_SCREENTIMEOUT_MODE); + mScreenTimeoutMode.setOnPreferenceChangeListener(this); + mRingMode = (MultiSelectListPreference) prefSet.findPreference(EXP_RING_MODE); + String storedRingMode = Settings.System.getString(getActivity() + .getApplicationContext().getContentResolver(), + Settings.System.EXPANDED_RING_MODE); + if (storedRingMode != null) { + String[] ringModeArray = TextUtils.split(storedRingMode, SEPARATOR); + mRingMode.setValues(new HashSet<String>(Arrays.asList(ringModeArray))); + updateSummary(storedRingMode, mRingMode, R.string.pref_ring_mode_summary); + } + mRingMode.setOnPreferenceChangeListener(this); + mFlashMode = (ListPreference) prefSet.findPreference(EXP_FLASH_MODE); + mFlashMode.setOnPreferenceChangeListener(this); + + // TODO: set the default values of the items + + // Update the summary text + mNetworkMode.setSummary(mNetworkMode.getEntry()); + mScreenTimeoutMode.setSummary(mScreenTimeoutMode.getEntry()); + mFlashMode.setSummary(mFlashMode.getEntry()); + + // Add the available buttons to the list + PreferenceCategory prefButtons = (PreferenceCategory) prefSet + .findPreference(BUTTONS_CATEGORY); + + // Add the available mode buttons, incase they need to be removed later + PreferenceCategory prefButtonsModes = (PreferenceCategory) prefSet + .findPreference(BUTTON_MODES_CATEGORY); + + // empty our preference category and set it to order as added + prefButtons.removeAll(); + prefButtons.setOrderingAsAdded(false); + + // emtpy our checkbox map + mCheckBoxPrefs.clear(); + + // get our list of buttons + ArrayList<String> buttonList = PowerWidgetUtil.getButtonListFromString(PowerWidgetUtil + .getCurrentButtons(getActivity().getApplicationContext())); + + // Don't show WiMAX option if not supported + boolean isWimaxEnabled = WimaxHelper.isWimaxSupported(getActivity()); + if (!isWimaxEnabled) { + PowerWidgetUtil.BUTTONS.remove(PowerWidgetUtil.BUTTON_WIMAX); + } + + // Don't show mobile data options if not supported + if (!deviceSupportsMobileData(getActivity())) { + PowerWidgetUtil.BUTTONS.remove(PowerWidgetUtil.BUTTON_MOBILEDATA); + PowerWidgetUtil.BUTTONS.remove(PowerWidgetUtil.BUTTON_NETWORKMODE); + PowerWidgetUtil.BUTTONS.remove(PowerWidgetUtil.BUTTON_WIFIAP); + prefButtonsModes.removePreference(mNetworkMode); + } + + // fill that checkbox map! + for (PowerWidgetUtil.ButtonInfo button : PowerWidgetUtil.BUTTONS.values()) { + // create a checkbox + CheckBoxPreference cb = new CheckBoxPreference(getActivity() + .getApplicationContext()); + + // set a dynamic key based on button id + cb.setKey(SELECT_BUTTON_KEY_PREFIX + button.getId()); + + // set vanity info + cb.setTitle(button.getTitleResId()); + + // set our checked state + if (buttonList.contains(button.getId())) { + cb.setChecked(true); + } else { + cb.setChecked(false); + } + + // add to our prefs set + mCheckBoxPrefs.put(cb, button.getId()); + + // specific checks for availability on some platforms + if (PowerWidgetUtil.BUTTON_FLASHLIGHT.equals(button.getId()) && + !getResources().getBoolean(R.bool.has_led_flash)) { + // disable flashlight if it's not supported + cb.setEnabled(false); + mFlashMode.setEnabled(false); + } else if (PowerWidgetUtil.BUTTON_NETWORKMODE.equals(button.getId())) { + // some phones run on networks not supported by this button, + // so disable it + int network_state = -99; + + try { + network_state = Settings.Global.getInt(getActivity() + .getApplicationContext().getContentResolver(), + Settings.Global.PREFERRED_NETWORK_MODE); + } catch (Settings.SettingNotFoundException e) { + Log.e(TAG, "Unable to retrieve PREFERRED_NETWORK_MODE", e); + } + + switch (network_state) { + // list of supported network modes + case Phone.NT_MODE_WCDMA_PREF: + case Phone.NT_MODE_WCDMA_ONLY: + case Phone.NT_MODE_GSM_UMTS: + case Phone.NT_MODE_GSM_ONLY: + break; + default: + cb.setEnabled(false); + break; + } + } + + // add to the category + prefButtons.addPreference(cb); + } + } + + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, + Preference preference) { + // we only modify the button list if it was one of our checks that + // was clicked + boolean buttonWasModified = false; + ArrayList<String> buttonList = new ArrayList<String>(); + for (Map.Entry<CheckBoxPreference, String> entry : mCheckBoxPrefs.entrySet()) { + if (entry.getKey().isChecked()) { + buttonList.add(entry.getValue()); + } + + if (preference == entry.getKey()) { + buttonWasModified = true; + } + } + + if (buttonWasModified) { + // now we do some wizardry and reset the button list + PowerWidgetUtil.saveCurrentButtons(getActivity().getApplicationContext(), + PowerWidgetUtil.mergeInNewButtonString( + PowerWidgetUtil.getCurrentButtons(getActivity() + .getApplicationContext()), PowerWidgetUtil + .getButtonStringFromList(buttonList))); + return true; + } + + return false; + } + + private class MultiSelectListPreferenceComparator implements Comparator<String> { + private MultiSelectListPreference pref; + + MultiSelectListPreferenceComparator(MultiSelectListPreference p) { + pref = p; + } + + @Override + public int compare(String lhs, String rhs) { + return Integer.compare(pref.findIndexOfValue(lhs), + pref.findIndexOfValue(rhs)); + } + } + + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == mBrightnessMode) { + ArrayList<String> arrValue = new ArrayList<String>((Set<String>) newValue); + Collections.sort(arrValue, new MultiSelectListPreferenceComparator(mBrightnessMode)); + Settings.System.putString(getActivity().getApplicationContext().getContentResolver(), + Settings.System.EXPANDED_BRIGHTNESS_MODE, TextUtils.join(SEPARATOR, arrValue)); + updateSummary(TextUtils.join(SEPARATOR, arrValue), + mBrightnessMode, R.string.pref_brightness_mode_summary); + } else if (preference == mNetworkMode) { + int value = Integer.valueOf((String) newValue); + int index = mNetworkMode.findIndexOfValue((String) newValue); + Settings.System.putInt(getActivity().getApplicationContext().getContentResolver(), + Settings.System.EXPANDED_NETWORK_MODE, value); + mNetworkMode.setSummary(mNetworkMode.getEntries()[index]); + } else if (preference == mScreenTimeoutMode) { + int value = Integer.valueOf((String) newValue); + int index = mScreenTimeoutMode.findIndexOfValue((String) newValue); + Settings.System.putInt(getActivity().getApplicationContext().getContentResolver(), + Settings.System.EXPANDED_SCREENTIMEOUT_MODE, value); + mScreenTimeoutMode.setSummary(mScreenTimeoutMode.getEntries()[index]); + } else if (preference == mRingMode) { + ArrayList<String> arrValue = new ArrayList<String>((Set<String>) newValue); + Collections.sort(arrValue, new MultiSelectListPreferenceComparator(mRingMode)); + Settings.System.putString(getActivity().getApplicationContext().getContentResolver(), + Settings.System.EXPANDED_RING_MODE, TextUtils.join(SEPARATOR, arrValue)); + updateSummary(TextUtils.join(SEPARATOR, arrValue), mRingMode, R.string.pref_ring_mode_summary); + } else if (preference == mFlashMode) { + int value = Integer.valueOf((String) newValue); + int index = mFlashMode.findIndexOfValue((String) newValue); + Settings.System.putInt(getActivity().getApplicationContext().getContentResolver(), + Settings.System.EXPANDED_FLASH_MODE, value); + mFlashMode.setSummary(mFlashMode.getEntries()[index]); + } + return true; + } + + private void updateSummary(String val, MultiSelectListPreference pref, int defSummary) { + // Update summary message with current values + final String[] values = parseStoredValue(val); + if (values != null) { + final int length = values.length; + final CharSequence[] entries = pref.getEntries(); + StringBuilder summary = new StringBuilder(); + for (int i = 0; i < (length); i++) { + CharSequence entry = entries[Integer.parseInt(values[i])]; + if ((length - i) > 2) { + summary.append(entry).append(", "); + } else if ((length - i) == 2) { + summary.append(entry).append(" & "); + } else if ((length - i) == 1) { + summary.append(entry); + } + } + pref.setSummary(summary); + } else { + pref.setSummary(defSummary); + } + } + + public static String[] parseStoredValue(CharSequence val) { + if (TextUtils.isEmpty(val)) { + return null; + } else { + return val.toString().split(SEPARATOR); + } + } + + } + + public static class PowerWidgetOrder extends ListFragment + { + private static final String TAG = "PowerWidgetOrderActivity"; + + private ListView mButtonList; + private ButtonAdapter mButtonAdapter; + View mContentView = null; + Context mContext; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + mContentView = inflater.inflate(R.layout.order_power_widget_buttons_activity, null); + return mContentView; + } + + /** Called when the activity is first created. */ + // @Override + // public void onCreate(Bundle icicle) + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mContext = getActivity().getApplicationContext(); + + mButtonList = getListView(); + ((TouchInterceptor) mButtonList).setDropListener(mDropListener); + mButtonAdapter = new ButtonAdapter(mContext); + setListAdapter(mButtonAdapter); + } + + @Override + public void onDestroy() { + ((TouchInterceptor) mButtonList).setDropListener(null); + setListAdapter(null); + super.onDestroy(); + } + + @Override + public void onResume() { + super.onResume(); + // reload our buttons and invalidate the views for redraw + mButtonAdapter.reloadButtons(); + mButtonList.invalidateViews(); + } + + private TouchInterceptor.DropListener mDropListener = new TouchInterceptor.DropListener() { + public void drop(int from, int to) { + // get the current button list + ArrayList<String> buttons = PowerWidgetUtil.getButtonListFromString( + PowerWidgetUtil.getCurrentButtons(mContext)); + + // move the button + if (from < buttons.size()) { + String button = buttons.remove(from); + + if (to <= buttons.size()) { + buttons.add(to, button); + + // save our buttons + PowerWidgetUtil.saveCurrentButtons(mContext, + PowerWidgetUtil.getButtonStringFromList(buttons)); + + // tell our adapter/listview to reload + mButtonAdapter.reloadButtons(); + mButtonList.invalidateViews(); + } + } + } + }; + + private class ButtonAdapter extends BaseAdapter { + private Context mContext; + private Resources mSystemUIResources = null; + private LayoutInflater mInflater; + private ArrayList<PowerWidgetUtil.ButtonInfo> mButtons; + + public ButtonAdapter(Context c) { + mContext = c; + mInflater = LayoutInflater.from(mContext); + + PackageManager pm = mContext.getPackageManager(); + if (pm != null) { + try { + mSystemUIResources = pm.getResourcesForApplication("com.android.systemui"); + } catch (Exception e) { + mSystemUIResources = null; + Log.e(TAG, "Could not load SystemUI resources", e); + } + } + + reloadButtons(); + } + + public void reloadButtons() { + ArrayList<String> buttons = PowerWidgetUtil.getButtonListFromString( + PowerWidgetUtil.getCurrentButtons(mContext)); + + mButtons = new ArrayList<PowerWidgetUtil.ButtonInfo>(); + for (String button : buttons) { + if (PowerWidgetUtil.BUTTONS.containsKey(button)) { + mButtons.add(PowerWidgetUtil.BUTTONS.get(button)); + } + } + } + + public int getCount() { + return mButtons.size(); + } + + public Object getItem(int position) { + return mButtons.get(position); + } + + public long getItemId(int position) { + return position; + } + + public View getView(int position, View convertView, ViewGroup parent) { + final View v; + if (convertView == null) { + v = mInflater.inflate(R.layout.order_power_widget_button_list_item, null); + } else { + v = convertView; + } + + PowerWidgetUtil.ButtonInfo button = mButtons.get(position); + + final TextView name = (TextView) v.findViewById(R.id.name); + final ImageView icon = (ImageView) v.findViewById(R.id.icon); + + name.setText(button.getTitleResId()); + + // assume no icon first + icon.setVisibility(View.GONE); + + // attempt to load the icon for this button + if (mSystemUIResources != null) { + int resId = mSystemUIResources.getIdentifier(button.getIcon(), null, null); + if (resId > 0) { + try { + Drawable d = mSystemUIResources.getDrawable(resId); + icon.setVisibility(View.VISIBLE); + icon.setImageDrawable(d); + } catch (Exception e) { + Log.e(TAG, "Error retrieving icon drawable", e); + } + } + } + + return v; + } + } + } + +} |