diff --git a/packages/SystemUI/res/drawable/ic_qs_screen_saver_undocked.xml b/packages/SystemUI/res/drawable/ic_qs_screen_saver_undocked.xml
new file mode 100644
index 0000000000000..1d1b4f507acf9
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_screen_saver_undocked.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java
index 22e725b41a648..bebd5803fabf9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java
@@ -61,7 +61,9 @@ import javax.inject.Named;
public class DreamTile extends QSTileImpl {
private static final String LOG_TAG = "QSDream";
- private final Icon mIcon = ResourceIcon.get(R.drawable.ic_qs_screen_saver);
+ // TODO: consider 1 animated icon instead
+ private final Icon mIconDocked = ResourceIcon.get(R.drawable.ic_qs_screen_saver);
+ private final Icon mIconUndocked = ResourceIcon.get(R.drawable.ic_qs_screen_saver_undocked);
private final IDreamManager mDreamManager;
private final BroadcastDispatcher mBroadcastDispatcher;
private final SettingObserver mEnabledSettingObserver;
@@ -70,9 +72,15 @@ public class DreamTile extends QSTileImpl {
private final boolean mDreamSupported;
private final boolean mDreamOnlyEnabledForSystemUser;
+ private boolean mIsDocked = false;
+
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_DOCK_EVENT.equals(intent.getAction())) {
+ mIsDocked = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, -1)
+ != Intent.EXTRA_DOCK_STATE_UNDOCKED;
+ }
refreshState();
}
};
@@ -126,6 +134,7 @@ public class DreamTile extends QSTileImpl {
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_DREAMING_STARTED);
filter.addAction(Intent.ACTION_DREAMING_STOPPED);
+ filter.addAction(Intent.ACTION_DOCK_EVENT);
mBroadcastDispatcher.registerReceiver(mReceiver, filter);
} else {
mBroadcastDispatcher.unregisterReceiver(mReceiver);
@@ -168,7 +177,7 @@ public class DreamTile extends QSTileImpl {
state.label = getTileLabel();
state.secondaryLabel = getActiveDreamName();
state.contentDescription = getContentDescription(state.secondaryLabel);
- state.icon = mIcon;
+ state.icon = mIsDocked ? mIconDocked : mIconUndocked;
if (getActiveDream() == null || !isScreensaverEnabled()) {
state.state = Tile.STATE_UNAVAILABLE;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java
index c2a41d5e41fbc..a13bece4b489e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java
@@ -20,12 +20,15 @@ import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
+import android.content.Intent;
import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -46,6 +49,7 @@ import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.qs.logging.QSLogger;
+import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.util.settings.FakeSettings;
import com.android.systemui.util.settings.SecureSettings;
@@ -53,6 +57,7 @@ import com.android.systemui.util.settings.SecureSettings;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -216,6 +221,30 @@ public class DreamTileTest extends SysuiTestCase {
assertFalse(supportedTileOnlySystemUser.isAvailable());
}
+ @Test
+ public void testIconDockState() {
+ final DreamTile dockedTile = constructTileForTest(true, false);
+
+ final ArgumentCaptor receiverCaptor = ArgumentCaptor.forClass(
+ BroadcastReceiver.class);
+ dockedTile.handleSetListening(true);
+ verify(mBroadcastDispatcher).registerReceiver(receiverCaptor.capture(), any());
+ final BroadcastReceiver receiver = receiverCaptor.getValue();
+
+ Intent dockIntent = new Intent(Intent.ACTION_DOCK_EVENT);
+ dockIntent.putExtra(Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_DESK);
+ receiver.onReceive(mContext, dockIntent);
+ mTestableLooper.processAllMessages();
+ assertEquals(QSTileImpl.ResourceIcon.get(R.drawable.ic_qs_screen_saver),
+ dockedTile.getState().icon);
+
+ dockIntent.putExtra(Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_UNDOCKED);
+ receiver.onReceive(mContext, dockIntent);
+ mTestableLooper.processAllMessages();
+ assertEquals(QSTileImpl.ResourceIcon.get(R.drawable.ic_qs_screen_saver_undocked),
+ dockedTile.getState().icon);
+ }
+
private void setScreensaverEnabled(boolean enabled) {
mSecureSettings.putIntForUser(Settings.Secure.SCREENSAVER_ENABLED, enabled ? 1 : 0,
DEFAULT_USER);