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:
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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) {
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user