Merge "AutoTileManager: Auto add cast tile when the device is casting."
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
index c9be2c8..007c50c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
@@ -25,6 +25,8 @@
import com.android.systemui.qs.AutoAddTracker;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.qs.SecureSetting;
+import com.android.systemui.statusbar.policy.CastController;
+import com.android.systemui.statusbar.policy.CastController.CastDevice;
import com.android.systemui.statusbar.policy.DataSaverController;
import com.android.systemui.statusbar.policy.DataSaverController.Listener;
import com.android.systemui.statusbar.policy.HotspotController;
@@ -42,6 +44,7 @@
public static final String INVERSION = "inversion";
public static final String WORK = "work";
public static final String NIGHT = "night";
+ public static final String CAST = "cast";
private final Context mContext;
private final QSTileHost mHost;
@@ -51,6 +54,7 @@
private final DataSaverController mDataSaverController;
private final ManagedProfileController mManagedProfileController;
private final NightDisplayListener mNightDisplayListener;
+ private final CastController mCastController;
@Inject
public AutoTileManager(Context context, AutoAddTracker autoAddTracker, QSTileHost host,
@@ -58,7 +62,8 @@
HotspotController hotspotController,
DataSaverController dataSaverController,
ManagedProfileController managedProfileController,
- NightDisplayListener nightDisplayListener) {
+ NightDisplayListener nightDisplayListener,
+ CastController castController) {
mAutoTracker = autoAddTracker;
mContext = context;
mHost = host;
@@ -67,6 +72,7 @@
mDataSaverController = dataSaverController;
mManagedProfileController = managedProfileController;
mNightDisplayListener = nightDisplayListener;
+ mCastController = castController;
if (!mAutoTracker.isAdded(HOTSPOT)) {
hotspotController.addCallback(mHotspotCallback);
}
@@ -95,6 +101,9 @@
&& ColorDisplayManager.isNightDisplayAvailable(mContext)) {
nightDisplayListener.setCallback(mNightDisplayCallback);
}
+ if (!mAutoTracker.isAdded(CAST)) {
+ castController.addCallback(mCastCallback);
+ }
}
public void destroy() {
@@ -108,6 +117,7 @@
if (ColorDisplayManager.isNightDisplayAvailable(mContext)) {
mNightDisplayListener.setCallback(null);
}
+ mCastController.removeCallback(mCastCallback);
}
public void unmarkTileAsAutoAdded(String tabSpec) {
@@ -181,4 +191,27 @@
mHandler.post(() -> mNightDisplayListener.setCallback(null));
}
};
+
+ @VisibleForTesting
+ final CastController.Callback mCastCallback = new CastController.Callback() {
+ @Override
+ public void onCastDevicesChanged() {
+ if (mAutoTracker.isAdded(CAST)) return;
+
+ boolean isCasting = false;
+ for (CastDevice device : mCastController.getCastDevices()) {
+ if (device.state == CastDevice.STATE_CONNECTED
+ || device.state == CastDevice.STATE_CONNECTING) {
+ isCasting = true;
+ break;
+ }
+ }
+
+ if (isCasting) {
+ mHost.addTile(CAST);
+ mAutoTracker.setTileAdded(CAST);
+ mHandler.post(() -> mCastController.removeCallback(mCastCallback));
+ }
+ }
+ };
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
index f3740c4..87699b8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.phone;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -31,6 +32,8 @@
import com.android.systemui.SysuiTestCase;
import com.android.systemui.qs.AutoAddTracker;
import com.android.systemui.qs.QSTileHost;
+import com.android.systemui.statusbar.policy.CastController;
+import com.android.systemui.statusbar.policy.CastController.CastDevice;
import com.android.systemui.statusbar.policy.DataSaverController;
import com.android.systemui.statusbar.policy.HotspotController;
@@ -40,6 +43,9 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.Collections;
+import java.util.Set;
+
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@SmallTest
@@ -47,6 +53,7 @@
@Mock private QSTileHost mQsTileHost;
@Mock private AutoAddTracker mAutoAddTracker;
+ @Mock private CastController mCastController;
private AutoTileManager mAutoTileManager;
@@ -58,7 +65,8 @@
mock(HotspotController.class),
mock(DataSaverController.class),
mock(ManagedProfileController.class),
- mock(NightDisplayListener.class));
+ mock(NightDisplayListener.class),
+ mCastController);
}
@Test
@@ -108,4 +116,24 @@
ColorDisplayManager.AUTO_MODE_DISABLED);
verify(mQsTileHost, never()).addTile("night");
}
+
+ private static Set<CastDevice> buildFakeCastDevice(boolean isCasting) {
+ CastDevice cd = new CastDevice();
+ cd.state = isCasting ? CastDevice.STATE_CONNECTED : CastDevice.STATE_DISCONNECTED;
+ return Collections.singleton(cd);
+ }
+
+ @Test
+ public void castTileAdded_whenDeviceIsCasting() {
+ doReturn(buildFakeCastDevice(true)).when(mCastController).getCastDevices();
+ mAutoTileManager.mCastCallback.onCastDevicesChanged();
+ verify(mQsTileHost).addTile("cast");
+ }
+
+ @Test
+ public void castTileNotAdded_whenDeviceIsNotCasting() {
+ doReturn(buildFakeCastDevice(false)).when(mCastController).getCastDevices();
+ mAutoTileManager.mCastCallback.onCastDevicesChanged();
+ verify(mQsTileHost, never()).addTile("cast");
+ }
}