From 110e5f6c169bed3d0312ed5003833bd12d562455 Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Fri, 31 Mar 2017 13:45:12 -0400 Subject: [PATCH] QS: Add transient animations for bluetooth and wifi Test: runtest systemui Change-Id: I04a81e1b36a6595bfb102603ad07b079c8b0ee77 Fixes: 26781226 --- .../settingslib/wifi/WifiStatusTracker.java | 9 ++ ..._bluetooth_transient_group_1_animation.xml | 59 +++++++++++ ..._bluetooth_transient_group_2_animation.xml | 52 ++++++++++ ...signal_wifi_transient_wifi_1_animation.xml | 66 +++++++++++++ .../res/drawable/ic_bluetooth_transient.xml | 97 +++++++++++++++++++ .../ic_bluetooth_transient_animation.xml | 11 +++ .../res/drawable/ic_signal_wifi_transient.xml | 39 ++++++++ .../ic_signal_wifi_transient_animation.xml | 8 ++ ...oth_transient_animation_interpolator_0.xml | 4 + .../systemui/qs/tiles/BluetoothTile.java | 7 +- .../systemui/qs/tiles/CellularTile.java | 2 +- .../android/systemui/qs/tiles/WifiTile.java | 12 ++- .../systemui/statusbar/SignalClusterView.java | 2 +- .../statusbar/policy/CallbackHandler.java | 4 +- .../statusbar/policy/NetworkController.java | 4 +- .../policy/WifiSignalController.java | 12 ++- .../statusbar/policy/CallbackHandlerTest.java | 6 +- .../policy/NetworkControllerWifiTest.java | 8 +- 18 files changed, 381 insertions(+), 21 deletions(-) create mode 100644 packages/SystemUI/res/anim/ic_bluetooth_transient_group_1_animation.xml create mode 100644 packages/SystemUI/res/anim/ic_bluetooth_transient_group_2_animation.xml create mode 100644 packages/SystemUI/res/anim/ic_signal_wifi_transient_wifi_1_animation.xml create mode 100644 packages/SystemUI/res/drawable/ic_bluetooth_transient.xml create mode 100644 packages/SystemUI/res/drawable/ic_bluetooth_transient_animation.xml create mode 100644 packages/SystemUI/res/drawable/ic_signal_wifi_transient.xml create mode 100644 packages/SystemUI/res/drawable/ic_signal_wifi_transient_animation.xml create mode 100644 packages/SystemUI/res/interpolator/ic_bluetooth_transient_animation_interpolator_0.xml diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java index 6f52dcace323c..ec94841c7d0de 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java @@ -26,7 +26,9 @@ public class WifiStatusTracker { private final WifiManager mWifiManager; public boolean enabled; + public int state; public boolean connected; + public boolean connecting; public String ssid; public int rssi; public int level; @@ -39,11 +41,18 @@ public class WifiStatusTracker { public void handleBroadcast(Intent intent) { String action = intent.getAction(); if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { + state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, + WifiManager.WIFI_STATE_UNKNOWN); + enabled = state == WifiManager.WIFI_STATE_ENABLED; + + enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED; } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { final NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); + connecting = networkInfo != null && !networkInfo.isConnected() + && networkInfo.isConnectedOrConnecting(); connected = networkInfo != null && networkInfo.isConnected(); WifiInfo info = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO) != null ? (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO) diff --git a/packages/SystemUI/res/anim/ic_bluetooth_transient_group_1_animation.xml b/packages/SystemUI/res/anim/ic_bluetooth_transient_group_1_animation.xml new file mode 100644 index 0000000000000..26c6aa706cbf0 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_bluetooth_transient_group_1_animation.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/anim/ic_bluetooth_transient_group_2_animation.xml b/packages/SystemUI/res/anim/ic_bluetooth_transient_group_2_animation.xml new file mode 100644 index 0000000000000..e1f8989b9a217 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_bluetooth_transient_group_2_animation.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/anim/ic_signal_wifi_transient_wifi_1_animation.xml b/packages/SystemUI/res/anim/ic_signal_wifi_transient_wifi_1_animation.xml new file mode 100644 index 0000000000000..919a4ddd4f08b --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_wifi_transient_wifi_1_animation.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/ic_bluetooth_transient.xml b/packages/SystemUI/res/drawable/ic_bluetooth_transient.xml new file mode 100644 index 0000000000000..76026af392ec6 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_bluetooth_transient.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/ic_bluetooth_transient_animation.xml b/packages/SystemUI/res/drawable/ic_bluetooth_transient_animation.xml new file mode 100644 index 0000000000000..f7eb23c1c89d2 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_bluetooth_transient_animation.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/packages/SystemUI/res/drawable/ic_signal_wifi_transient.xml b/packages/SystemUI/res/drawable/ic_signal_wifi_transient.xml new file mode 100644 index 0000000000000..880e1bb075c79 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_signal_wifi_transient.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/ic_signal_wifi_transient_animation.xml b/packages/SystemUI/res/drawable/ic_signal_wifi_transient_animation.xml new file mode 100644 index 0000000000000..9f5aaebaf650e --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_signal_wifi_transient_animation.xml @@ -0,0 +1,8 @@ + + + + diff --git a/packages/SystemUI/res/interpolator/ic_bluetooth_transient_animation_interpolator_0.xml b/packages/SystemUI/res/interpolator/ic_bluetooth_transient_animation_interpolator_0.xml new file mode 100644 index 0000000000000..c421f9e9e81cf --- /dev/null +++ b/packages/SystemUI/res/interpolator/ic_bluetooth_transient_animation_interpolator_0.xml @@ -0,0 +1,4 @@ + + diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java index 4e4de15567d4e..75e9d5ab063b3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java @@ -114,7 +114,8 @@ public class BluetoothTile extends QSTileImpl { protected void handleUpdateState(BooleanState state, Object arg) { final boolean enabled = mController.isBluetoothEnabled(); final boolean connected = mController.isBluetoothConnected(); - final boolean connecting = mController.isBluetoothConnecting(); + state.isTransient = mController.isBluetoothConnecting() + || mController.getBluetoothState() == BluetoothAdapter.STATE_TURNING_ON; state.dualTarget = true; state.value = enabled; if (enabled) { @@ -124,8 +125,8 @@ public class BluetoothTile extends QSTileImpl { state.label = mController.getLastDeviceName(); state.contentDescription = mContext.getString( R.string.accessibility_bluetooth_name, state.label); - } else if (connecting) { - state.icon = ResourceIcon.get(R.drawable.ic_qs_bluetooth_connecting); + } else if (state.isTransient) { + state.icon = ResourceIcon.get(R.drawable.ic_bluetooth_transient_animation); state.contentDescription = mContext.getString( R.string.accessibility_quick_settings_bluetooth_connecting); state.label = mContext.getString(R.string.quick_settings_bluetooth_label); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 04be7de644e3a..9b3ee30a3ab07 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -180,7 +180,7 @@ public class CellularTile extends QSTileImpl { private final CallbackInfo mInfo = new CallbackInfo(); @Override public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, - boolean activityIn, boolean activityOut, String description) { + boolean activityIn, boolean activityOut, String description, boolean isTransient) { mInfo.wifiEnabled = enabled; refreshState(mInfo); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java index 79b4c4a875965..7d2d210727ba0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java @@ -157,7 +157,10 @@ public class WifiTile extends QSTileImpl { state.activityOut = cb.enabled && cb.activityOut; final StringBuffer minimalContentDescription = new StringBuffer(); final Resources r = mContext.getResources(); - if (!state.value) { + if (cb.isTransient) { + state.icon = ResourceIcon.get(R.drawable.ic_signal_wifi_transient_animation); + state.label = r.getString(R.string.quick_settings_wifi_label); + } else if (!state.value) { state.icon = ResourceIcon.get(R.drawable.ic_qs_wifi_disabled); state.label = r.getString(R.string.quick_settings_wifi_label); } else if (wifiConnected) { @@ -182,7 +185,7 @@ public class WifiTile extends QSTileImpl { state.dualLabelContentDescription = r.getString( R.string.accessibility_quick_settings_open_settings, getTileLabel()); state.expandedAccessibilityClassName = Switch.class.getName(); - state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; + state.state = state.value || cb.isTransient ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; } @Override @@ -226,6 +229,7 @@ public class WifiTile extends QSTileImpl { boolean activityIn; boolean activityOut; String wifiSignalContentDescription; + boolean isTransient; @Override public String toString() { @@ -237,6 +241,7 @@ public class WifiTile extends QSTileImpl { .append(",activityIn=").append(activityIn) .append(",activityOut=").append(activityOut) .append(",wifiSignalContentDescription=").append(wifiSignalContentDescription) + .append(",isTransient=").append(isTransient) .append(']').toString(); } } @@ -246,7 +251,7 @@ public class WifiTile extends QSTileImpl { @Override public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, - boolean activityIn, boolean activityOut, String description) { + boolean activityIn, boolean activityOut, String description, boolean isTransient) { if (DEBUG) Log.d(TAG, "onWifiSignalChanged enabled=" + enabled); mInfo.enabled = enabled; mInfo.connected = qsIcon.visible; @@ -255,6 +260,7 @@ public class WifiTile extends QSTileImpl { mInfo.activityIn = activityIn; mInfo.activityOut = activityOut; mInfo.wifiSignalContentDescription = qsIcon.contentDescription; + mInfo.isTransient = isTransient; refreshState(mInfo); } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index 67be99e5cccac..88711febe18d0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -266,7 +266,7 @@ public class SignalClusterView extends LinearLayout implements NetworkController @Override public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, - boolean activityIn, boolean activityOut, String description) { + boolean activityIn, boolean activityOut, String description, boolean isTransient) { mWifiVisible = statusIcon.visible && !mBlockWifi; mWifiStrengthId = statusIcon.icon; mWifiBadgeId = statusIcon.iconOverlay; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java index 5ab99e9e5bceb..a456786d712f6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java @@ -109,13 +109,13 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa @Override public void setWifiIndicators(final boolean enabled, final IconState statusIcon, final IconState qsIcon, final boolean activityIn, final boolean activityOut, - final String description) { + final String description, boolean isTransient) { post(new Runnable() { @Override public void run() { for (SignalCallback callback : mSignalCallbacks) { callback.setWifiIndicators(enabled, statusIcon, qsIcon, activityIn, activityOut, - description); + description, isTransient); } } }); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index 5657560174158..c02ce0ea6335e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -19,12 +19,10 @@ package com.android.systemui.statusbar.policy; import android.content.Context; import android.content.Intent; import android.telephony.SubscriptionInfo; -import android.view.View; import com.android.settingslib.net.DataUsageController; import com.android.settingslib.wifi.AccessPoint; import com.android.systemui.DemoMode; -import com.android.systemui.Dumpable; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; import java.util.List; @@ -48,7 +46,7 @@ public interface NetworkController extends CallbackController, D public interface SignalCallback { default void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, - boolean activityIn, boolean activityOut, String description) {} + boolean activityIn, boolean activityOut, String description, boolean isTransient) {} default void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java index 12b70983dba38..2104cb1421aa6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java @@ -150,7 +150,7 @@ public class WifiSignalController extends Utils.getWifiBadgeResource(mCurrentState.badgeEnum), contentDescription); callback.setWifiIndicators(mCurrentState.enabled, statusIcon, qsIcon, ssidPresent && mCurrentState.activityIn, ssidPresent && mCurrentState.activityOut, - wifiDesc); + wifiDesc, mCurrentState.isTransient); } @Override @@ -170,6 +170,9 @@ public class WifiSignalController extends mWifiTracker.handleBroadcast(intent); updateScoreCacheIfNecessary(previousNetworkKey); + mCurrentState.isTransient = mWifiTracker.state == WifiManager.WIFI_STATE_ENABLING + || mWifiTracker.state == WifiManager.WIFI_AP_STATE_DISABLING + || mWifiTracker.connecting; mCurrentState.enabled = mWifiTracker.enabled; mCurrentState.connected = mWifiTracker.connected; mCurrentState.ssid = mWifiTracker.ssid; @@ -252,6 +255,7 @@ public class WifiSignalController extends static class WifiState extends SignalController.State { String ssid; int badgeEnum; + boolean isTransient; @Override public void copyFrom(State s) { @@ -259,19 +263,23 @@ public class WifiSignalController extends WifiState state = (WifiState) s; ssid = state.ssid; badgeEnum = state.badgeEnum; + isTransient = state.isTransient; } @Override protected void toString(StringBuilder builder) { super.toString(builder); builder.append(',').append("ssid=").append(ssid); + builder.append(',').append("badgeEnum=").append(badgeEnum); + builder.append(',').append("isTransient=").append(isTransient); } @Override public boolean equals(Object o) { return super.equals(o) && Objects.equals(((WifiState) o).ssid, ssid) - && (((WifiState) o).badgeEnum == badgeEnum); + && (((WifiState) o).badgeEnum == badgeEnum) + && (((WifiState) o).isTransient == isTransient); } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java index b544d9df1292e..3ed1681644f28 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java @@ -79,7 +79,7 @@ public class CallbackHandlerTest { boolean in = true; boolean out = true; String description = "Test"; - mHandler.setWifiIndicators(enabled, status, qs, in, out, description); + mHandler.setWifiIndicators(enabled, status, qs, in, out, description, true); waitForCallbacks(); ArgumentCaptor enableArg = ArgumentCaptor.forClass(Boolean.class); @@ -88,15 +88,17 @@ public class CallbackHandlerTest { ArgumentCaptor inArg = ArgumentCaptor.forClass(Boolean.class); ArgumentCaptor outArg = ArgumentCaptor.forClass(Boolean.class); ArgumentCaptor descArg = ArgumentCaptor.forClass(String.class); + ArgumentCaptor isTransient = ArgumentCaptor.forClass(Boolean.class); Mockito.verify(mSignalCallback).setWifiIndicators(enableArg.capture(), statusArg.capture(), qsArg.capture(), inArg.capture(), outArg.capture(), - descArg.capture()); + descArg.capture(), isTransient.capture()); assertEquals(enabled, (boolean) enableArg.getValue()); assertEquals(status, statusArg.getValue()); assertEquals(qs, qsArg.getValue()); assertEquals(in, (boolean) inArg.getValue()); assertEquals(out, (boolean) outArg.getValue()); assertEquals(description, descArg.getValue()); + assertTrue(isTransient.getValue()); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java index efa232bb33af7..483a8371b85bf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java @@ -122,7 +122,7 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { ArgumentCaptor iconArg = ArgumentCaptor.forClass(IconState.class); Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators( anyBoolean(), iconArg.capture(), any(), anyBoolean(), anyBoolean(), - any()); + any(), anyBoolean()); IconState iconState = iconArg.getValue(); assertEquals("Badged Wifi Resource is set", @@ -269,7 +269,7 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { ArgumentCaptor outArg = ArgumentCaptor.forClass(Boolean.class); Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators( - anyBoolean(), any(), any(), inArg.capture(), outArg.capture(), any()); + anyBoolean(), any(), any(), inArg.capture(), outArg.capture(), any(), anyBoolean()); assertEquals("WiFi data in, in quick settings", in, (boolean) inArg.getValue()); assertEquals("WiFi data out, in quick settings", out, (boolean) outArg.getValue()); } @@ -282,7 +282,7 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators( enabledArg.capture(), any(), iconArg.capture(), anyBoolean(), - anyBoolean(), descArg.capture()); + anyBoolean(), descArg.capture(), anyBoolean()); IconState iconState = iconArg.getValue(); assertEquals("WiFi enabled, in quick settings", enabled, (boolean) enabledArg.getValue()); assertEquals("WiFi connected, in quick settings", connected, iconState.visible); @@ -295,7 +295,7 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators( anyBoolean(), iconArg.capture(), any(), anyBoolean(), anyBoolean(), - any()); + any(), anyBoolean()); IconState iconState = iconArg.getValue(); assertEquals("WiFi visible, in status bar", visible, iconState.visible); assertEquals("WiFi signal, in status bar", icon, iconState.icon);