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}