/*
* Copyright (C) 2012 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 static com.android.internal.util.cm.QSConstants.TILE_BLUETOOTH;
import static com.android.internal.util.cm.QSConstants.TILE_MOBILEDATA;
import static com.android.internal.util.cm.QSConstants.TILE_NETWORKMODE;
import static com.android.internal.util.cm.QSConstants.TILE_NFC;
import static com.android.internal.util.cm.QSConstants.TILE_PROFILE;
import static com.android.internal.util.cm.QSConstants.TILE_WIFIAP;
import static com.android.internal.util.cm.QSConstants.TILE_LTE;
import static com.android.internal.util.cm.QSConstants.TILE_TORCH;
import static com.android.internal.util.cm.QSUtils.deviceSupportsBluetooth;
import static com.android.internal.util.cm.QSUtils.deviceSupportsImeSwitcher;
import static com.android.internal.util.cm.QSUtils.deviceSupportsLte;
import static com.android.internal.util.cm.QSUtils.deviceSupportsNfc;
import static com.android.internal.util.cm.QSUtils.deviceSupportsUsbTether;
import static com.android.internal.util.cm.QSUtils.deviceSupportsWifiDisplay;
import static com.android.internal.util.cm.QSUtils.systemProfilesEnabled;
import android.content.ContentResolver;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.MultiSelectListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import com.android.internal.telephony.Phone;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
public class QuickSettings extends SettingsPreferenceFragment implements OnPreferenceChangeListener {
private static final String TAG = "QuickSettings";
private static final String SEPARATOR = "OV=I=XseparatorX=I=VO";
private static final String EXP_RING_MODE = "pref_ring_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 DYNAMIC_ALARM = "dynamic_alarm";
private static final String DYNAMIC_BUGREPORT = "dynamic_bugreport";
private static final String DYNAMIC_IME = "dynamic_ime";
private static final String DYNAMIC_USBTETHER = "dynamic_usbtether";
private static final String DYNAMIC_WIFI = "dynamic_wifi";
private static final String QUICK_PULLDOWN = "quick_pulldown";
private static final String COLLAPSE_PANEL = "collapse_panel";
private static final String GENERAL_SETTINGS = "pref_general_settings";
private static final String STATIC_TILES = "static_tiles";
private static final String DYNAMIC_TILES = "pref_dynamic_tiles";
MultiSelectListPreference mRingMode;
ListPreference mNetworkMode;
ListPreference mScreenTimeoutMode;
CheckBoxPreference mDynamicAlarm;
CheckBoxPreference mDynamicBugReport;
CheckBoxPreference mDynamicWifi;
CheckBoxPreference mDynamicIme;
CheckBoxPreference mDynamicUsbTether;
CheckBoxPreference mCollapsePanel;
ListPreference mQuickPulldown;
PreferenceCategory mGeneralSettings;
PreferenceCategory mStaticTiles;
PreferenceCategory mDynamicTiles;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.quick_settings_panel_settings);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
PreferenceScreen prefSet = getPreferenceScreen();
PackageManager pm = getPackageManager();
ContentResolver resolver = getActivity().getContentResolver();
mGeneralSettings = (PreferenceCategory) prefSet.findPreference(GENERAL_SETTINGS);
mStaticTiles = (PreferenceCategory) prefSet.findPreference(STATIC_TILES);
mDynamicTiles = (PreferenceCategory) prefSet.findPreference(DYNAMIC_TILES);
mQuickPulldown = (ListPreference) prefSet.findPreference(QUICK_PULLDOWN);
if (!Utils.isPhone(getActivity())) {
if(mQuickPulldown != null)
mGeneralSettings.removePreference(mQuickPulldown);
} else {
mQuickPulldown.setOnPreferenceChangeListener(this);
int quickPulldownValue = Settings.System.getInt(resolver, Settings.System.QS_QUICK_PULLDOWN, 0);
mQuickPulldown.setValue(String.valueOf(quickPulldownValue));
updatePulldownSummary(quickPulldownValue);
}
mCollapsePanel = (CheckBoxPreference) prefSet.findPreference(COLLAPSE_PANEL);
mCollapsePanel.setChecked(Settings.System.getInt(resolver, Settings.System.QS_COLLAPSE_PANEL, 0) == 1);
// Add the sound mode
mRingMode = (MultiSelectListPreference) prefSet.findPreference(EXP_RING_MODE);
String storedRingMode = Settings.System.getString(resolver,
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);
// Add the network mode preference
mNetworkMode = (ListPreference) prefSet.findPreference(EXP_NETWORK_MODE);
if(mNetworkMode != null){
mNetworkMode.setSummary(mNetworkMode.getEntry());
mNetworkMode.setOnPreferenceChangeListener(this);
}
// Screen timeout mode
mScreenTimeoutMode = (ListPreference) prefSet.findPreference(EXP_SCREENTIMEOUT_MODE);
mScreenTimeoutMode.setSummary(mScreenTimeoutMode.getEntry());
mScreenTimeoutMode.setOnPreferenceChangeListener(this);
// Add the dynamic tiles checkboxes
mDynamicAlarm = (CheckBoxPreference) prefSet.findPreference(DYNAMIC_ALARM);
mDynamicAlarm.setChecked(Settings.System.getInt(resolver, Settings.System.QS_DYNAMIC_ALARM, 1) == 1);
mDynamicBugReport = (CheckBoxPreference) prefSet.findPreference(DYNAMIC_BUGREPORT);
mDynamicBugReport.setChecked(Settings.System.getInt(resolver, Settings.System.QS_DYNAMIC_BUGREPORT, 1) == 1);
mDynamicIme = (CheckBoxPreference) prefSet.findPreference(DYNAMIC_IME);
if (mDynamicIme != null) {
if (deviceSupportsImeSwitcher(getActivity())) {
mDynamicIme.setChecked(Settings.System.getInt(resolver, Settings.System.QS_DYNAMIC_IME, 1) == 1);
} else {
mDynamicTiles.removePreference(mDynamicIme);
mDynamicIme = null;
}
}
mDynamicUsbTether = (CheckBoxPreference) prefSet.findPreference(DYNAMIC_USBTETHER);
if (mDynamicUsbTether != null) {
if (deviceSupportsUsbTether(getActivity())) {
mDynamicUsbTether.setChecked(Settings.System.getInt(resolver, Settings.System.QS_DYNAMIC_USBTETHER, 1) == 1);
} else {
mDynamicTiles.removePreference(mDynamicUsbTether);
mDynamicUsbTether = null;
}
}
mDynamicWifi = (CheckBoxPreference) prefSet.findPreference(DYNAMIC_WIFI);
if (mDynamicWifi != null) {
if (deviceSupportsWifiDisplay(getActivity())) {
mDynamicWifi.setChecked(Settings.System.getInt(resolver, Settings.System.QS_DYNAMIC_WIFI, 1) == 1);
} else {
mDynamicTiles.removePreference(mDynamicWifi);
mDynamicWifi = null;
}
}
// Don't show mobile data options if not supported
boolean isMobileData = pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
if (!isMobileData) {
QuickSettingsUtil.TILES.remove(TILE_MOBILEDATA);
QuickSettingsUtil.TILES.remove(TILE_WIFIAP);
QuickSettingsUtil.TILES.remove(TILE_NETWORKMODE);
if(mNetworkMode != null) {
mStaticTiles.removePreference(mNetworkMode);
}
} else {
// We have telephony support however, some phones run on networks not supported
// by the networkmode tile so remove both it and the associated options list
int network_state = -99;
try {
network_state = Settings.Global.getInt(resolver,
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:
QuickSettingsUtil.TILES.remove(TILE_NETWORKMODE);
mStaticTiles.removePreference(mNetworkMode);
break;
}
}
// Don't show the bluetooth options if not supported
if (!deviceSupportsBluetooth()) {
QuickSettingsUtil.TILES.remove(TILE_BLUETOOTH);
}
// Dont show the profiles tile if profiles are disabled
if (!systemProfilesEnabled(resolver)) {
QuickSettingsUtil.TILES.remove(TILE_PROFILE);
}
// Dont show the NFC tile if not supported
if (!deviceSupportsNfc(getActivity())) {
QuickSettingsUtil.TILES.remove(TILE_NFC);
}
// Dont show the LTE tile if not supported
if (!deviceSupportsLte(getActivity())) {
QuickSettingsUtil.TILES.remove(TILE_LTE);
}
// Dont show the torch tile if not supported
if (!getResources().getBoolean(R.bool.has_led_flash)) {
QuickSettingsUtil.TILES.remove(TILE_TORCH);
}
}
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
ContentResolver resolver = getActivity().getContentResolver();
if (preference == mDynamicAlarm) {
Settings.System.putInt(resolver, Settings.System.QS_DYNAMIC_ALARM,
mDynamicAlarm.isChecked() ? 1 : 0);
return true;
} else if (preference == mDynamicBugReport) {
Settings.System.putInt(resolver, Settings.System.QS_DYNAMIC_BUGREPORT,
mDynamicBugReport.isChecked() ? 1 : 0);
return true;
} else if (mDynamicIme != null && preference == mDynamicIme) {
Settings.System.putInt(resolver, Settings.System.QS_DYNAMIC_IME,
mDynamicIme.isChecked() ? 1 : 0);
return true;
} else if (mDynamicUsbTether != null && preference == mDynamicUsbTether) {
Settings.System.putInt(resolver, Settings.System.QS_DYNAMIC_USBTETHER,
mDynamicUsbTether.isChecked() ? 1 : 0);
return true;
} else if (mDynamicWifi != null && preference == mDynamicWifi) {
Settings.System.putInt(resolver, Settings.System.QS_DYNAMIC_WIFI,
mDynamicWifi.isChecked() ? 1 : 0);
return true;
} else if (preference == mCollapsePanel) {
Settings.System.putInt(resolver, Settings.System.QS_COLLAPSE_PANEL,
mCollapsePanel.isChecked() ? 1 : 0);
return true;
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
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) {
ContentResolver resolver = getActivity().getContentResolver();
if (preference == mRingMode) {
ArrayList<String> arrValue = new ArrayList<String>((Set<String>) newValue);
Collections.sort(arrValue, new MultiSelectListPreferenceComparator(mRingMode));
Settings.System.putString(resolver, Settings.System.EXPANDED_RING_MODE,
TextUtils.join(SEPARATOR, arrValue));
updateSummary(TextUtils.join(SEPARATOR, arrValue), mRingMode, R.string.pref_ring_mode_summary);
return true;
} else if (preference == mNetworkMode) {
int value = Integer.valueOf((String) newValue);
int index = mNetworkMode.findIndexOfValue((String) newValue);
Settings.System.putInt(resolver,
Settings.System.EXPANDED_NETWORK_MODE, value);
mNetworkMode.setSummary(mNetworkMode.getEntries()[index]);
return true;
} else if (preference == mQuickPulldown) {
int quickPulldownValue = Integer.valueOf((String) newValue);
Settings.System.putInt(resolver, Settings.System.QS_QUICK_PULLDOWN,
quickPulldownValue);
updatePulldownSummary(quickPulldownValue);
return true;
} 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]);
return true;
}
return false;
}
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) > 1) {
summary.append(entry).append(" | ");
} else {
summary.append(entry);
}
}
pref.setSummary(summary);
} else {
pref.setSummary(defSummary);
}
}
private void updatePulldownSummary(int value) {
Resources res = getResources();
if (value == 0) {
/* quick pulldown deactivated */
mQuickPulldown.setSummary(res.getString(R.string.quick_pulldown_off));
} else {
String direction = res.getString(value == 2
? R.string.quick_pulldown_summary_left
: R.string.quick_pulldown_summary_right);
mQuickPulldown.setSummary(res.getString(R.string.summary_quick_pulldown, direction));
}
}
public static String[] parseStoredValue(CharSequence val) {
if (TextUtils.isEmpty(val)) {
return null;
} else {
return val.toString().split(SEPARATOR);
}
}
}