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

Commit 07f55a2a authored by Jason Monk's avatar Jason Monk
Browse files

Remove QS tiles that get uninstalled

Change-Id: Ib4c7250a38c0630b0d828f1f55ce5c0dc4d3bb44
Fixes: 27893200
parent 726959bf
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -16,13 +16,18 @@
package com.android.systemui.qs.external;

import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.service.quicksettings.IQSTileService;
import android.support.annotation.VisibleForTesting;
import android.util.Log;
import libcore.util.Objects;

/**
 * Manages the priority which lets {@link TileServices} make decisions about which tiles
@@ -68,6 +73,12 @@ public class TileServiceManager {
        mHandler = handler;
        mStateManager = tileLifecycleManager;
        mStateManager.setQSService(tileServices);

        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        filter.addDataScheme("package");
        mServices.getContext().registerReceiverAsUser(mUninstallReceiver,
                new UserHandle(ActivityManager.getCurrentUser()), filter, null, mHandler);
    }

    public boolean isActiveTile() {
@@ -106,6 +117,7 @@ public class TileServiceManager {
    }

    public void handleDestroy() {
        mServices.getContext().unregisterReceiver(mUninstallReceiver);
        mStateManager.handleDestroy();
    }

@@ -198,4 +210,23 @@ public class TileServiceManager {
            mServices.recalculateBindAllowance();
        }
    };

    private final BroadcastReceiver mUninstallReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (!Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
                return;
            }
            if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
                return;
            }
            Uri data = intent.getData();
            String pkgName = data.getEncodedSchemeSpecificPart();
            final ComponentName component = mStateManager.getComponent();
            if (!Objects.equal(pkgName, component.getPackageName())) {
                return;
            }
            mServices.getHost().removeTile(component);
        }
    };
}
+5 −0
Original line number Diff line number Diff line
@@ -72,6 +72,10 @@ public class TileServices extends IQSService.Stub {
        return mContext;
    }

    public QSTileHost getHost() {
        return mHost;
    }

    public TileServiceManager getTileWrapper(CustomTile tile) {
        ComponentName component = tile.getComponent();
        TileServiceManager service = onCreateTileService(component);
@@ -89,6 +93,7 @@ public class TileServices extends IQSService.Stub {
    public void freeService(CustomTile tile, TileServiceManager service) {
        synchronized (mServices) {
            service.setBindAllowed(false);
            service.handleDestroy();
            mServices.remove(tile);
            mTiles.remove(tile.getComponent());
            final String slot = tile.getComponent().getClassName();