Prevent removing a BR that has been removed
Make sure that Context#unregisterReceiver is only called once after the receiver is registered. Test: Secondary user with enabled CustomTile Test: atest TileLifecycleManagerTest Fixes: 145827384 Change-Id: I34171080a567a37d034fef2ee0e8c2afe28d1ff9
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user