14e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock/* 24e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * Copyright (C) 2014 The Android Open Source Project 34e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * 44e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 54e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * you may not use this file except in compliance with the License. 64e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * You may obtain a copy of the License at 74e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * 84e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * http://www.apache.org/licenses/LICENSE-2.0 94e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * 104e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * Unless required by applicable law or agreed to in writing, software 114e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 124e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * See the License for the specific language governing permissions and 144e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock * limitations under the License. 154e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock */ 164e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 174e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlockpackage com.android.settings.notification; 184e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 194e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlockimport android.content.ContentResolver; 204e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlockimport android.content.Context; 21c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlockimport android.content.res.Resources; 224e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlockimport android.net.Uri; 234e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlockimport android.provider.Settings.Global; 244e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlockimport android.provider.Settings.System; 251230ac820ea94b8f3f6285fd4cae056e62d96183Jason Monkimport android.support.v7.preference.DropDownPreference; 2639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference; 2739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference.OnPreferenceChangeListener; 2839b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.TwoStatePreference; 294e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 304e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlockimport com.android.settings.SettingsPreferenceFragment; 314e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 324e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock/** Helper to manage a two-state or dropdown preference bound to a global or system setting. */ 334e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlockpublic class SettingPref { 344e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock public static final int TYPE_GLOBAL = 1; 354e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock public static final int TYPE_SYSTEM = 2; 364e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 37062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk protected final int mType; 384e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock private final String mKey; 39062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk protected final String mSetting; 40062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk protected final int mDefault; 414e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock private final int[] mValues; 424e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock private final Uri mUri; 434e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 44062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk protected TwoStatePreference mTwoState; 45062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk protected DropDownPreference mDropDown; 464e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 474e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock public SettingPref(int type, String key, String setting, int def, int... values) { 484e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock mType = type; 494e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock mKey = key; 504e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock mSetting = setting; 514e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock mDefault = def; 524e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock mValues = values; 534e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock mUri = getUriFor(mType, mSetting); 544e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 554e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 564e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock public boolean isApplicable(Context context) { 574e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock return true; 584e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 594e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 60c7f8e8ce69e80ea495472aade5f8569c6583c5e8John Spurlock protected String getCaption(Resources res, int value) { 614e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock throw new UnsupportedOperationException(); 624e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 634e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 6407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock public Preference init(SettingsPreferenceFragment settings) { 654e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock final Context context = settings.getActivity(); 664e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock Preference p = settings.getPreferenceScreen().findPreference(mKey); 674e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock if (p != null && !isApplicable(context)) { 684e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock settings.getPreferenceScreen().removePreference(p); 694e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock p = null; 704e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 714e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock if (p instanceof TwoStatePreference) { 724e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock mTwoState = (TwoStatePreference) p; 734e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } else if (p instanceof DropDownPreference) { 744e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock mDropDown = (DropDownPreference) p; 7549b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk CharSequence[] entries = new CharSequence[mValues.length]; 7649b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk CharSequence[] values = new CharSequence[mValues.length]; 7749b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk for (int i = 0; i < mValues.length; i++) { 7849b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk entries[i] = getCaption(context.getResources(), mValues[i]); 7949b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk values[i] = Integer.toString(mValues[i]); 804e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 8149b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk mDropDown.setEntries(entries); 8249b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk mDropDown.setEntryValues(values); 834e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 844e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock update(context); 854e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock if (mTwoState != null) { 864e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock p.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 874e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock @Override 884e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock public boolean onPreferenceChange(Preference preference, Object newValue) { 894e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock setSetting(context, (Boolean) newValue ? 1 : 0); 904e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock return true; 914e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 924e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock }); 9307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return mTwoState; 9407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock } 9507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock if (mDropDown != null) { 9649b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk p.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 974e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock @Override 9849b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk public boolean onPreferenceChange(Preference preference, Object newValue) { 9949b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk return setSetting(context, Integer.parseInt((String) newValue)); 1004e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1014e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock }); 10207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return mDropDown; 1034e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 10407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock return null; 1054e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1064e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 1074e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock protected boolean setSetting(Context context, int value) { 1084e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock return putInt(mType, context.getContentResolver(), mSetting, value); 1094e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1104e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 1114e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock public Uri getUri() { 1124e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock return mUri; 1134e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1144e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 1154e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock public String getKey() { 1164e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock return mKey; 1174e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1184e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 1194e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock public void update(Context context) { 1204e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock final int val = getInt(mType, context.getContentResolver(), mSetting, mDefault); 1214e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock if (mTwoState != null) { 1224e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock mTwoState.setChecked(val != 0); 1234e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } else if (mDropDown != null) { 12449b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk mDropDown.setValue(Integer.toString(val)); 1254e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1264e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1274e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 1284e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock private static Uri getUriFor(int type, String setting) { 1294e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock switch(type) { 1304e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock case TYPE_GLOBAL: 1314e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock return Global.getUriFor(setting); 1324e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock case TYPE_SYSTEM: 1334e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock return System.getUriFor(setting); 1344e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1354e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock throw new IllegalArgumentException(); 1364e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1374e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 138062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk protected static boolean putInt(int type, ContentResolver cr, String setting, int value) { 1394e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock switch(type) { 1404e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock case TYPE_GLOBAL: 1414e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock return Global.putInt(cr, setting, value); 1424e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock case TYPE_SYSTEM: 1434e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock return System.putInt(cr, setting, value); 1444e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1454e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock throw new IllegalArgumentException(); 1464e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1474e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock 148062f736c8bfda9ac6ac7476ad51e52ca077f1505Jason Monk protected static int getInt(int type, ContentResolver cr, String setting, int def) { 1494e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock switch(type) { 1504e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock case TYPE_GLOBAL: 1514e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock return Global.getInt(cr, setting, def); 1524e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock case TYPE_SYSTEM: 1534e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock return System.getInt(cr, setting, def); 1544e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1554e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock throw new IllegalArgumentException(); 1564e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock } 1574e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock}