TunerServiceImpl.java revision f87aba0a8392c9d9ec6e2e1dcfcaf61c6f2cb29e
1340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk/* 2340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * Copyright (C) 2015 The Android Open Source Project 3340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * 4340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); 5340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * you may not use this file except in compliance with the License. 6340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * You may obtain a copy of the License at 7340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * 8340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * http://www.apache.org/licenses/LICENSE-2.0 9340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * 10340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * Unless required by applicable law or agreed to in writing, software 11340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * distributed under the License is distributed on an "AS IS" BASIS, 12340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * See the License for the specific language governing permissions and 14340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk * limitations under the License 15340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk */ 16340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkpackage com.android.systemui.tuner; 17340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 18340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.app.ActivityManager; 19340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.content.BroadcastReceiver; 20340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.content.ComponentName; 21340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.content.ContentResolver; 22340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.content.Context; 23340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.content.DialogInterface; 24340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.content.DialogInterface.OnClickListener; 25340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.content.Intent; 26340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.content.pm.PackageManager; 27340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.content.pm.PackageManager.NameNotFoundException; 28340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.content.pm.UserInfo; 29340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.database.ContentObserver; 30340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.net.Uri; 31340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.os.Handler; 32340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.os.Looper; 33340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.os.UserHandle; 34340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.os.UserManager; 35340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.provider.Settings; 36340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.provider.Settings.Secure; 37340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.text.TextUtils; 38340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.util.ArrayMap; 39340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport android.util.ArraySet; 40340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 41340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport com.android.systemui.DemoMode; 42340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport com.android.systemui.Dependency; 43340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport com.android.systemui.R; 44340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport com.android.systemui.SysUiServiceProvider; 45340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport com.android.systemui.SystemUI; 46340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport com.android.systemui.SystemUIApplication; 47340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport com.android.systemui.settings.CurrentUserTracker; 48340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport com.android.systemui.statusbar.phone.StatusBarIconController; 49340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport com.android.systemui.statusbar.phone.SystemUIDialog; 50340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport com.android.systemui.util.leak.LeakDetector; 51340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 52340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport java.util.HashMap; 53340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport java.util.HashSet; 54340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkimport java.util.Set; 55340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 56340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 57340b0e5216b4fcc435e0459b1ca46155a572100dJason Monkpublic class TunerServiceImpl extends TunerService { 58340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 59340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private static final String TUNER_VERSION = "sysui_tuner_version"; 60340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 61f87aba0a8392c9d9ec6e2e1dcfcaf61c6f2cb29eJason Monk private static final int CURRENT_TUNER_VERSION = 2; 62340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 63340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private final Observer mObserver = new Observer(); 64340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk // Map of Uris we listen on to their settings keys. 65340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private final ArrayMap<Uri, String> mListeningUris = new ArrayMap<>(); 66340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk // Map of settings keys to the listener. 67340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private final HashMap<String, Set<Tunable>> mTunableLookup = new HashMap<>(); 68340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk // Set of all tunables, used for leak detection. 69340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private final HashSet<Tunable> mTunables = LeakDetector.ENABLED ? new HashSet<>() : null; 70340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private final Context mContext; 71340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 72340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private ContentResolver mContentResolver; 73340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private int mCurrentUser; 74340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private CurrentUserTracker mUserTracker; 75340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 76340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public TunerServiceImpl(Context context) { 77340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mContext = context; 78340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mContentResolver = mContext.getContentResolver(); 79340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 80340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (UserInfo user : UserManager.get(mContext).getUsers()) { 81340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mCurrentUser = user.getUserHandle().getIdentifier(); 82340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (getValue(TUNER_VERSION, 0) != CURRENT_TUNER_VERSION) { 83340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk upgradeTuner(getValue(TUNER_VERSION, 0), CURRENT_TUNER_VERSION); 84340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 85340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 86340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 87340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mCurrentUser = ActivityManager.getCurrentUser(); 88340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mUserTracker = new CurrentUserTracker(mContext) { 89340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 90340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void onUserSwitched(int newUserId) { 91340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mCurrentUser = newUserId; 92340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk reloadAll(); 93340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk reregisterAll(); 94340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 95340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk }; 96340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mUserTracker.startTracking(); 97340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 98340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 99340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 100340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void destroy() { 101340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mUserTracker.stopTracking(); 102340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 103340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 104340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private void upgradeTuner(int oldVersion, int newVersion) { 105340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (oldVersion < 1) { 106340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk String blacklistStr = getValue(StatusBarIconController.ICON_BLACKLIST); 107340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (blacklistStr != null) { 108340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk ArraySet<String> iconBlacklist = 109340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk StatusBarIconController.getIconBlacklist(blacklistStr); 110340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 111340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk iconBlacklist.add("rotate"); 112340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk iconBlacklist.add("headset"); 113340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 114340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Settings.Secure.putStringForUser(mContentResolver, 115340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk StatusBarIconController.ICON_BLACKLIST, 116340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk TextUtils.join(",", iconBlacklist), mCurrentUser); 117340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 118340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 119f87aba0a8392c9d9ec6e2e1dcfcaf61c6f2cb29eJason Monk if (oldVersion < 2) { 120f87aba0a8392c9d9ec6e2e1dcfcaf61c6f2cb29eJason Monk setTunerEnabled(mContext, false); 121f87aba0a8392c9d9ec6e2e1dcfcaf61c6f2cb29eJason Monk } 122340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk setValue(TUNER_VERSION, newVersion); 123340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 124340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 125340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 126340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public String getValue(String setting) { 127340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk return Settings.Secure.getStringForUser(mContentResolver, setting, mCurrentUser); 128340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 129340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 130340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 131340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void setValue(String setting, String value) { 132340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Settings.Secure.putStringForUser(mContentResolver, setting, value, mCurrentUser); 133340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 134340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 135340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 136340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public int getValue(String setting, int def) { 137340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk return Settings.Secure.getIntForUser(mContentResolver, setting, def, mCurrentUser); 138340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 139340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 140340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 141340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public String getValue(String setting, String def) { 142340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk String ret = Secure.getStringForUser(mContentResolver, setting, mCurrentUser); 143340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (ret == null) return def; 144340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk return ret; 145340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 146340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 147340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 148340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void setValue(String setting, int value) { 149340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Settings.Secure.putIntForUser(mContentResolver, setting, value, mCurrentUser); 150340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 151340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 152340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 153340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void addTunable(Tunable tunable, String... keys) { 154340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (String key : keys) { 155340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk addTunable(tunable, key); 156340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 157340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 158340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 159340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private void addTunable(Tunable tunable, String key) { 160340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (!mTunableLookup.containsKey(key)) { 161340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mTunableLookup.put(key, new ArraySet<Tunable>()); 162340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 163340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mTunableLookup.get(key).add(tunable); 164340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (LeakDetector.ENABLED) { 165340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mTunables.add(tunable); 166340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Dependency.get(LeakDetector.class).trackCollection(mTunables, "TunerService.mTunables"); 167340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 168340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Uri uri = Settings.Secure.getUriFor(key); 169340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (!mListeningUris.containsKey(uri)) { 170340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mListeningUris.put(uri, key); 171340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mContentResolver.registerContentObserver(uri, false, mObserver, mCurrentUser); 172340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 173340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk // Send the first state. 174340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk String value = Settings.Secure.getStringForUser(mContentResolver, key, mCurrentUser); 175340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk tunable.onTuningChanged(key, value); 176340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 177340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 178340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 179340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void removeTunable(Tunable tunable) { 180340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (Set<Tunable> list : mTunableLookup.values()) { 181340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk list.remove(tunable); 182340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 183340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (LeakDetector.ENABLED) { 184340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mTunables.remove(tunable); 185340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 186340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 187340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 188340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk protected void reregisterAll() { 189340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (mListeningUris.size() == 0) { 190340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk return; 191340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 192340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mContentResolver.unregisterContentObserver(mObserver); 193340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (Uri uri : mListeningUris.keySet()) { 194340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mContentResolver.registerContentObserver(uri, false, mObserver, mCurrentUser); 195340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 196340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 197340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 198340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private void reloadSetting(Uri uri) { 199340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk String key = mListeningUris.get(uri); 200340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Set<Tunable> tunables = mTunableLookup.get(key); 201340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (tunables == null) { 202340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk return; 203340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 204340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk String value = Settings.Secure.getStringForUser(mContentResolver, key, mCurrentUser); 205340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (Tunable tunable : tunables) { 206340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk tunable.onTuningChanged(key, value); 207340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 208340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 209340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 210340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private void reloadAll() { 211340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (String key : mTunableLookup.keySet()) { 212340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk String value = Settings.Secure.getStringForUser(mContentResolver, key, 213340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mCurrentUser); 214340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (Tunable tunable : mTunableLookup.get(key)) { 215340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk tunable.onTuningChanged(key, value); 216340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 217340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 218340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 219340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 220340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 221340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void clearAll() { 222340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk // A couple special cases. 223340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Settings.Global.putString(mContentResolver, DemoMode.DEMO_MODE_ALLOWED, null); 224340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Intent intent = new Intent(DemoMode.ACTION_DEMO); 225340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_EXIT); 226340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mContext.sendBroadcast(intent); 227340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 228340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (String key : mTunableLookup.keySet()) { 229340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Settings.Secure.putString(mContentResolver, key, null); 230340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 231340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 232340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 233340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private class Observer extends ContentObserver { 234340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public Observer() { 235340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk super(new Handler(Looper.getMainLooper())); 236340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 237340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 238340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 239340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void onChange(boolean selfChange, Uri uri, int userId) { 240340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (userId == ActivityManager.getCurrentUser()) { 241340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk reloadSetting(uri); 242340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 243340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 244340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 245340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk} 246