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

Commit 6236a820 authored by Jason Monk's avatar Jason Monk Committed by Android (Google) Code Review
Browse files

Merge "Setup service for tunable things to use." into mnc-dev

parents ef2ccf5f 5e745172
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