From 27a1b76fdcb975ae371a1bd98739514bbf2eab18 Mon Sep 17 00:00:00 2001 From: Eric Schwarzenbach Date: Mon, 7 Aug 2017 13:19:50 -0700 Subject: [PATCH 1/2] Remove references to NetworkBadging. Removes all references to the deprecated NetworkBadging class. Replaces Badging enums with AccessPoint.Speed. Uses SettingsLib Utils class to get the WifiIcons. Note: This change depends on ag/2676505. Bug: 62355275 Test: make -j40 RunSettingsRoboTests Change-Id: If3301ce30e22a7b2cc4d534b0a89e6d7ddfef45b --- .../WifiDetailPreferenceController.java | 43 +++++++++++++--- .../details/WifiNetworkDetailsFragment.java | 3 +- .../src/android/net/NetworkBadging.java | 49 ------------------- .../WifiDetailPreferenceControllerTest.java | 11 +++-- 4 files changed, 45 insertions(+), 61 deletions(-) delete mode 100644 tests/robotests/src/android/net/NetworkBadging.java diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java index 90c17c35daa..35d60336d40 100644 --- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java +++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java @@ -30,7 +30,6 @@ import android.net.ConnectivityManager.NetworkCallback; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.Network; -import android.net.NetworkBadging; import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.NetworkRequest; @@ -46,8 +45,6 @@ import android.support.v7.preference.PreferenceCategory; import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; import android.util.Log; -import android.view.View; -import android.widget.Button; import android.widget.ImageView; import com.android.internal.annotations.VisibleForTesting; @@ -142,6 +139,7 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController private PreferenceCategory mIpv6Category; private Preference mIpv6AddressPref; + private final IconInjector mIconInjector; private final IntentFilter mFilter; private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override @@ -198,7 +196,7 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController } }; - public WifiDetailPreferenceController( + public static WifiDetailPreferenceController newInstance( AccessPoint accessPoint, ConnectivityManagerWrapper connectivityManagerWrapper, Context context, @@ -207,6 +205,22 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController Lifecycle lifecycle, WifiManager wifiManager, MetricsFeatureProvider metricsFeatureProvider) { + return new WifiDetailPreferenceController( + accessPoint, connectivityManagerWrapper, context, fragment, handler, lifecycle, + wifiManager, metricsFeatureProvider, new IconInjector(context)); + } + + @VisibleForTesting + /* package */ WifiDetailPreferenceController( + AccessPoint accessPoint, + ConnectivityManagerWrapper connectivityManagerWrapper, + Context context, + Fragment fragment, + Handler handler, + Lifecycle lifecycle, + WifiManager wifiManager, + MetricsFeatureProvider metricsFeatureProvider, + IconInjector injector) { super(context); mAccessPoint = accessPoint; @@ -218,11 +232,11 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController mWifiConfig = accessPoint.getConfig(); mWifiManager = wifiManager; mMetricsFeatureProvider = metricsFeatureProvider; + mIconInjector = injector; mFilter = new IntentFilter(); mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); - lifecycle.addObserver(this); } @@ -369,8 +383,7 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController private void refreshRssiViews() { int iconSignalLevel = WifiManager.calculateSignalLevel( mRssi, WifiManager.RSSI_LEVELS); - Drawable wifiIcon = NetworkBadging.getWifiIcon( - iconSignalLevel, NetworkBadging.BADGING_NONE, mContext.getTheme()).mutate(); + Drawable wifiIcon = mIconInjector.getIcon(iconSignalLevel); wifiIcon.setTint(Utils.getColorAccent(mContext)); mEntityHeaderController.setIcon(wifiIcon).done(mFragment.getActivity(), true /* rebind */); @@ -501,4 +514,20 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController mFragment.getActivity(), MetricsProto.MetricsEvent.ACTION_WIFI_SIGNIN); mConnectivityManagerWrapper.startCaptivePortalApp(mNetwork); } + + /** + * Wrapper for testing compatibility. + */ + @VisibleForTesting + static class IconInjector { + private final Context mContext; + + public IconInjector(Context context) { + mContext = context; + } + + public Drawable getIcon(int level) { + return mContext.getDrawable(Utils.getWifiIconResource(level)).mutate(); + } + } } diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java index 8145d7790b2..4918889ff9d 100644 --- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java +++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java @@ -25,6 +25,7 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.vpn2.ConnectivityManagerWrapperImpl; +import com.android.settings.wifi.WifiDetailPreference; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.wifi.AccessPoint; import java.util.ArrayList; @@ -72,7 +73,7 @@ public class WifiNetworkDetailsFragment extends DashboardFragment { @Override protected List getPreferenceControllers(Context context) { ConnectivityManager cm = context.getSystemService(ConnectivityManager.class); - mWifiDetailPreferenceController = new WifiDetailPreferenceController( + mWifiDetailPreferenceController = WifiDetailPreferenceController.newInstance( mAccessPoint, new ConnectivityManagerWrapperImpl(cm), context, diff --git a/tests/robotests/src/android/net/NetworkBadging.java b/tests/robotests/src/android/net/NetworkBadging.java deleted file mode 100644 index f2af08b0590..00000000000 --- a/tests/robotests/src/android/net/NetworkBadging.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2017 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. - */ -package android.net; - -import android.annotation.IntDef; -import android.annotation.Nullable; -import android.content.res.Resources; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Implementation for {@link android.net.NetworkBadging}. - * - *

Can be removed once Robolectric supports Android O. - */ -public class NetworkBadging { - @IntDef({BADGING_NONE, BADGING_SD, BADGING_HD, BADGING_4K}) - @Retention(RetentionPolicy.SOURCE) - public @interface Badging {} - - public static final int BADGING_NONE = 0; - public static final int BADGING_SD = 10; - public static final int BADGING_HD = 20; - public static final int BADGING_4K = 30; - - private static Drawable drawable; - - public static Drawable getWifiIcon( - int signalLevel, @NetworkBadging.Badging int badging, @Nullable Resources.Theme theme) { - return new ColorDrawable(Color.GREEN); - } -} diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java index 793c07fe682..dc51fd83547 100644 --- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java @@ -16,6 +16,7 @@ package com.android.settings.wifi.details; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Matchers.any; @@ -30,6 +31,7 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; @@ -37,7 +39,6 @@ import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.Network; -import android.net.NetworkBadging; import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.NetworkRequest; @@ -112,6 +113,7 @@ public class WifiDetailPreferenceControllerTest { @Mock private WifiNetworkDetailsFragment mockFragment; @Mock private WifiManager mockWifiManager; @Mock private MetricsFeatureProvider mockMetricsFeatureProvider; + @Mock private WifiDetailPreferenceController.IconInjector mockIconInjector; @Mock (answer = Answers.RETURNS_DEEP_STUBS) private EntityHeaderController mockHeaderController; @@ -229,6 +231,7 @@ public class WifiDetailPreferenceControllerTest { when(mockHeaderController.setRecyclerView(mockFragment.getListView(), mLifecycle)) .thenReturn(mockHeaderController); when(mockHeaderController.setSummary(anyString())).thenReturn(mockHeaderController); + when(mockIconInjector.getIcon(anyInt())).thenReturn(new ColorDrawable()); setupMockedPreferenceScreen(); mController = newWifiDetailPreferenceController(); @@ -243,7 +246,8 @@ public class WifiDetailPreferenceControllerTest { null, // Handler mLifecycle, mockWifiManager, - mockMetricsFeatureProvider); + mockMetricsFeatureProvider, + mockIconInjector); } private void setupMockedPreferenceScreen() { @@ -332,8 +336,7 @@ public class WifiDetailPreferenceControllerTest { @Test public void entityHeader_shouldHaveIconSet() { - Drawable expectedIcon = - NetworkBadging.getWifiIcon(LEVEL, NetworkBadging.BADGING_NONE, mContext.getTheme()); + Drawable expectedIcon = mockIconInjector.getIcon(LEVEL); displayAndResume(); From 36717d4399f1aa58e5d870092d33427878c58d56 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 15 Aug 2017 11:00:04 -0700 Subject: [PATCH 2/2] Compute aspect ratio properly Change-Id: Ic4e1f20f7354b9ab5f4e9c7564d16d06324ec23d Fixes: 64608152 Test: visual --- res/layout/video_preference.xml | 2 +- .../widget/AspectRatioFrameLayout.java | 24 ++++- .../widget/AspectRatioFrameLayoutTest.java | 100 ++++++++++++++++++ 3 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/widget/AspectRatioFrameLayoutTest.java diff --git a/res/layout/video_preference.xml b/res/layout/video_preference.xml index 8b0e6198083..9ab52ae46f3 100644 --- a/res/layout/video_preference.xml +++ b/res/layout/video_preference.xml @@ -28,7 +28,7 @@ 0) { + width = (int) (height * mAspectRatio); + } else { + height = (int) (width / mAspectRatio); + } + super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); } } diff --git a/tests/robotests/src/com/android/settings/widget/AspectRatioFrameLayoutTest.java b/tests/robotests/src/com/android/settings/widget/AspectRatioFrameLayoutTest.java new file mode 100644 index 00000000000..dd6138cea50 --- /dev/null +++ b/tests/robotests/src/com/android/settings/widget/AspectRatioFrameLayoutTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2017 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. + */ + +package com.android.settings.widget; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.view.View; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class AspectRatioFrameLayoutTest { + + private Context mContext; + private AspectRatioFrameLayout mLayout; + + @Before + public void setup() { + mContext = RuntimeEnvironment.application; + } + + @Test + public void measure_squareAspectRatio_stretchHeight() { + mLayout = new AspectRatioFrameLayout(mContext); + + int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(50, View.MeasureSpec.EXACTLY); + + mLayout.measure(widthMeasureSpec, heightMeasureSpec); + + assertThat(mLayout.getMeasuredWidth()).isEqualTo(100); + assertThat(mLayout.getMeasuredHeight()).isEqualTo(100); + } + + @Test + public void measure_squareAspectRatio_stretchWidth() { + mLayout = new AspectRatioFrameLayout(mContext); + + int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(50, View.MeasureSpec.EXACTLY); + int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + + mLayout.measure(widthMeasureSpec, heightMeasureSpec); + + assertThat(mLayout.getMeasuredWidth()).isEqualTo(100); + assertThat(mLayout.getMeasuredHeight()).isEqualTo(100); + } + + @Test + public void measure_squareAspectRatio_doNotStretch() { + mLayout = new AspectRatioFrameLayout(mContext); + + int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + + mLayout.measure(widthMeasureSpec, heightMeasureSpec); + + assertThat(mLayout.getMeasuredWidth()).isEqualTo(100); + assertThat(mLayout.getMeasuredHeight()).isEqualTo(100); + } + + @Test + public void measure_rectangleAspectRatio_stretch() { + mLayout = new AspectRatioFrameLayout(mContext); + // Set aspect ratio to 2:1. + ReflectionHelpers.setField(mLayout, "mAspectRatio", 2f); + + int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); + + mLayout.measure(widthMeasureSpec, heightMeasureSpec); + + // Should stretch width/height to 2:1 ratio + assertThat(mLayout.getMeasuredWidth()).isEqualTo(200); + assertThat(mLayout.getMeasuredHeight()).isEqualTo(100); + } +}