diff options
Diffstat (limited to 'packages/SystemUI/src/com/android/systemui/tuner')
4 files changed, 232 insertions, 17 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java b/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java index 9f593fc..7472af9 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/QsTuner.java @@ -15,6 +15,7 @@ */ package com.android.systemui.tuner; +import android.app.ActivityManager; import android.app.AlertDialog; import android.app.Fragment; import android.content.ClipData; @@ -49,6 +50,7 @@ import com.android.systemui.qs.tiles.IntentTile; import com.android.systemui.statusbar.phone.QSTileHost; import com.android.systemui.statusbar.policy.SecurityController; +import java.util.ArrayList; import java.util.List; public class QsTuner extends Fragment implements Callback { @@ -107,6 +109,12 @@ public class QsTuner extends Fragment implements Callback { return mScrollRoot; } + @Override + public void onDestroyView() { + mTileHost.destroy(); + super.onDestroyView(); + } + private void setupDropTarget() { QSTileView tileView = new QSTileView(getContext()); QSTile.State state = new QSTile.State(); @@ -187,7 +195,7 @@ public class QsTuner extends Fragment implements Callback { if (oldTile.equals(newTile)) { return; } - List<String> order = loadTileSpecs(); + List<String> order = new ArrayList<>(mTileSpecs); int index = order.indexOf(oldTile); if (index < 0) { Log.e(TAG, "Can't find " + oldTile); @@ -199,32 +207,33 @@ public class QsTuner extends Fragment implements Callback { } public void remove(String tile) { - List<String> tiles = loadTileSpecs(); + List<String> tiles = new ArrayList<>(mTileSpecs); tiles.remove(tile); setTiles(tiles); } public void add(String tile) { - List<String> tiles = loadTileSpecs(); + List<String> tiles = new ArrayList<>(mTileSpecs); tiles.add(tile); setTiles(tiles); } public void reset() { Secure.putStringForUser(getContext().getContentResolver(), - TILES_SETTING, "default", mUserTracker.getCurrentUserId()); + TILES_SETTING, "default", ActivityManager.getCurrentUser()); } private void setTiles(List<String> tiles) { Secure.putStringForUser(getContext().getContentResolver(), TILES_SETTING, - TextUtils.join(",", tiles), mUserTracker.getCurrentUserId()); + TextUtils.join(",", tiles), ActivityManager.getCurrentUser()); } public void showAddDialog() { - List<String> tiles = loadTileSpecs(); + List<String> tiles = mTileSpecs; String[] defaults = getContext().getString(R.string.quick_settings_tiles_default).split(","); final String[] available = new String[defaults.length + 1 - tiles.size()]; + final String[] availableTiles = new String[available.length]; int index = 0; for (int i = 0; i < defaults.length; i++) { if (tiles.contains(defaults[i])) { @@ -232,8 +241,10 @@ public class QsTuner extends Fragment implements Callback { } int resource = getLabelResource(defaults[i]); if (resource != 0) { + availableTiles[index] = defaults[i]; available[index++] = getContext().getString(resource); } else { + availableTiles[index] = defaults[i]; available[index++] = defaults[i]; } } @@ -243,7 +254,7 @@ public class QsTuner extends Fragment implements Callback { .setItems(available, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (which < available.length - 1) { - add(available[which]); + add(availableTiles[which]); } else { showBroadcastTileDialog(); } diff --git a/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java index 8158a68..d4cc56d 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/StatusBarSwitch.java @@ -15,6 +15,7 @@ */ package com.android.systemui.tuner; +import android.app.ActivityManager; import android.content.ContentResolver; import android.content.Context; import android.preference.SwitchPreference; @@ -23,28 +24,38 @@ import android.text.TextUtils; import android.util.AttributeSet; import com.android.systemui.statusbar.phone.StatusBarIconController; +import com.android.systemui.tuner.TunerService.Tunable; import java.util.Set; -public class StatusBarSwitch extends SwitchPreference { +public class StatusBarSwitch extends SwitchPreference implements Tunable { + + private Set<String> mBlacklist; public StatusBarSwitch(Context context, AttributeSet attrs) { super(context, attrs); - setChecked(!StatusBarIconController.isBlocked(getContext(), getKey())); + } + + @Override + public void onTuningChanged(String key, String newValue) { + if (!StatusBarIconController.ICON_BLACKLIST.equals(key)) { + return; + } + mBlacklist = StatusBarIconController.getIconBlacklist(newValue); + setChecked(!mBlacklist.contains(getKey())); } @Override protected boolean persistBoolean(boolean value) { - Set<String> blacklist = StatusBarIconController.getIconBlacklist(getContext()); if (!value) { // If not enabled add to blacklist. - if (!blacklist.contains(getKey())) { - blacklist.add(getKey()); - setList(blacklist); + if (!mBlacklist.contains(getKey())) { + mBlacklist.add(getKey()); + setList(mBlacklist); } } else { - if (blacklist != null && blacklist.remove(getKey())) { - setList(blacklist); + if (mBlacklist.remove(getKey())) { + setList(mBlacklist); } } return true; @@ -52,7 +63,7 @@ public class StatusBarSwitch extends SwitchPreference { private void setList(Set<String> blacklist) { ContentResolver contentResolver = getContext().getContentResolver(); - Settings.Secure.putString(contentResolver, StatusBarIconController.ICON_BLACKLIST, - TextUtils.join(",", blacklist)); + Settings.Secure.putStringForUser(contentResolver, StatusBarIconController.ICON_BLACKLIST, + TextUtils.join(",", blacklist), ActivityManager.getCurrentUser()); } } diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java index b40adaf..7ac7306 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java @@ -26,11 +26,14 @@ import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceFragment; +import android.preference.PreferenceGroup; import android.preference.SwitchPreference; import android.provider.Settings.System; import android.view.MenuItem; import com.android.systemui.R; +import com.android.systemui.statusbar.phone.StatusBarIconController; +import com.android.systemui.tuner.TunerService.Tunable; public class TunerFragment extends PreferenceFragment { @@ -67,12 +70,42 @@ public class TunerFragment extends PreferenceFragment { updateBatteryPct(); getContext().getContentResolver().registerContentObserver( System.getUriFor(SHOW_PERCENT_SETTING), false, mSettingObserver); + + registerPrefs(getPreferenceScreen()); } @Override public void onPause() { super.onPause(); getContext().getContentResolver().unregisterContentObserver(mSettingObserver); + + unregisterPrefs(getPreferenceScreen()); + } + + private void registerPrefs(PreferenceGroup group) { + TunerService tunerService = TunerService.get(getContext()); + final int N = group.getPreferenceCount(); + for (int i = 0; i < N; i++) { + Preference pref = group.getPreference(i); + if (pref instanceof StatusBarSwitch) { + tunerService.addTunable((Tunable) pref, StatusBarIconController.ICON_BLACKLIST); + } else if (pref instanceof PreferenceGroup) { + registerPrefs((PreferenceGroup) pref); + } + } + } + + private void unregisterPrefs(PreferenceGroup group) { + TunerService tunerService = TunerService.get(getContext()); + final int N = group.getPreferenceCount(); + for (int i = 0; i < N; i++) { + Preference pref = group.getPreference(i); + if (pref instanceof Tunable) { + tunerService.removeTunable((Tunable) pref); + } else if (pref instanceof PreferenceGroup) { + registerPrefs((PreferenceGroup) pref); + } + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java new file mode 100644 index 0000000..de5aaf6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.systemui.tuner; + +import android.app.ActivityManager; +import android.content.ContentResolver; +import android.content.Context; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; +import android.provider.Settings; +import android.util.ArrayMap; + +import com.android.systemui.SystemUI; +import com.android.systemui.SystemUIApplication; +import com.android.systemui.settings.CurrentUserTracker; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + + +public class TunerService extends SystemUI { + + private final Observer mObserver = new Observer(); + // Map of Uris we listen on to their settings keys. + private final ArrayMap<Uri, String> mListeningUris = new ArrayMap<>(); + // Map of settings keys to the listener. + private final HashMap<String, List<Tunable>> mTunableLookup = new HashMap<>(); + + private ContentResolver mContentResolver; + private int mCurrentUser; + private CurrentUserTracker mUserTracker; + + @Override + public void start() { + mContentResolver = mContext.getContentResolver(); + putComponent(TunerService.class, this); + + mCurrentUser = ActivityManager.getCurrentUser(); + mUserTracker = new CurrentUserTracker(mContext) { + @Override + public void onUserSwitched(int newUserId) { + mCurrentUser = newUserId; + reloadAll(); + reregisterAll(); + } + }; + mUserTracker.startTracking(); + } + + public void addTunable(Tunable tunable, String... keys) { + for (String key : keys) { + addTunable(tunable, key); + } + } + + private void addTunable(Tunable tunable, String key) { + if (!mTunableLookup.containsKey(key)) { + mTunableLookup.put(key, new ArrayList<Tunable>()); + } + mTunableLookup.get(key).add(tunable); + Uri uri = Settings.Secure.getUriFor(key); + if (!mListeningUris.containsKey(uri)) { + mListeningUris.put(uri, key); + mContentResolver.registerContentObserver(uri, false, mObserver, mCurrentUser); + } + // Send the first state. + String value = Settings.Secure.getStringForUser(mContentResolver, key, mCurrentUser); + tunable.onTuningChanged(key, value); + } + + public void removeTunable(Tunable tunable) { + for (List<Tunable> list : mTunableLookup.values()) { + list.remove(tunable); + } + } + + protected void reregisterAll() { + if (mListeningUris.size() == 0) { + return; + } + mContentResolver.unregisterContentObserver(mObserver); + for (Uri uri : mListeningUris.keySet()) { + mContentResolver.registerContentObserver(uri, false, mObserver, mCurrentUser); + } + } + + public void reloadSetting(Uri uri) { + String key = mListeningUris.get(uri); + String value = Settings.Secure.getStringForUser(mContentResolver, key, mCurrentUser); + for (Tunable tunable : mTunableLookup.get(key)) { + tunable.onTuningChanged(key, value); + } + } + + private void reloadAll() { + for (String key : mTunableLookup.keySet()) { + String value = Settings.Secure.getStringForUser(mContentResolver, key, + mCurrentUser); + for (Tunable tunable : mTunableLookup.get(key)) { + tunable.onTuningChanged(key, value); + } + } + } + + // Only used in other processes, such as the tuner. + private static TunerService sInstance; + + public static TunerService get(Context context) { + SystemUIApplication sysUi = (SystemUIApplication) context.getApplicationContext(); + TunerService service = sysUi.getComponent(TunerService.class); + if (service == null) { + // Can't get it as a component, must in the tuner, lets just create one for now. + return getStaticService(context); + } + return service; + } + + private static TunerService getStaticService(Context context) { + if (sInstance == null) { + sInstance = new TunerService(); + sInstance.mContext = context.getApplicationContext(); + sInstance.mComponents = new HashMap<>(); + sInstance.start(); + } + return sInstance; + } + + private class Observer extends ContentObserver { + public Observer() { + super(new Handler(Looper.getMainLooper())); + } + + @Override + public void onChange(boolean selfChange, Uri uri, int userId) { + if (userId == ActivityManager.getCurrentUser()) { + reloadSetting(uri); + } + } + } + + public interface Tunable { + void onTuningChanged(String key, String newValue); + } +} |