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:
Fabian Kozynski
2019-12-16 16:11:46 -05:00
parent 6b7926d1fc
commit bb846712d0

View File

@@ -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) {