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