Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e745172 authored by Jason Monk's avatar Jason Monk
Browse files

Setup service for tunable things to use.

Change-Id: I13daa68d3d1ec5584fd84f356f4f5a0d1c0b853a
parent 683e3cfe
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -40,13 +40,14 @@ public class SystemUIApplication extends Application {
     * The classes of the stuff to start.
     */
    private final Class<?>[] SERVICES = new Class[] {
            com.android.systemui.tuner.TunerService.class,
            com.android.systemui.keyguard.KeyguardViewMediator.class,
            com.android.systemui.recents.Recents.class,
            com.android.systemui.volume.VolumeUI.class,
            com.android.systemui.statusbar.SystemBars.class,
            com.android.systemui.usb.StorageNotification.class,
            com.android.systemui.power.PowerUI.class,
            com.android.systemui.media.RingtonePlayer.class
            com.android.systemui.media.RingtonePlayer.class,
    };

    /**
+20 −23
Original line number Diff line number Diff line
@@ -18,14 +18,12 @@ package com.android.systemui.statusbar;

import android.content.Context;
import android.content.res.ColorStateList;
import android.database.ContentObserver;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.provider.Settings;
import android.telephony.SubscriptionInfo;
import android.util.ArraySet;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
@@ -40,6 +38,8 @@ import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkControllerImpl;
import com.android.systemui.statusbar.policy.SecurityController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;

import java.util.ArrayList;
import java.util.List;
@@ -48,7 +48,7 @@ import java.util.List;
public class SignalClusterView
        extends LinearLayout
        implements NetworkControllerImpl.SignalCallback,
        SecurityController.SecurityControllerCallback {
        SecurityController.SecurityControllerCallback, Tunable {

    static final String TAG = "SignalClusterView";
    static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -105,14 +105,22 @@ public class SignalClusterView

    public SignalClusterView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        readBlacklist();
    }

    private void readBlacklist() {
        mBlockAirplane = StatusBarIconController.isBlocked(getContext(), SLOT_AIRPLANE);
        mBlockMobile = StatusBarIconController.isBlocked(getContext(), SLOT_MOBILE);
        mBlockWifi = StatusBarIconController.isBlocked(getContext(), SLOT_WIFI);
        mBlockEthernet = StatusBarIconController.isBlocked(getContext(), SLOT_ETHERNET);
    @Override
    public void onTuningChanged(String key, String newValue) {
        if (!StatusBarIconController.ICON_BLACKLIST.equals(key)) {
            return;
        }
        ArraySet<String> blockList = StatusBarIconController.getIconBlacklist(newValue);
        mBlockAirplane = blockList.contains(SLOT_AIRPLANE);
        mBlockMobile = blockList.contains(SLOT_MOBILE);
        mBlockWifi = blockList.contains(SLOT_WIFI);
        mBlockEthernet = blockList.contains(SLOT_ETHERNET);

        // Re-register to get new callbacks.
        mNC.removeSignalCallback(SignalClusterView.this);
        mNC.addSignalCallback(SignalClusterView.this);
    }

    public void setNetworkController(NetworkControllerImpl nc) {
@@ -160,12 +168,10 @@ public class SignalClusterView
        for (PhoneState state : mPhoneStates) {
            mMobileSignalGroup.addView(state.mMobileGroup);
        }
        TunerService.get(mContext).addTunable(this, StatusBarIconController.ICON_BLACKLIST);

        apply();
        applyIconTint();
        getContext().getContentResolver().registerContentObserver(
                Settings.Secure.getUriFor(StatusBarIconController.ICON_BLACKLIST), false,
                mBlacklistObserver);
    }

    @Override
@@ -178,7 +184,7 @@ public class SignalClusterView
        mAirplane       = null;
        mMobileSignalGroup.removeAllViews();
        mMobileSignalGroup = null;
        getContext().getContentResolver().unregisterContentObserver(mBlacklistObserver);
        TunerService.get(mContext).removeTunable(this);

        super.onDetachedFromWindow();
    }
@@ -528,14 +534,5 @@ public class SignalClusterView
            setTint(mMobileType, tint);
        }
    }

    private final ContentObserver mBlacklistObserver = new ContentObserver(new Handler()) {
        public void onChange(boolean selfChange) {
            readBlacklist();
            // Re-register to get new callbacks.
            mNC.removeSignalCallback(SignalClusterView.this);
            mNC.addSignalCallback(SignalClusterView.this);
        };
    };
}
+6 −3
Original line number Diff line number Diff line
@@ -3166,9 +3166,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
                (SignalClusterView) mKeyguardStatusBar.findViewById(R.id.signal_cluster);
        final SignalClusterView signalClusterQs =
                (SignalClusterView) mHeader.findViewById(R.id.signal_cluster);
        mNetworkController.addSignalCallback(signalCluster);
        mNetworkController.addSignalCallback(signalClusterKeyguard);
        mNetworkController.addSignalCallback(signalClusterQs);
        mNetworkController.removeSignalCallback(signalCluster);
        mNetworkController.removeSignalCallback(signalClusterKeyguard);
        mNetworkController.removeSignalCallback(signalClusterQs);
        if (mQSPanel != null && mQSPanel.getHost() != null) {
            mQSPanel.getHost().destroy();
        }
    }

    private boolean mDemoModeAllowed;
+19 −55
Original line number Diff line number Diff line
@@ -19,13 +19,9 @@ package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Process;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.provider.Settings.Secure;
import android.os.Process;
import android.util.Log;

import com.android.systemui.R;
@@ -35,25 +31,26 @@ import com.android.systemui.qs.tiles.BluetoothTile;
import com.android.systemui.qs.tiles.CastTile;
import com.android.systemui.qs.tiles.CellularTile;
import com.android.systemui.qs.tiles.ColorInversionTile;
import com.android.systemui.qs.tiles.DndTile;
import com.android.systemui.qs.tiles.FlashlightTile;
import com.android.systemui.qs.tiles.HotspotTile;
import com.android.systemui.qs.tiles.IntentTile;
import com.android.systemui.qs.tiles.LocationTile;
import com.android.systemui.qs.tiles.RotationLockTile;
import com.android.systemui.qs.tiles.WifiTile;
import com.android.systemui.qs.tiles.DndTile;
import com.android.systemui.settings.CurrentUserTracker;
import com.android.systemui.statusbar.policy.BluetoothController;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.FlashlightController;
import com.android.systemui.statusbar.policy.HotspotController;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.statusbar.policy.LocationController;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.RotationLockController;
import com.android.systemui.statusbar.policy.HotspotController;
import com.android.systemui.statusbar.policy.SecurityController;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;

import java.util.ArrayList;
import java.util.Arrays;
@@ -63,7 +60,7 @@ import java.util.List;
import java.util.Map;

/** Platform implementation of the quick settings tile host **/
public class QSTileHost implements QSTile.Host {
public class QSTileHost implements QSTile.Host, Tunable {
    private static final String TAG = "QSTileHost";
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);

@@ -72,8 +69,7 @@ public class QSTileHost implements QSTile.Host {
    private final Context mContext;
    private final PhoneStatusBar mStatusBar;
    private final LinkedHashMap<String, QSTile<?>> mTiles = new LinkedHashMap<>();
    private final ArrayList<String> mTileSpecs = new ArrayList<>();
    private final Observer mObserver = new Observer();
    protected final ArrayList<String> mTileSpecs = new ArrayList<>();
    private final BluetoothController mBluetooth;
    private final LocationController mLocation;
    private final RotationLockController mRotation;
@@ -82,7 +78,6 @@ public class QSTileHost implements QSTile.Host {
    private final HotspotController mHotspot;
    private final CastController mCast;
    private final Looper mLooper;
    protected final CurrentUserTracker mUserTracker;
    private final FlashlightController mFlashlight;
    private final UserSwitcherController mUserSwitcherController;
    private final KeyguardMonitor mKeyguard;
@@ -116,22 +111,11 @@ public class QSTileHost implements QSTile.Host {
        ht.start();
        mLooper = ht.getLooper();

        mUserTracker = new CurrentUserTracker(mContext) {
            @Override
            public void onUserSwitched(int newUserId) {
                recreateTiles();
                for (QSTile<?> tile : mTiles.values()) {
                    tile.userSwitch(newUserId);
                }
                mSecurity.onUserSwitched(newUserId);
                mNetwork.onUserSwitched(newUserId);
                mObserver.register();
        TunerService.get(mContext).addTunable(this, TILES_SETTING);
    }
        };
        recreateTiles();

        mUserTracker.startTracking();
        mObserver.register();
    public void destroy() {
        TunerService.get(mContext).removeTunable(this);
    }

    @Override
@@ -222,9 +206,13 @@ public class QSTileHost implements QSTile.Host {
        return mSecurity;
    }
    
    private void recreateTiles() {
    @Override
    public void onTuningChanged(String key, String newValue) {
        if (!TILES_SETTING.equals(key)) {
            return;
        }
        if (DEBUG) Log.d(TAG, "Recreating tiles");
        final List<String> tileSpecs = loadTileSpecs();
        final List<String> tileSpecs = loadTileSpecs(newValue);
        if (tileSpecs.equals(mTileSpecs)) return;
        for (Map.Entry<String, QSTile<?>> tile : mTiles.entrySet()) {
            if (!tileSpecs.contains(tile.getKey())) {
@@ -270,11 +258,9 @@ public class QSTileHost implements QSTile.Host {
        else throw new IllegalArgumentException("Bad tile spec: " + tileSpec);
    }

    protected List<String> loadTileSpecs() {
    protected List<String> loadTileSpecs(String tileList) {
        final Resources res = mContext.getResources();
        final String defaultTileList = res.getString(R.string.quick_settings_tiles_default);
        String tileList = Secure.getStringForUser(mContext.getContentResolver(), TILES_SETTING,
                mUserTracker.getCurrentUserId());
        if (tileList == null) {
            tileList = res.getString(R.string.quick_settings_tiles);
            if (DEBUG) Log.d(TAG, "Loaded tile specs from config: " + tileList);
@@ -297,26 +283,4 @@ public class QSTileHost implements QSTile.Host {
        }
        return tiles;
    }

    private class Observer extends ContentObserver {
        private boolean mRegistered;

        public Observer() {
            super(new Handler(Looper.getMainLooper()));
        }

        public void register() {
            if (mRegistered) {
                mContext.getContentResolver().unregisterContentObserver(this);
            }
            mContext.getContentResolver().registerContentObserver(Secure.getUriFor(TILES_SETTING),
                    false, this, mUserTracker.getCurrentUserId());
            mRegistered = true;
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {
            recreateTiles();
        }
    }
}
+28 −35
Original line number Diff line number Diff line
@@ -20,12 +20,10 @@ import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.ColorStateList;
import android.database.ContentObserver;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArraySet;
import android.view.View;
@@ -44,6 +42,8 @@ import com.android.systemui.R;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.SignalClusterView;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -53,7 +53,7 @@ import java.util.ArrayList;
 * limited to: notification icons, signal cluster, additional status icons, and clock in the status
 * bar.
 */
public class StatusBarIconController {
public class StatusBarIconController implements Tunable {

    public static final long DEFAULT_TINT_ANIMATION_DURATION = 120;

@@ -95,7 +95,7 @@ public class StatusBarIconController {
    private long mTransitionDeferringStartTime;
    private long mTransitionDeferringDuration;

    private final ArraySet<String> mIconBlacklist;
    private final ArraySet<String> mIconBlacklist = new ArraySet<>();

    private final Runnable mTransitionDeferringDoneRunnable = new Runnable() {
        @Override
@@ -126,14 +126,33 @@ public class StatusBarIconController {
        mDarkModeIconColorSingleTone = context.getColor(R.color.dark_mode_icon_color_single_tone);
        mLightModeIconColorSingleTone = context.getColor(R.color.light_mode_icon_color_single_tone);
        mHandler = new Handler();
        mIconBlacklist = getIconBlacklist(context);
        updateResources();

        context.getContentResolver().registerContentObserver(
                Settings.Secure.getUriFor(StatusBarIconController.ICON_BLACKLIST), false,
                mBlacklistObserver);
        TunerService.get(mContext).addTunable(this, ICON_BLACKLIST);
    }

    @Override
    public void onTuningChanged(String key, String newValue) {
        if (!ICON_BLACKLIST.equals(key)) {
            return;
        }
        mIconBlacklist.clear();
        mIconBlacklist.addAll(getIconBlacklist(newValue));
        ArrayList<StatusBarIconView> views = new ArrayList<StatusBarIconView>();
        // Get all the current views.
        for (int i = 0; i < mStatusIcons.getChildCount(); i++) {
            views.add((StatusBarIconView) mStatusIcons.getChildAt(i));
        }
        // Remove all the icons.
        for (int i = views.size() - 1; i >= 0; i--) {
            removeSystemIcon(views.get(i).getSlot(), i, i);
        }
        // Add them all back
        for (int i = 0; i < views.size(); i++) {
            addSystemIcon(views.get(i).getSlot(), i, i, views.get(i).getStatusBarIcon());
        }
    };

    public void updateResources() {
        mIconSize = mContext.getResources().getDimensionPixelSize(
                com.android.internal.R.dimen.status_bar_icon_size);
@@ -429,29 +448,7 @@ public class StatusBarIconController {
        mTransitionPending = false;
    }

    private final ContentObserver mBlacklistObserver = new ContentObserver(new Handler()) {
        public void onChange(boolean selfChange) {
            mIconBlacklist.clear();
            mIconBlacklist.addAll(getIconBlacklist(mContext));
            ArrayList<StatusBarIconView> views = new ArrayList<StatusBarIconView>();
            // Get all the current views.
            for (int i = 0; i < mStatusIcons.getChildCount(); i++) {
                views.add((StatusBarIconView) mStatusIcons.getChildAt(i));
            }
            // Remove all the icons.
            for (int i = views.size() - 1; i >= 0; i--) {
                removeSystemIcon(views.get(i).getSlot(), i, i);
            }
            // Add them all back
            for (int i = 0; i < views.size(); i++) {
                addSystemIcon(views.get(i).getSlot(), i, i, views.get(i).getStatusBarIcon());
            }
        }
    };

    public static ArraySet<String> getIconBlacklist(Context context) {
        String blackListStr = Settings.Secure.getString(context.getContentResolver(),
                ICON_BLACKLIST);
    public static ArraySet<String> getIconBlacklist(String blackListStr) {
        ArraySet<String> ret = new ArraySet<String>();
        if (blackListStr != null) {
            String[] blacklist = blackListStr.split(",");
@@ -463,8 +460,4 @@ public class StatusBarIconController {
        }
        return ret;
    }

    public static boolean isBlocked(Context context, String slot) {
        return getIconBlacklist(context).contains(slot);
    }
}
Loading