summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java32
1 files changed, 24 insertions, 8 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 926141297add..bbff117c6f81 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
@@ -42,6 +42,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
/**
* Manages the lifecycle of a TileService.
@@ -84,7 +85,8 @@ public class TileLifecycleManager extends BroadcastReceiver implements
private int mBindTryCount;
private int mBindRetryDelay = DEFAULT_BIND_RETRY_DELAY;
private boolean mBound;
- boolean mReceiverRegistered;
+ private AtomicBoolean mPackageReceiverRegistered = new AtomicBoolean(false);
+ private AtomicBoolean mUserReceiverRegistered = new AtomicBoolean(false);
private boolean mUnbindImmediate;
private TileChangeListener mChangeListener;
// Return value from bindServiceAsUser, determines whether safe to call unbind.
@@ -274,7 +276,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements
public void handleDestroy() {
if (DEBUG) Log.d(TAG, "handleDestroy");
- if (mReceiverRegistered) {
+ if (mPackageReceiverRegistered.get() || mUserReceiverRegistered.get()) {
stopPackageListening();
}
}
@@ -310,17 +312,31 @@ public class TileLifecycleManager extends BroadcastReceiver implements
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
- mContext.registerReceiverAsUser(this, mUser, filter, null, mHandler);
+ try {
+ mPackageReceiverRegistered.set(true);
+ mContext.registerReceiverAsUser(this, mUser, filter, null, mHandler);
+ } catch (Exception ex) {
+ mPackageReceiverRegistered.set(false);
+ Log.e(TAG, "Could not register package receiver", ex);
+ }
filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED);
- mBroadcastDispatcher.registerReceiver(this, filter, mHandler, mUser);
- mReceiverRegistered = true;
+ try {
+ mUserReceiverRegistered.set(true);
+ mBroadcastDispatcher.registerReceiver(this, filter, mHandler, mUser);
+ } catch (Exception ex) {
+ mUserReceiverRegistered.set(false);
+ Log.e(TAG, "Could not register unlock receiver", ex);
+ }
}
private void stopPackageListening() {
if (DEBUG) Log.d(TAG, "stopPackageListening");
- mContext.unregisterReceiver(this);
- mBroadcastDispatcher.unregisterReceiver(this);
- mReceiverRegistered = false;
+ if (mUserReceiverRegistered.compareAndSet(true, false)) {
+ mBroadcastDispatcher.unregisterReceiver(this);
+ }
+ if (mPackageReceiverRegistered.compareAndSet(true, false)) {
+ mContext.unregisterReceiver(this);
+ }
}
public void setTileChangeListener(TileChangeListener changeListener) {