1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.notification;
18 
19 import android.content.ContentResolver;
20 import android.content.Context;
21 import android.content.res.Resources;
22 import android.net.Uri;
23 import android.preference.Preference;
24 import android.preference.TwoStatePreference;
25 import android.preference.Preference.OnPreferenceChangeListener;
26 import android.provider.Settings.Global;
27 import android.provider.Settings.System;
28 
29 import com.android.settings.SettingsPreferenceFragment;
30 
31 /** Helper to manage a two-state or dropdown preference bound to a global or system setting. */
32 public class SettingPref {
33     public static final int TYPE_GLOBAL = 1;
34     public static final int TYPE_SYSTEM = 2;
35 
36     protected final int mType;
37     private final String mKey;
38     protected final String mSetting;
39     protected final int mDefault;
40     private final int[] mValues;
41     private final Uri mUri;
42 
43     protected TwoStatePreference mTwoState;
44     protected DropDownPreference mDropDown;
45 
SettingPref(int type, String key, String setting, int def, int... values)46     public SettingPref(int type, String key, String setting, int def, int... values) {
47         mType = type;
48         mKey = key;
49         mSetting = setting;
50         mDefault = def;
51         mValues = values;
52         mUri = getUriFor(mType, mSetting);
53     }
54 
isApplicable(Context context)55     public boolean isApplicable(Context context) {
56         return true;
57     }
58 
getCaption(Resources res, int value)59     protected String getCaption(Resources res, int value) {
60         throw new UnsupportedOperationException();
61     }
62 
init(SettingsPreferenceFragment settings)63     public Preference init(SettingsPreferenceFragment settings) {
64         final Context context = settings.getActivity();
65         Preference p = settings.getPreferenceScreen().findPreference(mKey);
66         if (p != null && !isApplicable(context)) {
67             settings.getPreferenceScreen().removePreference(p);
68             p = null;
69         }
70         if (p instanceof TwoStatePreference) {
71             mTwoState = (TwoStatePreference) p;
72         } else if (p instanceof DropDownPreference) {
73             mDropDown = (DropDownPreference) p;
74             for (int value : mValues) {
75                 mDropDown.addItem(getCaption(context.getResources(), value), value);
76             }
77         }
78         update(context);
79         if (mTwoState != null) {
80             p.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
81                 @Override
82                 public boolean onPreferenceChange(Preference preference, Object newValue) {
83                     setSetting(context, (Boolean) newValue ? 1 : 0);
84                     return true;
85                 }
86             });
87             return mTwoState;
88         }
89         if (mDropDown != null) {
90             mDropDown.setCallback(new DropDownPreference.Callback() {
91                 @Override
92                 public boolean onItemSelected(int pos, Object value) {
93                     return setSetting(context, (Integer) value);
94                 }
95             });
96             return mDropDown;
97         }
98         return null;
99     }
100 
setSetting(Context context, int value)101     protected boolean setSetting(Context context, int value) {
102         return putInt(mType, context.getContentResolver(), mSetting, value);
103     }
104 
getUri()105     public Uri getUri() {
106         return mUri;
107     }
108 
getKey()109     public String getKey() {
110         return mKey;
111     }
112 
update(Context context)113     public void update(Context context) {
114         final int val = getInt(mType, context.getContentResolver(), mSetting, mDefault);
115         if (mTwoState != null) {
116             mTwoState.setChecked(val != 0);
117         } else if (mDropDown != null) {
118             mDropDown.setSelectedValue(val);
119         }
120     }
121 
getUriFor(int type, String setting)122     private static Uri getUriFor(int type, String setting) {
123         switch(type) {
124             case TYPE_GLOBAL:
125                 return Global.getUriFor(setting);
126             case TYPE_SYSTEM:
127                 return System.getUriFor(setting);
128         }
129         throw new IllegalArgumentException();
130     }
131 
putInt(int type, ContentResolver cr, String setting, int value)132     protected static boolean putInt(int type, ContentResolver cr, String setting, int value) {
133         switch(type) {
134             case TYPE_GLOBAL:
135                 return Global.putInt(cr, setting, value);
136             case TYPE_SYSTEM:
137                 return System.putInt(cr, setting, value);
138         }
139         throw new IllegalArgumentException();
140     }
141 
getInt(int type, ContentResolver cr, String setting, int def)142     protected static int getInt(int type, ContentResolver cr, String setting, int def) {
143         switch(type) {
144             case TYPE_GLOBAL:
145                 return Global.getInt(cr, setting, def);
146             case TYPE_SYSTEM:
147                 return System.getInt(cr, setting, def);
148         }
149         throw new IllegalArgumentException();
150     }
151 }