Make QSTileImpl a LifecycleOwner and make use of it
Test: existing tests pass Change-Id: I6ac1fd46b74d8eb48c83af3883c7fdcd2cb0f628
This commit is contained in:
@@ -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.ArraySet;
|
||||
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 @@ import java.util.ArrayList;
|
||||
*
|
||||
* @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 @@ public abstract class QSTileImpl<TState extends State> implements QSTile {
|
||||
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 @@ public abstract class QSTileImpl<TState extends State> implements QSTile {
|
||||
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 @@ public abstract class QSTileImpl<TState extends State> implements QSTile {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements
|
||||
public BatterySaverTile(QSHost host, BatteryController batteryController) {
|
||||
super(host);
|
||||
mBatteryController = batteryController;
|
||||
mBatteryController.observe(getLifecycle(), this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -59,11 +60,6 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements
|
||||
|
||||
@Override
|
||||
public void handleSetListening(boolean listening) {
|
||||
if (listening) {
|
||||
mBatteryController.addCallback(this);
|
||||
} else {
|
||||
mBatteryController.removeCallback(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -68,6 +68,7 @@ public class BluetoothTile extends QSTileImpl<BooleanState> {
|
||||
mController = bluetoothController;
|
||||
mActivityStarter = activityStarter;
|
||||
mDetailAdapter = (BluetoothDetailAdapter) createDetailAdapter();
|
||||
mController.observe(getLifecycle(), mCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -82,11 +83,6 @@ public class BluetoothTile extends QSTileImpl<BooleanState> {
|
||||
|
||||
@Override
|
||||
public void handleSetListening(boolean listening) {
|
||||
if (listening) {
|
||||
mController.addCallback(mCallback);
|
||||
} else {
|
||||
mController.removeCallback(mCallback);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -75,6 +75,9 @@ public class CastTile extends QSTileImpl<BooleanState> {
|
||||
mKeyguard = keyguardMonitor;
|
||||
mNetworkController = networkController;
|
||||
mActivityStarter = activityStarter;
|
||||
mController.observe(this, mCallback);
|
||||
mKeyguard.observe(this, mCallback);
|
||||
mNetworkController.observe(this, mSignalCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -90,15 +93,8 @@ public class CastTile extends QSTileImpl<BooleanState> {
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -73,6 +73,7 @@ public class CellularTile extends QSTileImpl<SignalState> {
|
||||
mKeyguardMonitor = keyguardMonitor;
|
||||
mDataController = mController.getMobileDataController();
|
||||
mDetailAdapter = new CellularDetailAdapter();
|
||||
mController.observe(getLifecycle(), mSignalCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -87,11 +88,6 @@ public class CellularTile extends QSTileImpl<SignalState> {
|
||||
|
||||
@Override
|
||||
public void handleSetListening(boolean listening) {
|
||||
if (listening) {
|
||||
mController.addCallback(mSignalCallback);
|
||||
} else {
|
||||
mController.removeCallback(mSignalCallback);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -40,6 +40,7 @@ public class DataSaverTile extends QSTileImpl<BooleanState> implements
|
||||
public DataSaverTile(QSHost host, NetworkController networkController) {
|
||||
super(host);
|
||||
mDataSaverController = networkController.getDataSaverController();
|
||||
mDataSaverController.observe(getLifecycle(), this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -49,11 +50,6 @@ public class DataSaverTile extends QSTileImpl<BooleanState> implements
|
||||
|
||||
@Override
|
||||
public void handleSetListening(boolean listening) {
|
||||
if (listening) {
|
||||
mDataSaverController.addCallback(this);
|
||||
} else {
|
||||
mDataSaverController.removeCallback(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -92,6 +92,7 @@ public class DndTile extends QSTileImpl<BooleanState> {
|
||||
mDetailAdapter = new DndDetailAdapter();
|
||||
mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_SET_VISIBLE));
|
||||
mReceiverRegistered = true;
|
||||
mController.observe(getLifecycle(), mZenCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -286,10 +287,8 @@ public class DndTile extends QSTileImpl<BooleanState> {
|
||||
if (mListening == listening) return;
|
||||
mListening = listening;
|
||||
if (mListening) {
|
||||
mController.addCallback(mZenCallback);
|
||||
Prefs.registerListener(mContext, mPrefListener);
|
||||
} else {
|
||||
mController.removeCallback(mZenCallback);
|
||||
Prefs.unregisterListener(mContext, mPrefListener);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ public class FlashlightTile extends QSTileImpl<BooleanState> implements
|
||||
public FlashlightTile(QSHost host, FlashlightController flashlightController) {
|
||||
super(host);
|
||||
mFlashlightController = flashlightController;
|
||||
mFlashlightController.observe(getLifecycle(), this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -58,11 +59,6 @@ public class FlashlightTile extends QSTileImpl<BooleanState> implements
|
||||
|
||||
@Override
|
||||
public void handleSetListening(boolean listening) {
|
||||
if (listening) {
|
||||
mFlashlightController.addCallback(this);
|
||||
} else {
|
||||
mFlashlightController.removeCallback(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -61,6 +61,8 @@ public class HotspotTile extends QSTileImpl<AirplaneBooleanState> {
|
||||
refreshState();
|
||||
}
|
||||
};
|
||||
mHotspotController.observe(this, mCallbacks);
|
||||
mDataSaverController.observe(this, mCallbacks);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -83,12 +85,7 @@ public class HotspotTile extends QSTileImpl<AirplaneBooleanState> {
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -52,6 +52,8 @@ public class LocationTile extends QSTileImpl<BooleanState> {
|
||||
mController = locationController;
|
||||
mKeyguard = keyguardMonitor;
|
||||
mActivityStarter = activityStarter;
|
||||
mController.observe(this, mCallback);
|
||||
mKeyguard.observe(this, mCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -61,13 +63,6 @@ public class LocationTile extends QSTileImpl<BooleanState> {
|
||||
|
||||
@Override
|
||||
public void handleSetListening(boolean listening) {
|
||||
if (listening) {
|
||||
mController.addCallback(mCallback);
|
||||
mKeyguard.addCallback(mCallback);
|
||||
} else {
|
||||
mController.removeCallback(mCallback);
|
||||
mKeyguard.removeCallback(mCallback);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -43,6 +43,7 @@ public class RotationLockTile extends QSTileImpl<BooleanState> {
|
||||
public RotationLockTile(QSHost host, RotationLockController rotationLockController) {
|
||||
super(host);
|
||||
mController = rotationLockController;
|
||||
mController.observe(this, mCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -51,11 +52,6 @@ public class RotationLockTile extends QSTileImpl<BooleanState> {
|
||||
}
|
||||
|
||||
public void handleSetListening(boolean listening) {
|
||||
if (listening) {
|
||||
mController.addCallback(mCallback);
|
||||
} else {
|
||||
mController.removeCallback(mCallback);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -44,6 +44,7 @@ public class UserTile extends QSTileImpl<State> implements UserInfoController.On
|
||||
super(host);
|
||||
mUserSwitcherController = userSwitcherController;
|
||||
mUserInfoController = userInfoController;
|
||||
mUserInfoController.observe(getLifecycle(), this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -73,11 +74,6 @@ public class UserTile extends QSTileImpl<State> implements UserInfoController.On
|
||||
|
||||
@Override
|
||||
public void handleSetListening(boolean listening) {
|
||||
if (listening) {
|
||||
mUserInfoController.addCallback(this);
|
||||
} else {
|
||||
mUserInfoController.removeCallback(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -73,6 +73,7 @@ public class WifiTile extends QSTileImpl<SignalState> {
|
||||
mWifiController = mController.getAccessPointController();
|
||||
mDetailAdapter = (WifiDetailAdapter) createDetailAdapter();
|
||||
mActivityStarter = activityStarter;
|
||||
mController.observe(getLifecycle(), mSignalCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -82,11 +83,6 @@ public class WifiTile extends QSTileImpl<SignalState> {
|
||||
|
||||
@Override
|
||||
public void handleSetListening(boolean listening) {
|
||||
if (listening) {
|
||||
mController.addCallback(mSignalCallback);
|
||||
} else {
|
||||
mController.removeCallback(mSignalCallback);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -41,6 +41,7 @@ public class WorkModeTile extends QSTileImpl<BooleanState> implements
|
||||
public WorkModeTile(QSHost host, ManagedProfileController managedProfileController) {
|
||||
super(host);
|
||||
mProfileController = managedProfileController;
|
||||
mProfileController.observe(getLifecycle(), this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -50,11 +51,6 @@ public class WorkModeTile extends QSTileImpl<BooleanState> implements
|
||||
|
||||
@Override
|
||||
public void handleSetListening(boolean listening) {
|
||||
if (listening) {
|
||||
mProfileController.addCallback(this);
|
||||
} else {
|
||||
mProfileController.removeCallback(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -16,6 +16,7 @@ package com.android.systemui.qs.tiles;
|
||||
|
||||
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.support.test.filters.SmallTest;
|
||||
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 @@ public class CastTileTest extends SysuiTestCase {
|
||||
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();
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user