• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.DropDownPreference;
30 import com.android.settings.SettingsPreferenceFragment;
31 
32 /** Helper to manage a two-state or dropdown preference bound to a global or system setting. */
33 public class SettingPref {
34     public static final int TYPE_GLOBAL = 1;
35     public static final int TYPE_SYSTEM = 2;
36 
37     protected final int mType;
38     private final String mKey;
39     protected final String mSetting;
40     protected final int mDefault;
41     private final int[] mValues;
42     private final Uri mUri;
43 
44     protected TwoStatePreference mTwoState;
45     protected DropDownPreference mDropDown;
46 
SettingPref(int type, String key, String setting, int def, int... values)47     public SettingPref(int type, String key, String setting, int def, int... values) {
48         mType = type;
49         mKey = key;
50         mSetting = setting;
51         mDefault = def;
52         mValues = values;
53         mUri = getUriFor(mType, mSetting);
54     }
55 
isApplicable(Context context)56     public boolean isApplicable(Context context) {
57         return true;
58     }
59 
getCaption(Resources res, int value)60     protected String getCaption(Resources res, int value) {
61         throw new UnsupportedOperationException();
62     }
63 
init(SettingsPreferenceFragment settings)64     public Preference init(SettingsPreferenceFragment settings) {
65         final Context context = settings.getActivity();
66         Preference p = settings.getPreferenceScreen().findPreference(mKey);
67         if (p != null && !isApplicable(context)) {
68             settings.getPreferenceScreen().removePreference(p);
69             p = null;
70         }
71         if (p instanceof TwoStatePreference) {
72             mTwoState = (TwoStatePreference) p;
73         } else if (p instanceof DropDownPreference) {
74             mDropDown = (DropDownPreference) p;
75             for (int value : mValues) {
76                 mDropDown.addItem(getCaption(context.getResources(), value), value);
77             }
78         }
79         update(context);
80         if (mTwoState != null) {
81             p.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
82                 @Override
83                 public boolean onPreferenceChange(Preference preference, Object newValue) {
84                     setSetting(context, (Boolean) newValue ? 1 : 0);
85                     return true;
86                 }
87             });
88             return mTwoState;
89         }
90         if (mDropDown != null) {
91             mDropDown.setCallback(new DropDownPreference.Callback() {
92                 @Override
93                 public boolean onItemSelected(int pos, Object value) {
94                     return setSetting(context, (Integer) value);
95                 }
96             });
97             return mDropDown;
98         }
99         return null;
100     }
101 
setSetting(Context context, int value)102     protected boolean setSetting(Context context, int value) {
103         return putInt(mType, context.getContentResolver(), mSetting, value);
104     }
105 
getUri()106     public Uri getUri() {
107         return mUri;
108     }
109 
getKey()110     public String getKey() {
111         return mKey;
112     }
113 
update(Context context)114     public void update(Context context) {
115         final int val = getInt(mType, context.getContentResolver(), mSetting, mDefault);
116         if (mTwoState != null) {
117             mTwoState.setChecked(val != 0);
118         } else if (mDropDown != null) {
119             mDropDown.setSelectedValue(val);
120         }
121     }
122 
getUriFor(int type, String setting)123     private static Uri getUriFor(int type, String setting) {
124         switch(type) {
125             case TYPE_GLOBAL:
126                 return Global.getUriFor(setting);
127             case TYPE_SYSTEM:
128                 return System.getUriFor(setting);
129         }
130         throw new IllegalArgumentException();
131     }
132 
putInt(int type, ContentResolver cr, String setting, int value)133     protected static boolean putInt(int type, ContentResolver cr, String setting, int value) {
134         switch(type) {
135             case TYPE_GLOBAL:
136                 return Global.putInt(cr, setting, value);
137             case TYPE_SYSTEM:
138                 return System.putInt(cr, setting, value);
139         }
140         throw new IllegalArgumentException();
141     }
142 
getInt(int type, ContentResolver cr, String setting, int def)143     protected static int getInt(int type, ContentResolver cr, String setting, int def) {
144         switch(type) {
145             case TYPE_GLOBAL:
146                 return Global.getInt(cr, setting, def);
147             case TYPE_SYSTEM:
148                 return System.getInt(cr, setting, def);
149         }
150         throw new IllegalArgumentException();
151     }
152 }