From 174baaccc7ff8a621e10815f69d952375a226b82 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Wed, 12 Aug 2020 17:01:54 +0800 Subject: [PATCH] [Wi-Fi] Show Pie+x Wi-Fi icon when a connected Wi-Fi is not default route From Android 11, a connected Wi-Fi network may not be default route if rating provider thinks it has bad connection quality. Framework service will keep the Wi-Fi connection but uses other connection as default route. This change shows Pie+x Wi-Fi icon for a connected Wi-Fi network which is not default route. Bug: 163627176 Test: make RunSettingsLibRoboTests ROBOTEST_FILTER=WifiEntryPreferenceTest make RunSettingsLibRoboTests ROBOTEST_FILTER=com.android.settingslib.UtilsTest Change-Id: Ia9c98db59a5eb61ae22a5e9249d1219443876e16 --- .../res/drawable/ic_show_x_wifi_signal_0.xml | 31 ++++++ .../res/drawable/ic_show_x_wifi_signal_1.xml | 27 +++++ .../res/drawable/ic_show_x_wifi_signal_2.xml | 27 +++++ .../res/drawable/ic_show_x_wifi_signal_3.xml | 27 +++++ .../res/drawable/ic_show_x_wifi_signal_4.xml | 27 +++++ .../src/com/android/settingslib/Utils.java | 32 ++++-- .../settingslib/wifi/WifiEntryPreference.java | 20 ++-- .../wifi/WifiEntryPreferenceTest.java | 98 ++++++++++++++++++- 8 files changed, 272 insertions(+), 17 deletions(-) create mode 100644 packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_0.xml create mode 100644 packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_1.xml create mode 100644 packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_2.xml create mode 100644 packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_3.xml create mode 100644 packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_4.xml diff --git a/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_0.xml b/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_0.xml new file mode 100644 index 0000000000000..16e91903084fb --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_0.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_1.xml b/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_1.xml new file mode 100644 index 0000000000000..4c338c9681941 --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_1.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_2.xml b/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_2.xml new file mode 100644 index 0000000000000..79037dbccf2dc --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_2.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_3.xml b/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_3.xml new file mode 100644 index 0000000000000..21ad128f81ff5 --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_3.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_4.xml b/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_4.xml new file mode 100644 index 0000000000000..2ec5ba30cdc37 --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_show_x_wifi_signal_4.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java index a43412e116c85..b2808061586be 100644 --- a/packages/SettingsLib/src/com/android/settingslib/Utils.java +++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java @@ -49,11 +49,19 @@ public class Utils { private static String sSharedSystemSharedLibPackageName; static final int[] WIFI_PIE = { - com.android.internal.R.drawable.ic_wifi_signal_0, - com.android.internal.R.drawable.ic_wifi_signal_1, - com.android.internal.R.drawable.ic_wifi_signal_2, - com.android.internal.R.drawable.ic_wifi_signal_3, - com.android.internal.R.drawable.ic_wifi_signal_4 + com.android.internal.R.drawable.ic_wifi_signal_0, + com.android.internal.R.drawable.ic_wifi_signal_1, + com.android.internal.R.drawable.ic_wifi_signal_2, + com.android.internal.R.drawable.ic_wifi_signal_3, + com.android.internal.R.drawable.ic_wifi_signal_4 + }; + + static final int[] SHOW_X_WIFI_PIE = { + R.drawable.ic_show_x_wifi_signal_0, + R.drawable.ic_show_x_wifi_signal_1, + R.drawable.ic_show_x_wifi_signal_2, + R.drawable.ic_show_x_wifi_signal_3, + R.drawable.ic_show_x_wifi_signal_4 }; public static void updateLocationEnabled(Context context, boolean enabled, int userId, @@ -353,10 +361,22 @@ public class Utils { * @throws IllegalArgumentException if an invalid RSSI level is given. */ public static int getWifiIconResource(int level) { + return getWifiIconResource(false /* showX */, level); + } + + /** + * Returns the Wifi icon resource for a given RSSI level. + * + * @param showX True if a connected Wi-Fi network has the problem which should show Pie+x + * signal icon to users. + * @param level The number of bars to show (0-4) + * @throws IllegalArgumentException if an invalid RSSI level is given. + */ + public static int getWifiIconResource(boolean showX, int level) { if (level < 0 || level >= WIFI_PIE.length) { throw new IllegalArgumentException("No Wifi icon found for level: " + level); } - return WIFI_PIE[level]; + return showX ? SHOW_X_WIFI_PIE[level] : WIFI_PIE[level]; } public static int getDefaultStorageManagerDaysToRetain(Resources resources) { diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEntryPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEntryPreference.java index a53bc9f966d2b..bba69f29a2907 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEntryPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEntryPreference.java @@ -35,6 +35,7 @@ import androidx.preference.PreferenceViewHolder; import com.android.settingslib.R; import com.android.settingslib.Utils; import com.android.wifitrackerlib.WifiEntry; +import com.android.wifitrackerlib.WifiEntry.ConnectedInfo; /** * Preference to display a WifiEntry in a wifi picker. @@ -64,6 +65,7 @@ public class WifiEntryPreference extends Preference implements WifiEntry.WifiEnt private final IconInjector mIconInjector; private WifiEntry mWifiEntry; private int mLevel = -1; + private boolean mShowX; // Shows the Wi-Fi signl icon of Pie+x when it's true. private CharSequence mContentDescription; private OnButtonClickListener mOnButtonClickListener; @@ -136,9 +138,15 @@ public class WifiEntryPreference extends Preference implements WifiEntry.WifiEnt public void refresh() { setTitle(mWifiEntry.getTitle()); final int level = mWifiEntry.getLevel(); - if (level != mLevel) { + final ConnectedInfo connectedInfo = mWifiEntry.getConnectedInfo(); + boolean showX = false; + if (connectedInfo != null) { + showX = !connectedInfo.isDefaultNetwork || !connectedInfo.isValidated; + } + if (level != mLevel || showX != mShowX) { mLevel = level; - updateIcon(mLevel); + mShowX = showX; + updateIcon(mShowX, mLevel); notifyChanged(); } @@ -184,13 +192,13 @@ public class WifiEntryPreference extends Preference implements WifiEntry.WifiEnt } - private void updateIcon(int level) { + private void updateIcon(boolean showX, int level) { if (level == -1) { setIcon(null); return; } - final Drawable drawable = mIconInjector.getIcon(level); + final Drawable drawable = mIconInjector.getIcon(showX, level); if (drawable != null) { drawable.setTintList(Utils.getColorAttr(getContext(), android.R.attr.colorControlNormal)); @@ -260,8 +268,8 @@ public class WifiEntryPreference extends Preference implements WifiEntry.WifiEnt mContext = context; } - public Drawable getIcon(int level) { - return mContext.getDrawable(Utils.getWifiIconResource(level)); + public Drawable getIcon(boolean showX, int level) { + return mContext.getDrawable(Utils.getWifiIconResource(showX, level)); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEntryPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEntryPreferenceTest.java index 46e699d3bed5f..40af7dc797b39 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEntryPreferenceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEntryPreferenceTest.java @@ -17,6 +17,7 @@ package com.android.settingslib.wifi; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.content.Context; @@ -29,6 +30,7 @@ import androidx.preference.PreferenceViewHolder; import com.android.settingslib.R; import com.android.wifitrackerlib.WifiEntry; +import com.android.wifitrackerlib.WifiEntry.ConnectedInfo; import org.junit.Before; import org.junit.Test; @@ -62,6 +64,17 @@ public class WifiEntryPreferenceTest { @Mock private Drawable mMockDrawable4; + @Mock + private Drawable mMockShowXDrawable0; + @Mock + private Drawable mMockShowXDrawable1; + @Mock + private Drawable mMockShowXDrawable2; + @Mock + private Drawable mMockShowXDrawable3; + @Mock + private Drawable mMockShowXDrawable4; + private static final String MOCK_TITLE = "title"; private static final String MOCK_SUMMARY = "summary"; private static final String FAKE_URI_STRING = "fakeuri"; @@ -75,11 +88,22 @@ public class WifiEntryPreferenceTest { when(mMockWifiEntry.getTitle()).thenReturn(MOCK_TITLE); when(mMockWifiEntry.getSummary(false /* concise */)).thenReturn(MOCK_SUMMARY); - when(mMockIconInjector.getIcon(0)).thenReturn(mMockDrawable0); - when(mMockIconInjector.getIcon(1)).thenReturn(mMockDrawable1); - when(mMockIconInjector.getIcon(2)).thenReturn(mMockDrawable2); - when(mMockIconInjector.getIcon(3)).thenReturn(mMockDrawable3); - when(mMockIconInjector.getIcon(4)).thenReturn(mMockDrawable4); + when(mMockIconInjector.getIcon(false /* showX */, 0)).thenReturn(mMockDrawable0); + when(mMockIconInjector.getIcon(false /* showX */, 1)).thenReturn(mMockDrawable1); + when(mMockIconInjector.getIcon(false /* showX */, 2)).thenReturn(mMockDrawable2); + when(mMockIconInjector.getIcon(false /* showX */, 3)).thenReturn(mMockDrawable3); + when(mMockIconInjector.getIcon(false /* showX */, 4)).thenReturn(mMockDrawable4); + + when(mMockIconInjector.getIcon(true /* showX */, 0)) + .thenReturn(mMockShowXDrawable0); + when(mMockIconInjector.getIcon(true /* showX */, 1)) + .thenReturn(mMockShowXDrawable1); + when(mMockIconInjector.getIcon(true /* showX */, 2)) + .thenReturn(mMockShowXDrawable2); + when(mMockIconInjector.getIcon(true /* showX */, 3)) + .thenReturn(mMockShowXDrawable3); + when(mMockIconInjector.getIcon(true /* showX */, 4)) + .thenReturn(mMockShowXDrawable4); } @Test @@ -154,6 +178,70 @@ public class WifiEntryPreferenceTest { mMockDrawable2, mMockDrawable3, mMockDrawable4, null); } + @Test + public void levelChanged_notDefaultWifiRefresh_shouldUpdateLevelIcon() { + final List iconList = new ArrayList<>(); + final ConnectedInfo mockConnectedInfo = mock(ConnectedInfo.class); + mockConnectedInfo.isDefaultNetwork = false; + when(mMockWifiEntry.getConnectedInfo()).thenReturn(mockConnectedInfo); + final WifiEntryPreference pref = + new WifiEntryPreference(mContext, mMockWifiEntry, mMockIconInjector); + + when(mMockWifiEntry.getLevel()).thenReturn(0); + pref.refresh(); + iconList.add(pref.getIcon()); + when(mMockWifiEntry.getLevel()).thenReturn(1); + pref.refresh(); + iconList.add(pref.getIcon()); + when(mMockWifiEntry.getLevel()).thenReturn(2); + pref.refresh(); + iconList.add(pref.getIcon()); + when(mMockWifiEntry.getLevel()).thenReturn(3); + pref.refresh(); + iconList.add(pref.getIcon()); + when(mMockWifiEntry.getLevel()).thenReturn(4); + pref.refresh(); + iconList.add(pref.getIcon()); + when(mMockWifiEntry.getLevel()).thenReturn(-1); + pref.refresh(); + iconList.add(pref.getIcon()); + + assertThat(iconList).containsExactly(mMockShowXDrawable0, mMockShowXDrawable1, + mMockShowXDrawable2, mMockShowXDrawable3, mMockShowXDrawable4, null); + } + + @Test + public void levelChanged_notValidatedWifiRefresh_shouldUpdateLevelIcon() { + final List iconList = new ArrayList<>(); + final ConnectedInfo mockConnectedInfo = mock(ConnectedInfo.class); + mockConnectedInfo.isValidated = false; + when(mMockWifiEntry.getConnectedInfo()).thenReturn(mockConnectedInfo); + final WifiEntryPreference pref = + new WifiEntryPreference(mContext, mMockWifiEntry, mMockIconInjector); + + when(mMockWifiEntry.getLevel()).thenReturn(0); + pref.refresh(); + iconList.add(pref.getIcon()); + when(mMockWifiEntry.getLevel()).thenReturn(1); + pref.refresh(); + iconList.add(pref.getIcon()); + when(mMockWifiEntry.getLevel()).thenReturn(2); + pref.refresh(); + iconList.add(pref.getIcon()); + when(mMockWifiEntry.getLevel()).thenReturn(3); + pref.refresh(); + iconList.add(pref.getIcon()); + when(mMockWifiEntry.getLevel()).thenReturn(4); + pref.refresh(); + iconList.add(pref.getIcon()); + when(mMockWifiEntry.getLevel()).thenReturn(-1); + pref.refresh(); + iconList.add(pref.getIcon()); + + assertThat(iconList).containsExactly(mMockShowXDrawable0, mMockShowXDrawable1, + mMockShowXDrawable2, mMockShowXDrawable3, mMockShowXDrawable4, null); + } + @Test public void notNull_whenGetHelpUriString_shouldSetImageButtonVisible() { when(mMockWifiEntry.getHelpUriString()).thenReturn(FAKE_URI_STRING);