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

Commit 51c444be authored by Jason Monk's avatar Jason Monk
Browse files

QS Customize panel cleanup

 - Use better service management to ensure onTileAdded and onTileRemoved
   are sent.
 - Fix not always registered as tunable bug.

Bug: 26423350
Change-Id: I56156de8e0edf903509dac594b471700068ebe3e
parent 4420eae3
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -279,6 +279,10 @@ public class TileService extends Service {
                    }
                    break;
                case MSG_TILE_REMOVED:
                    if (mListening) {
                        mListening = false;
                        TileService.this.onStopListening();
                    }
                    TileService.this.onTileRemoved();
                    break;
                case MSG_STOP_LISTENING:
+5 −0
Original line number Diff line number Diff line
@@ -49,6 +49,11 @@ public class QuickQSPanel extends QSPanel {
        mQsContainer.addView((View) mTileLayout, 1 /* Between brightness and footer */);
    }

    @Override
    protected void createCustomizePanel() {
        // No customizing from the header.
    }

    public void setQSPanelAndHeader(QSPanel fullPanel, View header) {
        mFullPanel = fullPanel;
        mHeader = header;
+33 −42
Original line number Diff line number Diff line
@@ -16,32 +16,28 @@
package com.android.systemui.qs.customize;

import android.app.ActivityManager;
import android.app.Service;
import android.content.ClipData;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.Handler;
import android.os.UserHandle;
import android.provider.Settings.Secure;
import android.service.quicksettings.IQSTileService;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;

import com.android.systemui.R;
import com.android.systemui.qs.QSPanel;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.external.QSTileServiceWrapper;
import com.android.systemui.qs.external.CustomTile;
import com.android.systemui.qs.external.TileLifecycleManager;
import com.android.systemui.statusbar.phone.QSTileHost;
import com.android.systemui.tuner.TunerService;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
@@ -52,8 +48,9 @@ import java.util.List;
public class CustomQSPanel extends QSPanel {
    
    private static final String TAG = "CustomQSPanel";
    private static final boolean DEBUG = false;

    private List<String> mSavedTiles;
    private List<String> mSavedTiles = Collections.emptyList();
    private ArrayList<String> mStash;
    private List<String> mTiles = new ArrayList<>();

@@ -67,9 +64,15 @@ public class CustomQSPanel extends QSPanel {
        ((NonPagedTileLayout) mTileLayout).setCustomQsPanel(this);
        removeView(mFooter.getView());

        if (DEBUG) Log.d(TAG, "new CustomQSPanel", new Throwable());
        TunerService.get(mContext).addTunable(this, QSTileHost.TILES_SETTING);
    }

    @Override
    protected void onDetachedFromWindow() {
        // Don't allow the super to unregister the tunable.
    }

    @Override
    public void onTuningChanged(String key, String newValue) {
        if (key.equals(QS_SHOW_BRIGHTNESS)) {
@@ -77,7 +80,9 @@ public class CustomQSPanel extends QSPanel {
            super.onTuningChanged(key, "0");
        }
        if (QSTileHost.TILES_SETTING.equals(key)) {
            mSavedTiles = QSTileHost.loadTileSpecs(mContext, newValue);
            mSavedTiles = Collections.unmodifiableList(
                    QSTileHost.loadTileSpecs(mContext, newValue));
            if (DEBUG) Log.d(TAG, "New saved tiles " + TextUtils.join(",", mSavedTiles));
        }
    }

@@ -106,6 +111,7 @@ public class CustomQSPanel extends QSPanel {
    }

    public void setSavedTiles() {
        if (DEBUG) Log.d(TAG, "setSavedTiles " + TextUtils.join(",", mSavedTiles));
        setTiles(mSavedTiles);
    }

@@ -114,47 +120,26 @@ public class CustomQSPanel extends QSPanel {
            String tileSpec = mSavedTiles.get(i);
            if (!tileSpec.startsWith(CustomTile.PREFIX)) continue;
            if (!mTiles.contains(tileSpec)) {
                mContext.bindServiceAsUser(
                        new Intent().setComponent(CustomTile.getComponentFromSpec(tileSpec)),
                        new ServiceConnection() {
                            @Override
                            public void onServiceDisconnected(ComponentName name) {
                            }

                            @Override
                            public void onServiceConnected(ComponentName name, IBinder service) {
                                QSTileServiceWrapper wrapper = new QSTileServiceWrapper(
                                        IQSTileService.Stub.asInterface(service));
                                wrapper.onStopListening();
                                wrapper.onTileRemoved();
                                mContext.unbindService(this);
                            }
                        }, Service.BIND_AUTO_CREATE,
                        new UserHandle(ActivityManager.getCurrentUser()));
                Intent intent = new Intent().setComponent(CustomTile.getComponentFromSpec(tileSpec));
                TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(),
                        mContext, intent, new UserHandle(ActivityManager.getCurrentUser()));
                lifecycleManager.onStopListening();
                lifecycleManager.onTileRemoved();
                lifecycleManager.flushMessagesAndUnbind();
            }
        }
        for (int i = 0; i < mTiles.size(); i++) {
            String tileSpec = mTiles.get(i);
            if (!tileSpec.startsWith(CustomTile.PREFIX)) continue;
            if (!mSavedTiles.contains(tileSpec)) {
                mContext.bindServiceAsUser(
                        new Intent().setComponent(CustomTile.getComponentFromSpec(tileSpec)),
                        new ServiceConnection() {
                            @Override
                            public void onServiceDisconnected(ComponentName name) {
                            }

                            @Override
                            public void onServiceConnected(ComponentName name, IBinder service) {
                                QSTileServiceWrapper wrapper = new QSTileServiceWrapper(
                                        IQSTileService.Stub.asInterface(service));
                                wrapper.onTileAdded();
                                mContext.unbindService(this);
                            }
                        }, Service.BIND_AUTO_CREATE,
                        new UserHandle(ActivityManager.getCurrentUser()));
                Intent intent = new Intent().setComponent(CustomTile.getComponentFromSpec(tileSpec));
                TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(),
                        mContext, intent, new UserHandle(ActivityManager.getCurrentUser()));
                lifecycleManager.onTileAdded();
                lifecycleManager.flushMessagesAndUnbind();
            }
        }
        if (DEBUG) Log.d(TAG, "saveCurrentTiles " + mTiles);
        Secure.putStringForUser(getContext().getContentResolver(), QSTileHost.TILES_SETTING,
                TextUtils.join(",", mTiles), ActivityManager.getCurrentUser());
    }
@@ -173,6 +158,7 @@ public class CustomQSPanel extends QSPanel {
    }

    private void setTilesInternal() {
        if (DEBUG) Log.d(TAG, "Set tiles internal");
        for (int i = 0; i < mCurrentTiles.size(); i++) {
            mCurrentTiles.get(i).destroy();
        }
@@ -187,6 +173,8 @@ public class CustomQSPanel extends QSPanel {
                if (tile != null) {
                    tile.setTileSpec(mTiles.get(i));
                    mCurrentTiles.add(tile);
                } else {
                    if (DEBUG) Log.d(TAG, "Skipping " + mTiles.get(i));
                }
            }
        }
@@ -194,11 +182,13 @@ public class CustomQSPanel extends QSPanel {
    }

    public void addTile(String spec) {
        if (DEBUG) Log.d(TAG, "addTile " + spec);
        mTiles.add(spec);
        setTilesInternal();
    }

    public void moveTo(String from, String to) {
        if (DEBUG) Log.d(TAG, "moveTo " + from + " " + to);
        int fromIndex = mTiles.indexOf(from);
        if (fromIndex < 0) {
            Log.e(TAG, "Unknown from tile " + from);
@@ -222,6 +212,7 @@ public class CustomQSPanel extends QSPanel {
    }

    public void setTiles(List<String> tiles) {
        if (DEBUG) Log.d(TAG, "Set tiles " + TextUtils.join(",", tiles));
        mTiles = new ArrayList<>(tiles);
        setTilesInternal();
    }
+13 −0
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements
    @VisibleForTesting
    boolean mReceiverRegistered;
    private IQSService mService;
    private boolean mUnbindImmediate;

    public TileLifecycleManager(Handler handler, Context context, Intent intent, UserHandle user) {
        mContext = context;
@@ -94,6 +95,14 @@ public class TileLifecycleManager extends BroadcastReceiver implements
        }
    }

    /**
     * Binds just long enough to send any queued messages, then unbinds.
     */
    public void flushMessagesAndUnbind() {
        mUnbindImmediate = true;
        setBindService(true);
    }

    public void setBindService(boolean bind) {
        mBound = bind;
        if (bind) {
@@ -173,6 +182,10 @@ public class TileLifecycleManager extends BroadcastReceiver implements
            }
            onTileRemoved();
        }
        if (mUnbindImmediate) {
            mUnbindImmediate = false;
            setBindService(false);
        }
    }

    public void handleDestroy() {
+6 −7
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ import android.os.Looper;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.ArrayMap;

import android.util.ArraySet;
import com.android.systemui.BatteryMeterDrawable;
import com.android.systemui.DemoMode;
import com.android.systemui.R;
@@ -41,9 +41,8 @@ import com.android.systemui.SystemUIApplication;
import com.android.systemui.settings.CurrentUserTracker;
import com.android.systemui.statusbar.phone.SystemUIDialog;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;


public class TunerService extends SystemUI {
@@ -54,7 +53,7 @@ public class TunerService extends SystemUI {
    // 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 final HashMap<String, Set<Tunable>> mTunableLookup = new HashMap<>();

    private ContentResolver mContentResolver;
    private int mCurrentUser;
@@ -85,7 +84,7 @@ public class TunerService extends SystemUI {

    private void addTunable(Tunable tunable, String key) {
        if (!mTunableLookup.containsKey(key)) {
            mTunableLookup.put(key, new ArrayList<Tunable>());
            mTunableLookup.put(key, new ArraySet<Tunable>());
        }
        mTunableLookup.get(key).add(tunable);
        Uri uri = Settings.Secure.getUriFor(key);
@@ -99,7 +98,7 @@ public class TunerService extends SystemUI {
    }

    public void removeTunable(Tunable tunable) {
        for (List<Tunable> list : mTunableLookup.values()) {
        for (Set<Tunable> list : mTunableLookup.values()) {
            list.remove(tunable);
        }
    }
@@ -116,7 +115,7 @@ public class TunerService extends SystemUI {

    public void reloadSetting(Uri uri) {
        String key = mListeningUris.get(uri);
        List<Tunable> tunables = mTunableLookup.get(key);
        Set<Tunable> tunables = mTunableLookup.get(key);
        if (tunables == null) {
            return;
        }