Merge "[Wi-Fi] Show Pie+x Wi-Fi icon when a connected Wi-Fi is not default route" into rvc-qpr-dev

This commit is contained in:
Arc Wang
2020-08-26 05:07:08 +00:00
committed by Android (Google) Code Review
8 changed files with 272 additions and 17 deletions

View File

@@ -0,0 +1,31 @@
<!--
Copyright (C) 2020 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="25.50"
android:viewportHeight="25.50">
<group
android:translateX="0.77"
android:translateY="0.23" >
<path
android:pathData="M14,12h6.54l3.12,-3.89c0.39,-0.48 0.29,-1.19 -0.22,-1.54C21.67,5.36 17.55,3 12,3C6.44,3 2.33,5.36 0.56,6.57C0.05,6.92 -0.05,7.63 0.33,8.11L11.16,21.6c0.42,0.53 1.23,0.53 1.66,0L14,20.13V12z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M22.71,15.67l-1.83,1.83l1.83,1.83c0.38,0.38 0.38,1 0,1.38v0c-0.38,0.38 -1,0.39 -1.38,0l-1.83,-1.83l-1.83,1.83c-0.38,0.38 -1,0.38 -1.38,0l-0.01,-0.01c-0.38,-0.38 -0.38,-1 0,-1.38l1.83,-1.83l-1.82,-1.82c-0.38,-0.38 -0.38,-1 0,-1.38l0.01,-0.01c0.38,-0.38 1,-0.38 1.38,0l1.82,1.82l1.82,-1.82c0.38,-0.38 1,-0.38 1.38,0l0,0C23.09,14.67 23.09,15.29 22.71,15.67z"
android:fillColor="#FFFFFF"/>
</group>
</vector>

View File

@@ -0,0 +1,27 @@
<!--
Copyright (C) 2020 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@android:color/white"
android:pathData="M22,16.41L20.59,15l-2.09,2.09L16.41,15L15,16.41l2.09,2.09L15,20.59L16.41,22l2.09,-2.08L20.59,22L22,20.59l-2.08,-2.09L22,16.41z"/>
<path
android:fillColor="@android:color/white"
android:pathData="M12,2.01C7.25,2.01 2.97,4.09 0,7.4L7.582,16.625C7.582,16.627 7.58,16.629 7.58,16.631L11.99,22L12,22L13,20.789L13,17.641L13,13.119C12.68,13.039 12.34,13 12,13C10.601,13 9.351,13.64 8.531,14.639L2.699,7.539C5.269,5.279 8.58,4.01 12,4.01C15.42,4.01 18.731,5.279 21.301,7.539L16.811,13L19.4,13L24,7.4C21.03,4.09 16.75,2.01 12,2.01z"/>
</vector>

View File

@@ -0,0 +1,27 @@
<!--
Copyright (C) 2020 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@android:color/white"
android:pathData="M22,16.41L20.59,15l-2.09,2.09L16.41,15L15,16.41l2.09,2.09L15,20.59L16.41,22l2.09,-2.08L20.59,22L22,20.59l-2.08,-2.09L22,16.41z"/>
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C7.25,2 2.97,4.081 0,7.391L12,22L13,20.779L13,17.631L13,13L16.801,13L18,13L19.391,13L24,7.391C21.03,4.081 16.75,2 12,2zM12,4C14.747,4 17.423,4.819 19.701,6.313C20.259,6.678 20.795,7.085 21.301,7.529L17.389,12.287C16.029,10.868 14.119,9.99 12,9.99C9.88,9.99 7.969,10.869 6.609,12.289L2.699,7.529C5.269,5.269 8.58,4 12,4z"/>
</vector>

View File

@@ -0,0 +1,27 @@
<!--
Copyright (C) 2020 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@android:color/white"
android:pathData="M22,16.41L20.59,15l-2.09,2.09L16.41,15L15,16.41l2.09,2.09L15,20.59L16.41,22l2.09,-2.08L20.59,22L22,20.59l-2.08,-2.09L22,16.41z"/>
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C7.25,2 2.97,4.081 0,7.391L3.301,11.41L12,22L13,20.779L13,17.631L13,13L16.801,13L19.391,13L20.699,11.41C20.699,11.409 20.698,11.409 20.697,11.408L24,7.391C21.03,4.081 16.75,2 12,2zM12,4C15.42,4 18.731,5.269 21.301,7.529L19.35,9.9C17.43,8.1 14.86,6.99 12,6.99C9.14,6.99 6.57,8.1 4.65,9.9C4.65,9.901 4.649,9.902 4.648,9.902L2.699,7.529C5.269,5.269 8.58,4 12,4z"/>
</vector>

View File

@@ -0,0 +1,27 @@
<!--
Copyright (C) 2020 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C7.25,2 2.97,4.08 0,7.39L12,22l1,-1.22V13h6.39L24,7.39C21.03,4.08 16.75,2 12,2z"/>
<path
android:fillColor="@android:color/white"
android:pathData="M22,16.41L20.59,15l-2.09,2.09L16.41,15L15,16.41l2.09,2.09L15,20.59L16.41,22l2.09,-2.08L20.59,22L22,20.59l-2.08,-2.09L22,16.41z"/>
</vector>

View File

@@ -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) {

View File

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

View File

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