Make QSTileImpl a LifecycleOwner and make use of it

Test: existing tests pass
Change-Id: I6ac1fd46b74d8eb48c83af3883c7fdcd2cb0f628
This commit is contained in:
Jason Monk
2018-12-26 17:26:10 -05:00
parent c0e0e2b8a9
commit fa452ef8ff
15 changed files with 42 additions and 69 deletions

View File

@@ -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);
}
}

View File

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

View File

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

View File

@@ -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);
}
}

View File

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

View File

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

View File

@@ -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);
}
}

View File

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

View File

@@ -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);
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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();
}