Remove QS tiles that get uninstalled

Change-Id: Ib4c7250a38c0630b0d828f1f55ce5c0dc4d3bb44
Fixes: 27893200
This commit is contained in:
Jason Monk
2016-04-11 15:30:38 -04:00
parent 726959bf76
commit 07f55a2a04
2 changed files with 36 additions and 0 deletions

View File

@@ -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);
}
};
}

View File

@@ -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();