release-request-c38dc7a9-f664-4c91-8e15-307b4f336902-for-git_pi-release-4277421 snap-temp-L88300000093613514

Change-Id: I3241995483b9d90d9c89bb1aa377fd1e4f73dfd2
This commit is contained in:
android-build-team Robot
2017-08-16 08:10:19 +00:00
7 changed files with 168 additions and 64 deletions

View File

@@ -28,7 +28,7 @@
<com.android.settings.widget.AspectRatioFrameLayout
android:layout_width="240dp"
android:layout_height="wrap_content"
android:layout_height="240dp"
android:padding="@dimen/gesture_animation_padding">
<TextureView

View File

@@ -22,12 +22,14 @@ import android.widget.FrameLayout;
import com.android.settings.R;
/**
* A {@link FrameLayout} with customizable aspect ration.
* A {@link FrameLayout} with customizable aspect ratio.
* This is used to avoid dynamically calculating the height for the frame. Default aspect
* ratio will be 1 if none is set in layout attribute.
*/
public final class AspectRatioFrameLayout extends FrameLayout {
private static final float ASPECT_RATIO_CHANGE_THREASHOLD = 0.01f;
private float mAspectRatio = 1.0f;
public AspectRatioFrameLayout(Context context) {
@@ -51,7 +53,25 @@ public final class AspectRatioFrameLayout extends FrameLayout {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, (int) (widthMeasureSpec / mAspectRatio));
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMeasuredWidth();
int height = getMeasuredHeight();
if (width == 0 || height == 0) {
return;
}
final float viewAspectRatio = (float) width / height;
final float aspectRatioDiff = mAspectRatio - viewAspectRatio;
if (Math.abs(aspectRatioDiff) <= ASPECT_RATIO_CHANGE_THREASHOLD) {
// Close enough, skip.
return;
}
if (aspectRatioDiff > 0) {
width = (int) (height * mAspectRatio);
} else {
height = (int) (width / mAspectRatio);
}
super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
}
}

View File

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

View File

@@ -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<AbstractPreferenceController> getPreferenceControllers(Context context) {
ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
mWifiDetailPreferenceController = new WifiDetailPreferenceController(
mWifiDetailPreferenceController = WifiDetailPreferenceController.newInstance(
mAccessPoint,
new ConnectivityManagerWrapperImpl(cm),
context,

View File

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

View File

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

View File

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