1 /* //device/apps/Settings/src/com/android/settings/Keyguard.java
2 **
3 ** Copyright 2006, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 package com.android.spare_parts;
19 
20 import android.app.ActivityManager;
21 import android.content.Context;
22 import android.content.Intent;
23 import android.content.SharedPreferences;
24 import android.content.pm.ApplicationInfo;
25 import android.content.pm.PackageManager;
26 import android.content.pm.ResolveInfo;
27 import android.content.pm.PackageManager.NameNotFoundException;
28 import android.content.res.Configuration;
29 import android.os.RemoteException;
30 import android.os.ServiceManager;
31 import android.preference.CheckBoxPreference;
32 import android.preference.ListPreference;
33 import android.preference.Preference;
34 import android.preference.PreferenceActivity;
35 import android.preference.PreferenceGroup;
36 import android.preference.PreferenceScreen;
37 import android.provider.Settings;
38 import android.provider.Settings.SettingNotFoundException;
39 import android.os.Bundle;
40 import android.util.Log;
41 import android.view.IWindowManager;
42 
43 import java.util.List;
44 
45 public class SpareParts extends PreferenceActivity
46         implements Preference.OnPreferenceChangeListener,
47         SharedPreferences.OnSharedPreferenceChangeListener {
48     private static final String TAG = "SpareParts";
49 
50     private static final String BATTERY_HISTORY_PREF = "battery_history_settings";
51     private static final String BATTERY_INFORMATION_PREF = "battery_information_settings";
52     private static final String USAGE_STATISTICS_PREF = "usage_statistics_settings";
53 
54     private static final String WINDOW_ANIMATIONS_PREF = "window_animations";
55     private static final String TRANSITION_ANIMATIONS_PREF = "transition_animations";
56     private static final String FANCY_IME_ANIMATIONS_PREF = "fancy_ime_animations";
57     private static final String HAPTIC_FEEDBACK_PREF = "haptic_feedback";
58     private static final String FONT_SIZE_PREF = "font_size";
59     private static final String END_BUTTON_PREF = "end_button";
60     private static final String KEY_COMPATIBILITY_MODE = "compatibility_mode";
61 
62     private final Configuration mCurConfig = new Configuration();
63 
64     private ListPreference mWindowAnimationsPref;
65     private ListPreference mTransitionAnimationsPref;
66     private CheckBoxPreference mFancyImeAnimationsPref;
67     private CheckBoxPreference mHapticFeedbackPref;
68     private ListPreference mFontSizePref;
69     private ListPreference mEndButtonPref;
70     private CheckBoxPreference mCompatibilityMode;
71 
72     private IWindowManager mWindowManager;
73 
updatePreferenceToSpecificActivityOrRemove(Context context, PreferenceGroup parentPreferenceGroup, String preferenceKey, int flags)74     public static boolean updatePreferenceToSpecificActivityOrRemove(Context context,
75             PreferenceGroup parentPreferenceGroup, String preferenceKey, int flags) {
76 
77         Preference preference = parentPreferenceGroup.findPreference(preferenceKey);
78         if (preference == null) {
79             return false;
80         }
81 
82         Intent intent = preference.getIntent();
83         if (intent != null) {
84             // Find the activity that is in the system image
85             PackageManager pm = context.getPackageManager();
86             List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
87             int listSize = list.size();
88             for (int i = 0; i < listSize; i++) {
89                 ResolveInfo resolveInfo = list.get(i);
90                 if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
91                         != 0) {
92 
93                     // Replace the intent with this specific activity
94                     preference.setIntent(new Intent().setClassName(
95                             resolveInfo.activityInfo.packageName,
96                             resolveInfo.activityInfo.name));
97 
98                     return true;
99                 }
100             }
101         }
102 
103         // Did not find a matching activity, so remove the preference
104         parentPreferenceGroup.removePreference(preference);
105 
106         return true;
107     }
108 
109     @Override
onCreate(Bundle icicle)110     public void onCreate(Bundle icicle) {
111         super.onCreate(icicle);
112         addPreferencesFromResource(R.xml.spare_parts);
113 
114         PreferenceScreen prefSet = getPreferenceScreen();
115 
116         mWindowAnimationsPref = (ListPreference) prefSet.findPreference(WINDOW_ANIMATIONS_PREF);
117         mWindowAnimationsPref.setOnPreferenceChangeListener(this);
118         mTransitionAnimationsPref = (ListPreference) prefSet.findPreference(TRANSITION_ANIMATIONS_PREF);
119         mTransitionAnimationsPref.setOnPreferenceChangeListener(this);
120         mFancyImeAnimationsPref = (CheckBoxPreference) prefSet.findPreference(FANCY_IME_ANIMATIONS_PREF);
121         mHapticFeedbackPref = (CheckBoxPreference) prefSet.findPreference(HAPTIC_FEEDBACK_PREF);
122         mFontSizePref = (ListPreference) prefSet.findPreference(FONT_SIZE_PREF);
123         mFontSizePref.setOnPreferenceChangeListener(this);
124         mEndButtonPref = (ListPreference) prefSet.findPreference(END_BUTTON_PREF);
125         mEndButtonPref.setOnPreferenceChangeListener(this);
126         mCompatibilityMode = (CheckBoxPreference) findPreference(KEY_COMPATIBILITY_MODE);
127         mCompatibilityMode.setPersistent(false);
128         mCompatibilityMode.setChecked(Settings.Global.getInt(getContentResolver(),
129                 Settings.Global.COMPATIBILITY_MODE, 1) != 0);
130 
131         mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
132 
133         final PreferenceGroup parentPreference = getPreferenceScreen();
134         updatePreferenceToSpecificActivityOrRemove(this, parentPreference,
135                 BATTERY_HISTORY_PREF, 0);
136         updatePreferenceToSpecificActivityOrRemove(this, parentPreference,
137                 BATTERY_INFORMATION_PREF, 0);
138         updatePreferenceToSpecificActivityOrRemove(this, parentPreference,
139                 USAGE_STATISTICS_PREF, 0);
140 
141         parentPreference.getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
142     }
143 
updateToggles()144     private void updateToggles() {
145         mFancyImeAnimationsPref.setChecked(Settings.Global.getInt(
146                 getContentResolver(),
147                 Settings.Global.FANCY_IME_ANIMATIONS, 0) != 0);
148         mHapticFeedbackPref.setChecked(Settings.System.getInt(
149                 getContentResolver(),
150                 Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) != 0);
151     }
152 
onPreferenceChange(Preference preference, Object objValue)153     public boolean onPreferenceChange(Preference preference, Object objValue) {
154         if (preference == mWindowAnimationsPref) {
155             writeAnimationPreference(0, objValue);
156         } else if (preference == mTransitionAnimationsPref) {
157             writeAnimationPreference(1, objValue);
158         } else if (preference == mFontSizePref) {
159             writeFontSizePreference(objValue);
160         } else if (preference == mEndButtonPref) {
161             writeEndButtonPreference(objValue);
162         }
163         // always let the preference setting proceed.
164         return true;
165     }
166 
167     @Override
onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)168     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
169         if (preference == mCompatibilityMode) {
170             Settings.Global.putInt(getContentResolver(),
171                     Settings.Global.COMPATIBILITY_MODE,
172                     mCompatibilityMode.isChecked() ? 1 : 0);
173             return true;
174         }
175         return false;
176     }
177 
writeAnimationPreference(int which, Object objValue)178     public void writeAnimationPreference(int which, Object objValue) {
179         try {
180             float val = Float.parseFloat(objValue.toString());
181             mWindowManager.setAnimationScale(which, val);
182         } catch (NumberFormatException e) {
183         } catch (RemoteException e) {
184         }
185     }
186 
writeFontSizePreference(Object objValue)187     public void writeFontSizePreference(Object objValue) {
188         try {
189             mCurConfig.fontScale = Float.parseFloat(objValue.toString());
190             ActivityManager.getService().updateConfiguration(mCurConfig);
191         } catch (RemoteException e) {
192         }
193     }
194 
writeEndButtonPreference(Object objValue)195     public void writeEndButtonPreference(Object objValue) {
196         try {
197             int val = Integer.parseInt(objValue.toString());
198             Settings.System.putInt(getContentResolver(),
199                     Settings.System.END_BUTTON_BEHAVIOR, val);
200         } catch (NumberFormatException e) {
201         }
202     }
203 
floatToIndex(float val, int resid)204     int floatToIndex(float val, int resid) {
205         String[] indices = getResources().getStringArray(resid);
206         float lastVal = Float.parseFloat(indices[0]);
207         for (int i=1; i<indices.length; i++) {
208             float thisVal = Float.parseFloat(indices[i]);
209             if (val < (lastVal + (thisVal-lastVal)*.5f)) {
210                 return i-1;
211             }
212             lastVal = thisVal;
213         }
214         return indices.length-1;
215     }
216 
readAnimationPreference(int which, ListPreference pref)217     public void readAnimationPreference(int which, ListPreference pref) {
218         try {
219             float scale = mWindowManager.getAnimationScale(which);
220             pref.setValueIndex(floatToIndex(scale,
221                     R.array.entryvalues_animations));
222         } catch (RemoteException e) {
223         }
224     }
225 
readFontSizePreference(ListPreference pref)226     public void readFontSizePreference(ListPreference pref) {
227         try {
228             mCurConfig.updateFrom(
229                 ActivityManager.getService().getConfiguration());
230         } catch (RemoteException e) {
231         }
232         pref.setValueIndex(floatToIndex(mCurConfig.fontScale,
233                 R.array.entryvalues_font_size));
234     }
235 
readEndButtonPreference(ListPreference pref)236     public void readEndButtonPreference(ListPreference pref) {
237         try {
238             pref.setValueIndex(Settings.System.getInt(getContentResolver(),
239                     Settings.System.END_BUTTON_BEHAVIOR));
240         } catch (SettingNotFoundException e) {
241         }
242     }
243 
onSharedPreferenceChanged(SharedPreferences preferences, String key)244     public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
245         if (FANCY_IME_ANIMATIONS_PREF.equals(key)) {
246             Settings.Global.putInt(getContentResolver(),
247                     Settings.Global.FANCY_IME_ANIMATIONS,
248                     mFancyImeAnimationsPref.isChecked() ? 1 : 0);
249         } else if (HAPTIC_FEEDBACK_PREF.equals(key)) {
250             Settings.System.putInt(getContentResolver(),
251                     Settings.System.HAPTIC_FEEDBACK_ENABLED,
252                     mHapticFeedbackPref.isChecked() ? 1 : 0);
253         }
254     }
255 
256     @Override
onResume()257     public void onResume() {
258         super.onResume();
259         readAnimationPreference(0, mWindowAnimationsPref);
260         readAnimationPreference(1, mTransitionAnimationsPref);
261         readFontSizePreference(mFontSizePref);
262         readEndButtonPreference(mEndButtonPref);
263         updateToggles();
264     }
265 }
266