diff options
4 files changed, 141 insertions, 10 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index b3565eab79c9..c55280dc1c3e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -16,6 +16,7 @@ package com.android.settingslib.wifi; +import android.annotation.Nullable; import android.app.AppGlobals; import android.content.Context; import android.content.pm.ApplicationInfo; @@ -639,6 +640,13 @@ public class AccessPoint implements Comparable<AccessPoint> { // Update to new summary StringBuilder summary = new StringBuilder(); + // TODO(b/62354743): Standardize and international delimiter usage + final String concatenator = " / "; + + if (mBadge != NetworkBadging.BADGING_NONE) { + summary.append(getSpeedLabel() + concatenator); + } + if (isActive() && config != null && config.isPasspoint()) { // This is the active connection on passpoint summary.append(getSummary(mContext, getDetailedState(), @@ -718,6 +726,14 @@ public class AccessPoint implements Comparable<AccessPoint> { } } } + + // Strip trailing delimiter if applicable + int concatLength = concatenator.length(); + if (summary.length() >= concatLength && summary.substring( + summary.length() - concatLength, summary.length()).equals(concatenator)) { + summary.delete(summary.length() - concatLength, summary.length()); + } + return summary.toString(); } @@ -745,8 +761,12 @@ public class AccessPoint implements Comparable<AccessPoint> { visibility.append(" rssi=").append(mInfo.getRssi()); visibility.append(" "); visibility.append(" score=").append(mInfo.score); - visibility.append(" rankingScore=").append(getRankingScore()); - visibility.append(" badge=").append(getBadge()); + if (mRankingScore != Integer.MIN_VALUE) { + visibility.append(" rankingScore=").append(getRankingScore()); + } + if (mBadge != NetworkBadging.BADGING_NONE) { + visibility.append(" speed=").append(getSpeedLabel()); + } visibility.append(String.format(" tx=%.1f,", mInfo.txSuccessRate)); visibility.append(String.format("%.1f,", mInfo.txRetriesRate)); visibility.append(String.format("%.1f ", mInfo.txBadRate)); @@ -1042,8 +1062,21 @@ public class AccessPoint implements Comparable<AccessPoint> { return mRankingScore; } - int getBadge() { - return mBadge; + int getBadge() { return mBadge;} + + @Nullable + String getSpeedLabel() { + switch (mBadge) { + case NetworkBadging.BADGING_4K: + return mContext.getString(R.string.speed_label_very_fast); + case NetworkBadging.BADGING_HD: + return mContext.getString(R.string.speed_label_fast); + case NetworkBadging.BADGING_SD: + return mContext.getString(R.string.speed_label_okay); + case NetworkBadging.BADGING_NONE: + default: + return null; + } } /** Return true if the current RSSI is reachable, and false otherwise. */ diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java index 5361b4302b0d..f37590ec8c63 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java @@ -162,7 +162,10 @@ public class AccessPointPreference extends Preference { return; } TronUtils.logWifiSettingsBadge(context, mWifiBadge); - Drawable drawable = NetworkBadging.getWifiIcon(level, mWifiBadge, getContext().getTheme()); + + // TODO(b/62355275): Revert this to N code after deleting NetworkBadging API + Drawable drawable = NetworkBadging.getWifiIcon( + level, NetworkBadging.BADGING_NONE, getContext().getTheme()); if (!mForSavedNetworks && drawable != null) { drawable.setTint(Utils.getColorAttr(context, android.R.attr.colorControlNormal)); setIcon(drawable); diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java index 801844be87cd..9abdf88d42fb 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java @@ -19,12 +19,17 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.when; import android.content.Context; import android.net.ConnectivityManager; +import android.net.NetworkBadging; import android.net.NetworkInfo; +import android.net.NetworkKey; +import android.net.RssiCurve; import android.net.ScoredNetwork; +import android.net.WifiKey; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; @@ -40,6 +45,8 @@ import android.support.test.runner.AndroidJUnit4; import android.text.SpannableString; import android.text.style.TtsSpan; +import com.android.settingslib.R; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -55,7 +62,8 @@ public class AccessPointTest { private static final String TEST_SSID = "test_ssid"; private Context mContext; - @Mock private WifiNetworkScoreCache mWifiNetworkScoreCache; + @Mock private RssiCurve mockBadgeCurve; + @Mock private WifiNetworkScoreCache mockWifiNetworkScoreCache; @Before public void setUp() { @@ -294,13 +302,13 @@ public class AccessPointTest { public void testIsMetered_returnTrueWhenScoredNetworkIsMetered() { AccessPoint ap = createAccessPointWithScanResultCache(); - when(mWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) + when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) .thenReturn( new ScoredNetwork( null /* NetworkKey */, null /* rssiCurve */, true /* metered */)); - ap.update(mWifiNetworkScoreCache, false /* scoringUiEnabled */); + ap.update(mockWifiNetworkScoreCache, false /* scoringUiEnabled */); assertThat(ap.isMetered()).isTrue(); } @@ -321,6 +329,91 @@ public class AccessPointTest { assertThat(accessPoint.isMetered()).isFalse(); } + @Test + public void testSpeedLabel_returnsVeryFastWhen4kBadgeIsSet() { + AccessPoint ap = createAccessPointWithScanResultCache(); + + when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) + .thenReturn(buildScoredNetworkWithMockBadgeCurve()); + when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) NetworkBadging.BADGING_4K); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + assertThat(ap.getBadge()).isEqualTo(NetworkBadging.BADGING_4K); + assertThat(ap.getSpeedLabel()) + .isEqualTo(mContext.getString(R.string.speed_label_very_fast)); + } + + @Test + public void testSpeedLabel_returnsFastWhenHdBadgeIsSet() { + AccessPoint ap = createAccessPointWithScanResultCache(); + + when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) + .thenReturn(buildScoredNetworkWithMockBadgeCurve()); + when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) NetworkBadging.BADGING_HD); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + assertThat(ap.getBadge()).isEqualTo(NetworkBadging.BADGING_HD); + assertThat(ap.getSpeedLabel()) + .isEqualTo(mContext.getString(R.string.speed_label_fast)); + } + + @Test + public void testSpeedLabel_returnsOkayWhenSdBadgeIsSet() { + AccessPoint ap = createAccessPointWithScanResultCache(); + + when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) + .thenReturn(buildScoredNetworkWithMockBadgeCurve()); + when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) NetworkBadging.BADGING_SD); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + assertThat(ap.getBadge()).isEqualTo(NetworkBadging.BADGING_SD); + assertThat(ap.getSpeedLabel()) + .isEqualTo(mContext.getString(R.string.speed_label_okay)); + } + + @Test + public void testSummaryString_showsSpeedLabel() { + AccessPoint ap = createAccessPointWithScanResultCache(); + + when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) + .thenReturn(buildScoredNetworkWithMockBadgeCurve()); + when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) NetworkBadging.BADGING_4K); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + assertThat(ap.getSummary()).isEqualTo(mContext.getString(R.string.speed_label_very_fast)); + } + + @Test + public void testSummaryString_concatenatesSpeedLabel() { + AccessPoint ap = createAccessPointWithScanResultCache(); + ap.update(new WifiConfiguration()); + + when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) + .thenReturn(buildScoredNetworkWithMockBadgeCurve()); + when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) NetworkBadging.BADGING_4K); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + String expectedString = mContext.getString(R.string.speed_label_very_fast) + " / " + + mContext.getString(R.string.wifi_remembered); + assertThat(ap.getSummary()).isEqualTo(expectedString); + } + + private ScoredNetwork buildScoredNetworkWithMockBadgeCurve() { + Bundle attr1 = new Bundle(); + attr1.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, mockBadgeCurve); + return new ScoredNetwork( + new NetworkKey(new WifiKey("\"ssid\"", "00:00:00:00:00:00")), + mockBadgeCurve, + false /* meteredHint */, + attr1); + + } + private AccessPoint createAccessPointWithScanResultCache() { Bundle bundle = new Bundle(); ArrayList<ScanResult> scanResults = new ArrayList<>(); @@ -333,7 +426,7 @@ public class AccessPointTest { scanResults.add(scanResult); } - bundle.putParcelableArrayList("key_scanresultcache", scanResults); + bundle.putParcelableArrayList(AccessPoint.KEY_SCANRESULTCACHE, scanResults); return new AccessPoint(mContext, bundle); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index 18cc8721ff95..22192db95c76 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -28,6 +28,7 @@ import android.graphics.drawable.Animatable; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; +import android.net.NetworkBadging; import android.telephony.SubscriptionInfo; import android.util.ArraySet; import android.util.AttributeSet; @@ -581,10 +582,11 @@ public class SignalClusterView extends LinearLayout implements NetworkController */ private void setBadgedWifiIconForView(ImageView imageView, @DrawableRes int wifiPieId, @DrawableRes int badgeId) { + // TODO(sghuman): Delete this method and revert to N badging logic // Using the imageView's context to retrieve the Drawable so that theme is preserved.; LayerDrawable icon = new LayerDrawable(new Drawable[] { imageView.getContext().getDrawable(wifiPieId), - imageView.getContext().getDrawable(badgeId)}); + imageView.getContext().getDrawable(NetworkBadging.BADGING_NONE)}); // The LayerDrawable shares an underlying state so we must mutate the object to change the // color between the light and dark themes. |