summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java27
2 files changed, 32 insertions, 6 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
index 16b11580a176..87d6307ffce2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
@@ -134,9 +134,14 @@ public class TileLifecycleManager extends BroadcastReceiver implements
}
if (DEBUG) Log.d(TAG, "Binding service " + mIntent + " " + mUser);
mBindTryCount++;
- mIsBound = mContext.bindServiceAsUser(mIntent, this,
- Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
- mUser);
+ try {
+ mIsBound = mContext.bindServiceAsUser(mIntent, this,
+ Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
+ mUser);
+ } catch (SecurityException e) {
+ Log.e(TAG, "Failed to bind to service", e);
+ mIsBound = false;
+ }
} else {
if (DEBUG) Log.d(TAG, "Unbinding service " + mIntent + " " + mUser);
// Give it another chance next time it needs to be bound, out of kindness.
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
index 82a5622ddf18..ce9bbf42679a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
@@ -21,13 +21,20 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.service.quicksettings.IQSTileService;
+import android.service.quicksettings.TileService;
import android.support.annotation.VisibleForTesting;
import android.util.Log;
+
import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener;
+
+import java.util.List;
+
import libcore.util.Objects;
/**
@@ -222,15 +229,29 @@ public class TileServiceManager {
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;
}
+
+ // If the package is being updated, verify the component still exists.
+ if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
+ Intent queryIntent = new Intent(TileService.ACTION_QS_TILE);
+ queryIntent.setPackage(pkgName);
+ PackageManager pm = context.getPackageManager();
+ List<ResolveInfo> services = pm.queryIntentServicesAsUser(
+ queryIntent, 0, ActivityManager.getCurrentUser());
+ for (ResolveInfo info : services) {
+ if (Objects.equal(info.serviceInfo.packageName, component.getPackageName())
+ && Objects.equal(info.serviceInfo.name, component.getClassName())) {
+ return;
+ }
+ }
+ }
+
mServices.getHost().removeTile(component);
}
};