diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java | 32 |
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) { |