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 61340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private static final int CURRENT_TUNER_VERSION = 1; 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 } 119340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk setValue(TUNER_VERSION, newVersion); 120340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 121340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 122340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 123340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public String getValue(String setting) { 124340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk return Settings.Secure.getStringForUser(mContentResolver, setting, mCurrentUser); 125340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 126340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 127340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 128340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void setValue(String setting, String value) { 129340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Settings.Secure.putStringForUser(mContentResolver, setting, value, mCurrentUser); 130340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 131340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 132340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 133340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public int getValue(String setting, int def) { 134340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk return Settings.Secure.getIntForUser(mContentResolver, setting, def, mCurrentUser); 135340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 136340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 137340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 138340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public String getValue(String setting, String def) { 139340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk String ret = Secure.getStringForUser(mContentResolver, setting, mCurrentUser); 140340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (ret == null) return def; 141340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk return ret; 142340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 143340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 144340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 145340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void setValue(String setting, int value) { 146340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Settings.Secure.putIntForUser(mContentResolver, setting, value, mCurrentUser); 147340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 148340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 149340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 150340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void addTunable(Tunable tunable, String... keys) { 151340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (String key : keys) { 152340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk addTunable(tunable, key); 153340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 154340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 155340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 156340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private void addTunable(Tunable tunable, String key) { 157340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (!mTunableLookup.containsKey(key)) { 158340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mTunableLookup.put(key, new ArraySet<Tunable>()); 159340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 160340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mTunableLookup.get(key).add(tunable); 161340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (LeakDetector.ENABLED) { 162340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mTunables.add(tunable); 163340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Dependency.get(LeakDetector.class).trackCollection(mTunables, "TunerService.mTunables"); 164340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 165340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Uri uri = Settings.Secure.getUriFor(key); 166340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (!mListeningUris.containsKey(uri)) { 167340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mListeningUris.put(uri, key); 168340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mContentResolver.registerContentObserver(uri, false, mObserver, mCurrentUser); 169340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 170340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk // Send the first state. 171340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk String value = Settings.Secure.getStringForUser(mContentResolver, key, mCurrentUser); 172340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk tunable.onTuningChanged(key, value); 173340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 174340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 175340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 176340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void removeTunable(Tunable tunable) { 177340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (Set<Tunable> list : mTunableLookup.values()) { 178340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk list.remove(tunable); 179340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 180340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (LeakDetector.ENABLED) { 181340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mTunables.remove(tunable); 182340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 183340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 184340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 185340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk protected void reregisterAll() { 186340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (mListeningUris.size() == 0) { 187340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk return; 188340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 189340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mContentResolver.unregisterContentObserver(mObserver); 190340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (Uri uri : mListeningUris.keySet()) { 191340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mContentResolver.registerContentObserver(uri, false, mObserver, mCurrentUser); 192340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 193340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 194340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 195340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private void reloadSetting(Uri uri) { 196340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk String key = mListeningUris.get(uri); 197340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Set<Tunable> tunables = mTunableLookup.get(key); 198340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (tunables == null) { 199340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk return; 200340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 201340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk String value = Settings.Secure.getStringForUser(mContentResolver, key, mCurrentUser); 202340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (Tunable tunable : tunables) { 203340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk tunable.onTuningChanged(key, value); 204340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 205340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 206340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 207340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private void reloadAll() { 208340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (String key : mTunableLookup.keySet()) { 209340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk String value = Settings.Secure.getStringForUser(mContentResolver, key, 210340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mCurrentUser); 211340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (Tunable tunable : mTunableLookup.get(key)) { 212340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk tunable.onTuningChanged(key, value); 213340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 214340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 215340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 216340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 217340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 218340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void clearAll() { 219340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk // A couple special cases. 220340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Settings.Global.putString(mContentResolver, DemoMode.DEMO_MODE_ALLOWED, null); 221340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Intent intent = new Intent(DemoMode.ACTION_DEMO); 222340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk intent.putExtra(DemoMode.EXTRA_COMMAND, DemoMode.COMMAND_EXIT); 223340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk mContext.sendBroadcast(intent); 224340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 225340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk for (String key : mTunableLookup.keySet()) { 226340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk Settings.Secure.putString(mContentResolver, key, null); 227340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 228340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 229340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 230340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk private class Observer extends ContentObserver { 231340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public Observer() { 232340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk super(new Handler(Looper.getMainLooper())); 233340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 234340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk 235340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk @Override 236340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk public void onChange(boolean selfChange, Uri uri, int userId) { 237340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk if (userId == ActivityManager.getCurrentUser()) { 238340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk reloadSetting(uri); 239340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 240340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 241340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk } 242340b0e5216b4fcc435e0459b1ca46155a572100dJason Monk} 243