diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java | 11 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java | 27 |
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); } }; |