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
18package com.android.spare_parts;
19
20import android.app.ActivityManagerNative;
21import android.content.Context;
22import android.content.Intent;
23import android.content.SharedPreferences;
24import android.content.pm.ApplicationInfo;
25import android.content.pm.PackageManager;
26import android.content.pm.ResolveInfo;
27import android.content.pm.PackageManager.NameNotFoundException;
28import android.content.res.Configuration;
29import android.os.RemoteException;
30import android.os.ServiceManager;
31import android.preference.CheckBoxPreference;
32import android.preference.ListPreference;
33import android.preference.Preference;
34import android.preference.PreferenceActivity;
35import android.preference.PreferenceGroup;
36import android.preference.PreferenceScreen;
37import android.provider.Settings;
38import android.provider.Settings.SettingNotFoundException;
39import android.os.Bundle;
40import android.util.Log;
41import android.view.IWindowManager;
42
43import java.util.List;
44
45public 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
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
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
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
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
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
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
187    public void writeFontSizePreference(Object objValue) {
188        try {
189            mCurConfig.fontScale = Float.parseFloat(objValue.toString());
190            ActivityManagerNative.getDefault().updateConfiguration(mCurConfig);
191        } catch (RemoteException e) {
192        }
193    }
194
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
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
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
226    public void readFontSizePreference(ListPreference pref) {
227        try {
228            mCurConfig.updateFrom(
229                ActivityManagerNative.getDefault().getConfiguration());
230        } catch (RemoteException e) {
231        }
232        pref.setValueIndex(floatToIndex(mCurConfig.fontScale,
233                R.array.entryvalues_font_size));
234    }
235
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
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
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