Make QSTileImpl a LifecycleOwner and make use of it
Test: existing tests pass
Change-Id: I6ac1fd46b74d8eb48c83af3883c7fdcd2cb0f628
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index cc27135..e1a4378 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -14,6 +14,9 @@
package com.android.systemui.qs.tileimpl;
+import static androidx.lifecycle.Lifecycle.State.DESTROYED;
+import static androidx.lifecycle.Lifecycle.State.RESUMED;
+
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_CLICK;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_LONG_PRESS;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_SECONDARY_CLICK;
@@ -38,6 +41,11 @@
import android.util.Log;
import android.util.SparseArray;
+import androidx.annotation.NonNull;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleRegistry;
+
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.settingslib.RestrictedLockUtils;
@@ -66,7 +74,7 @@
*
* @param <TState> see above
*/
-public abstract class QSTileImpl<TState extends State> implements QSTile {
+public abstract class QSTileImpl<TState extends State> implements QSTile, LifecycleOwner {
protected final String TAG = "Tile." + getClass().getSimpleName();
protected static final boolean DEBUG = Log.isLoggable("Tile", Log.DEBUG);
@@ -94,6 +102,8 @@
private boolean mShowingDetail;
private int mIsFullQs;
+ private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this);
+
public abstract TState newTileState();
abstract protected void handleClick();
@@ -113,6 +123,12 @@
mContext = host.getContext();
}
+ @NonNull
+ @Override
+ public Lifecycle getLifecycle() {
+ return mLifecycle;
+ }
+
/**
* Adds or removes a listening client for the tile. If the tile has one or more
* listening client it will go into the listening state.
@@ -341,12 +357,14 @@
if (listening) {
if (mListeners.add(listener) && mListeners.size() == 1) {
if (DEBUG) Log.d(TAG, "handleSetListening true");
+ mLifecycle.markState(RESUMED);
handleSetListening(listening);
refreshState(); // Ensure we get at least one refresh after listening.
}
} else {
if (mListeners.remove(listener) && mListeners.size() == 0) {
if (DEBUG) Log.d(TAG, "handleSetListening false");
+ mLifecycle.markState(DESTROYED);
handleSetListening(listening);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
index 219565e..7f76900b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
@@ -45,6 +45,7 @@
public BatterySaverTile(QSHost host, BatteryController batteryController) {
super(host);
mBatteryController = batteryController;
+ mBatteryController.observe(getLifecycle(), this);
}
@Override
@@ -59,11 +60,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (listening) {
- mBatteryController.addCallback(this);
- } else {
- mBatteryController.removeCallback(this);
- }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
index 49fd75b..5b85498 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
@@ -68,6 +68,7 @@
mController = bluetoothController;
mActivityStarter = activityStarter;
mDetailAdapter = (BluetoothDetailAdapter) createDetailAdapter();
+ mController.observe(getLifecycle(), mCallback);
}
@Override
@@ -82,11 +83,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (listening) {
- mController.addCallback(mCallback);
- } else {
- mController.removeCallback(mCallback);
- }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
index fa4c210..f05ac4c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
@@ -75,6 +75,9 @@
mKeyguard = keyguardMonitor;
mNetworkController = networkController;
mActivityStarter = activityStarter;
+ mController.observe(this, mCallback);
+ mKeyguard.observe(this, mCallback);
+ mNetworkController.observe(this, mSignalCallback);
}
@Override
@@ -90,15 +93,8 @@
@Override
public void handleSetListening(boolean listening) {
if (DEBUG) Log.d(TAG, "handleSetListening " + listening);
- if (listening) {
- mController.addCallback(mCallback);
- mKeyguard.addCallback(mCallback);
- mNetworkController.addCallback(mSignalCallback);
- } else {
+ if (!listening) {
mController.setDiscovering(false);
- mController.removeCallback(mCallback);
- mKeyguard.removeCallback(mCallback);
- mNetworkController.removeCallback(mSignalCallback);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index bed2e8b..1155a41 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -73,6 +73,7 @@
mKeyguardMonitor = keyguardMonitor;
mDataController = mController.getMobileDataController();
mDetailAdapter = new CellularDetailAdapter();
+ mController.observe(getLifecycle(), mSignalCallback);
}
@Override
@@ -87,11 +88,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (listening) {
- mController.addCallback(mSignalCallback);
- } else {
- mController.removeCallback(mSignalCallback);
- }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
index a078a3e..c6c6f87 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
@@ -40,6 +40,7 @@
public DataSaverTile(QSHost host, NetworkController networkController) {
super(host);
mDataSaverController = networkController.getDataSaverController();
+ mDataSaverController.observe(getLifecycle(), this);
}
@Override
@@ -49,11 +50,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (listening) {
- mDataSaverController.addCallback(this);
- } else {
- mDataSaverController.removeCallback(this);
- }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index 7ab23c6..5f04e56 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -92,6 +92,7 @@
mDetailAdapter = new DndDetailAdapter();
mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_SET_VISIBLE));
mReceiverRegistered = true;
+ mController.observe(getLifecycle(), mZenCallback);
}
@Override
@@ -286,10 +287,8 @@
if (mListening == listening) return;
mListening = listening;
if (mListening) {
- mController.addCallback(mZenCallback);
Prefs.registerListener(mContext, mPrefListener);
} else {
- mController.removeCallback(mZenCallback);
Prefs.unregisterListener(mContext, mPrefListener);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
index bad09d3..dfa3fb9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java
@@ -42,6 +42,7 @@
public FlashlightTile(QSHost host, FlashlightController flashlightController) {
super(host);
mFlashlightController = flashlightController;
+ mFlashlightController.observe(getLifecycle(), this);
}
@Override
@@ -58,11 +59,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (listening) {
- mFlashlightController.addCallback(this);
- } else {
- mFlashlightController.removeCallback(this);
- }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
index 72916ed..b7e07f8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
@@ -61,6 +61,8 @@
refreshState();
}
};
+ mHotspotController.observe(this, mCallbacks);
+ mDataSaverController.observe(this, mCallbacks);
}
@Override
@@ -83,12 +85,7 @@
if (mListening == listening) return;
mListening = listening;
if (listening) {
- mHotspotController.addCallback(mCallbacks);
- mDataSaverController.addCallback(mCallbacks);
refreshState();
- } else {
- mHotspotController.removeCallback(mCallbacks);
- mDataSaverController.removeCallback(mCallbacks);
}
mAirplaneMode.setListening(listening);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
index b57bf4b..d740033 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java
@@ -52,6 +52,8 @@
mController = locationController;
mKeyguard = keyguardMonitor;
mActivityStarter = activityStarter;
+ mController.observe(this, mCallback);
+ mKeyguard.observe(this, mCallback);
}
@Override
@@ -61,13 +63,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (listening) {
- mController.addCallback(mCallback);
- mKeyguard.addCallback(mCallback);
- } else {
- mController.removeCallback(mCallback);
- mKeyguard.removeCallback(mCallback);
- }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
index e3c6d36..21f3d6e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
@@ -43,6 +43,7 @@
public RotationLockTile(QSHost host, RotationLockController rotationLockController) {
super(host);
mController = rotationLockController;
+ mController.observe(this, mCallback);
}
@Override
@@ -51,11 +52,6 @@
}
public void handleSetListening(boolean listening) {
- if (listening) {
- mController.addCallback(mCallback);
- } else {
- mController.removeCallback(mCallback);
- }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
index bbf7efc..7c1ffde 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
@@ -44,6 +44,7 @@
super(host);
mUserSwitcherController = userSwitcherController;
mUserInfoController = userInfoController;
+ mUserInfoController.observe(getLifecycle(), this);
}
@Override
@@ -73,11 +74,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (listening) {
- mUserInfoController.addCallback(this);
- } else {
- mUserInfoController.removeCallback(this);
- }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index c5a4fda..52a8814 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -73,6 +73,7 @@
mWifiController = mController.getAccessPointController();
mDetailAdapter = (WifiDetailAdapter) createDetailAdapter();
mActivityStarter = activityStarter;
+ mController.observe(getLifecycle(), mSignalCallback);
}
@Override
@@ -82,11 +83,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (listening) {
- mController.addCallback(mSignalCallback);
- } else {
- mController.removeCallback(mSignalCallback);
- }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
index 972fc9e..f921eb9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java
@@ -41,6 +41,7 @@
public WorkModeTile(QSHost host, ManagedProfileController managedProfileController) {
super(host);
mProfileController = managedProfileController;
+ mProfileController.observe(getLifecycle(), this);
}
@Override
@@ -50,11 +51,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (listening) {
- mProfileController.addCallback(this);
- } else {
- mProfileController.removeCallback(this);
- }
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java
index 40fcbef..efcbb76 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java
@@ -16,6 +16,7 @@
import static junit.framework.TestCase.assertEquals;
+import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -25,6 +26,8 @@
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import androidx.lifecycle.LifecycleOwner;
+
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.ActivityStarter;
@@ -88,7 +91,8 @@
mCastTile.handleSetListening(true);
ArgumentCaptor<NetworkController.SignalCallback> signalCallbackArgumentCaptor =
ArgumentCaptor.forClass(NetworkController.SignalCallback.class);
- verify(mNetworkController).addCallback(signalCallbackArgumentCaptor.capture());
+ verify(mNetworkController).observe(any(LifecycleOwner.class),
+ signalCallbackArgumentCaptor.capture());
mCallback = signalCallbackArgumentCaptor.getValue();
}