Merge "Add a broadcast receiver to WifiDetailsPreferenceController." into oc-dev

This commit is contained in:
TreeHugger Robot
2017-04-13 17:08:39 +00:00
committed by Android (Google) Code Review
3 changed files with 159 additions and 49 deletions

View File

@@ -15,7 +15,11 @@
*/ */
package com.android.settings.wifi.details; package com.android.settings.wifi.details;
import android.app.Fragment;
import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.IpPrefix; import android.net.IpPrefix;
@@ -39,6 +43,7 @@ import com.android.settings.R;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
import com.android.settings.core.lifecycle.Lifecycle; import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.core.lifecycle.LifecycleObserver; import com.android.settings.core.lifecycle.LifecycleObserver;
import com.android.settings.core.lifecycle.events.OnPause;
import com.android.settings.core.lifecycle.events.OnResume; import com.android.settings.core.lifecycle.events.OnResume;
import com.android.settings.wifi.WifiDetailPreference; import com.android.settings.wifi.WifiDetailPreference;
import com.android.settingslib.wifi.AccessPoint; import com.android.settingslib.wifi.AccessPoint;
@@ -55,8 +60,9 @@ import java.util.StringJoiner;
* {@link WifiNetworkDetailsFragment}. * {@link WifiNetworkDetailsFragment}.
*/ */
public class WifiDetailPreferenceController extends PreferenceController implements public class WifiDetailPreferenceController extends PreferenceController implements
LifecycleObserver, OnResume { LifecycleObserver, OnPause, OnResume {
private static final String TAG = "WifiDetailsPrefCtrl"; private static final String TAG = "WifiDetailsPrefCtrl";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@VisibleForTesting @VisibleForTesting
static final String KEY_CONNECTION_DETAIL_PREF = "connection_detail"; static final String KEY_CONNECTION_DETAIL_PREF = "connection_detail";
@@ -82,14 +88,15 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
static final String KEY_IPV6_ADDRESS_CATEGORY = "ipv6_details_category"; static final String KEY_IPV6_ADDRESS_CATEGORY = "ipv6_details_category";
private AccessPoint mAccessPoint; private AccessPoint mAccessPoint;
private final ConnectivityManager mConnectivityManager;
private final Fragment mFragment;
private NetworkInfo mNetworkInfo; private NetworkInfo mNetworkInfo;
private Context mPrefContext; private Context mPrefContext;
private int mRssi; private int mRssi;
private String[] mSignalStr; private String[] mSignalStr;
private WifiConfiguration mWifiConfig; private final WifiConfiguration mWifiConfig;
private WifiInfo mWifiInfo; private WifiInfo mWifiInfo;
private final WifiManager mWifiManager; private final WifiManager mWifiManager;
private final ConnectivityManager mConnectivityManager;
// Preferences - in order of appearance // Preferences - in order of appearance
private Preference mConnectionDetailPref; private Preference mConnectionDetailPref;
@@ -104,18 +111,39 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
private WifiDetailPreference mDnsPref; private WifiDetailPreference mDnsPref;
private PreferenceCategory mIpv6AddressCategory; private PreferenceCategory mIpv6AddressCategory;
public WifiDetailPreferenceController(AccessPoint accessPoint, Context context, private final IntentFilter mFilter;
Lifecycle lifecycle, WifiManager wifiManager, ConnectivityManager connectivityManager) { private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case WifiManager.NETWORK_STATE_CHANGED_ACTION:
case WifiManager.RSSI_CHANGED_ACTION:
updateInfo();
}
}
};
public WifiDetailPreferenceController(
AccessPoint accessPoint,
ConnectivityManager connectivityManager,
Context context,
Fragment fragment,
Lifecycle lifecycle,
WifiManager wifiManager) {
super(context); super(context);
mAccessPoint = accessPoint; mAccessPoint = accessPoint;
mConnectivityManager = connectivityManager;
mFragment = fragment;
mNetworkInfo = accessPoint.getNetworkInfo(); mNetworkInfo = accessPoint.getNetworkInfo();
mRssi = accessPoint.getRssi(); mRssi = accessPoint.getRssi();
mSignalStr = context.getResources().getStringArray(R.array.wifi_signal); mSignalStr = context.getResources().getStringArray(R.array.wifi_signal);
mWifiConfig = accessPoint.getConfig(); mWifiConfig = accessPoint.getConfig();
mWifiManager = wifiManager; mWifiManager = wifiManager;
mConnectivityManager = connectivityManager;
mWifiInfo = wifiManager.getConnectionInfo(); mFilter = new IntentFilter();
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
lifecycle.addObserver(this); lifecycle.addObserver(this);
} }
@@ -163,39 +191,33 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
@Override @Override
public void onResume() { public void onResume() {
mWifiInfo = mWifiManager.getConnectionInfo(); updateInfo();
refreshFromWifiInfo(); mContext.registerReceiver(mReceiver, mFilter);
setIpText();
} }
private void refreshFromWifiInfo() { @Override
if (mWifiInfo == null) { public void onPause() {
mContext.unregisterReceiver(mReceiver);
}
private void updateInfo() {
mNetworkInfo = mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
mWifiInfo = mWifiManager.getConnectionInfo();
if (mNetworkInfo == null || mWifiInfo == null) {
exitActivity();
return; return;
} }
mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
int iconSignalLevel = WifiManager.calculateSignalLevel( refreshNetworkState();
mWifiInfo.getRssi(), WifiManager.RSSI_LEVELS);
Drawable wifiIcon = NetworkBadging.getWifiIcon(
iconSignalLevel, NetworkBadging.BADGING_NONE, mContext.getTheme()).mutate();
// Connected Header Pref // Update Connection Header icon and Signal Strength Preference
mConnectionDetailPref.setIcon(wifiIcon); mRssi = mWifiInfo.getRssi();
mConnectionDetailPref.setTitle(mAccessPoint.getSettingsSummary()); refreshRssiViews();
// MAC Address Pref // MAC Address Pref
mMacAddressPref.setDetailText(mWifiInfo.getMacAddress()); mMacAddressPref.setDetailText(mWifiInfo.getMacAddress());
// Signal Strength Pref
Drawable wifiIconDark = wifiIcon.getConstantState().newDrawable().mutate();
wifiIconDark.setTint(mContext.getResources().getColor(
R.color.wifi_details_icon_color, mContext.getTheme()));
mSignalStrengthPref.setIcon(wifiIconDark);
int summarySignalLevel = mAccessPoint.getLevel();
mSignalStrengthPref.setDetailText(mSignalStr[summarySignalLevel]);
// Link Speed Pref // Link Speed Pref
int linkSpeedMbps = mWifiInfo.getLinkSpeed(); int linkSpeedMbps = mWifiInfo.getLinkSpeed();
mLinkSpeedPref.setVisible(linkSpeedMbps >= 0); mLinkSpeedPref.setVisible(linkSpeedMbps >= 0);
@@ -215,6 +237,37 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
Log.e(TAG, "Unexpected frequency " + frequency); Log.e(TAG, "Unexpected frequency " + frequency);
} }
mFrequencyPref.setDetailText(band); mFrequencyPref.setDetailText(band);
setIpText();
}
private void exitActivity() {
if (DEBUG) {
Log.d(TAG, "Exiting the WifiNetworkDetailsPage");
}
mFragment.getActivity().finish();
}
private void refreshNetworkState() {
mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
mConnectionDetailPref.setTitle(mAccessPoint.getSettingsSummary());
}
private void refreshRssiViews() {
int iconSignalLevel = WifiManager.calculateSignalLevel(
mRssi, WifiManager.RSSI_LEVELS);
Drawable wifiIcon = NetworkBadging.getWifiIcon(
iconSignalLevel, NetworkBadging.BADGING_NONE, mContext.getTheme()).mutate();
mConnectionDetailPref.setIcon(wifiIcon);
Drawable wifiIconDark = wifiIcon.getConstantState().newDrawable().mutate();
wifiIconDark.setTint(mContext.getResources().getColor(
R.color.wifi_details_icon_color, mContext.getTheme()));
mSignalStrengthPref.setIcon(wifiIconDark);
int summarySignalLevel = mAccessPoint.getLevel();
mSignalStrengthPref.setDetailText(mSignalStr[summarySignalLevel]);
} }
private void setIpText() { private void setIpText() {
@@ -321,5 +374,6 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
mWifiManager.forget(mWifiConfig.networkId, null /* action listener */); mWifiManager.forget(mWifiConfig.networkId, null /* action listener */);
} }
} }
mFragment.getActivity().finish();
} }
} }

View File

@@ -69,7 +69,6 @@ public class WifiNetworkDetailsFragment extends DashboardFragment {
private void forgetNetwork() { private void forgetNetwork() {
mMetricsFeatureProvider.action(getActivity(), MetricsProto.MetricsEvent.ACTION_WIFI_FORGET); mMetricsFeatureProvider.action(getActivity(), MetricsProto.MetricsEvent.ACTION_WIFI_FORGET);
mWifiDetailPreferenceController.forgetNetwork(); mWifiDetailPreferenceController.forgetNetwork();
getActivity().finish();
} }
@Override @Override
@@ -91,10 +90,11 @@ public class WifiNetworkDetailsFragment extends DashboardFragment {
protected List<PreferenceController> getPreferenceControllers(Context context) { protected List<PreferenceController> getPreferenceControllers(Context context) {
mWifiDetailPreferenceController = new WifiDetailPreferenceController( mWifiDetailPreferenceController = new WifiDetailPreferenceController(
mAccessPoint, mAccessPoint,
context.getSystemService(ConnectivityManager.class),
context, context,
this,
getLifecycle(), getLifecycle(),
context.getSystemService(WifiManager.class), context.getSystemService(WifiManager.class));
context.getSystemService(ConnectivityManager.class));
ArrayList<PreferenceController> controllers = new ArrayList(1); ArrayList<PreferenceController> controllers = new ArrayList(1);
controllers.add(mWifiDetailPreferenceController); controllers.add(mWifiDetailPreferenceController);

View File

@@ -24,7 +24,9 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.IpPrefix; import android.net.IpPrefix;
@@ -56,9 +58,6 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
@@ -79,12 +78,14 @@ public class WifiDetailPreferenceControllerTest {
private PreferenceScreen mockScreen; private PreferenceScreen mockScreen;
@Mock private AccessPoint mockAccessPoint; @Mock private AccessPoint mockAccessPoint;
@Mock private WifiManager mockWifiManager; @Mock private Activity mockActivity;
@Mock private ConnectivityManager mockConnectivityManager; @Mock private ConnectivityManager mockConnectivityManager;
@Mock private Network mockNetwork;
@Mock private NetworkInfo mockNetworkInfo; @Mock private NetworkInfo mockNetworkInfo;
@Mock private WifiConfiguration mockWifiConfig; @Mock private WifiConfiguration mockWifiConfig;
@Mock private WifiInfo mockWifiInfo; @Mock private WifiInfo mockWifiInfo;
@Mock private Network mockNetwork; @Mock private WifiNetworkDetailsFragment mockFragment;
@Mock private WifiManager mockWifiManager;
@Mock private Preference mockConnectionDetailPref; @Mock private Preference mockConnectionDetailPref;
@Mock private WifiDetailPreference mockSignalStrengthPref; @Mock private WifiDetailPreference mockSignalStrengthPref;
@@ -122,6 +123,9 @@ public class WifiDetailPreferenceControllerTest {
when(mockAccessPoint.getRssi()).thenReturn(RSSI); when(mockAccessPoint.getRssi()).thenReturn(RSSI);
when(mockAccessPoint.getSecurityString(false)).thenReturn(SECURITY); when(mockAccessPoint.getSecurityString(false)).thenReturn(SECURITY);
when(mockConnectivityManager.getNetworkInfo(any(Network.class)))
.thenReturn(mockNetworkInfo);
when(mockWifiInfo.getLinkSpeed()).thenReturn(LINK_SPEED); when(mockWifiInfo.getLinkSpeed()).thenReturn(LINK_SPEED);
when(mockWifiInfo.getRssi()).thenReturn(RSSI); when(mockWifiInfo.getRssi()).thenReturn(RSSI);
when(mockWifiInfo.getMacAddress()).thenReturn(MAC_ADDRESS); when(mockWifiInfo.getMacAddress()).thenReturn(MAC_ADDRESS);
@@ -131,12 +135,23 @@ public class WifiDetailPreferenceControllerTest {
mLinkProperties = new LinkProperties(); mLinkProperties = new LinkProperties();
when(mockConnectivityManager.getLinkProperties(mockNetwork)).thenReturn(mLinkProperties); when(mockConnectivityManager.getLinkProperties(mockNetwork)).thenReturn(mLinkProperties);
mController = new WifiDetailPreferenceController( when(mockFragment.getActivity()).thenReturn(mockActivity);
mockAccessPoint, mContext, mLifecycle, mockWifiManager, mockConnectivityManager);
mController = newWifiDetailPreferenceController();
setupMockedPreferenceScreen(); setupMockedPreferenceScreen();
} }
private WifiDetailPreferenceController newWifiDetailPreferenceController() {
return new WifiDetailPreferenceController(
mockAccessPoint,
mockConnectivityManager,
mContext,
mockFragment,
mLifecycle,
mockWifiManager);
}
private void setupMockedPreferenceScreen() { private void setupMockedPreferenceScreen() {
when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_CONNECTION_DETAIL_PREF)) when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_CONNECTION_DETAIL_PREF))
.thenReturn(mockConnectionDetailPref); .thenReturn(mockConnectionDetailPref);
@@ -175,11 +190,17 @@ public class WifiDetailPreferenceControllerTest {
} }
@Test @Test
public void latestWifiInfoAndConfig_shouldBeFetchedOnResume() { public void latestWifiInfo_shouldBeFetchedOnResume() {
mController.onResume(); mController.onResume();
// Once in construction, once in onResume verify(mockWifiManager, times(1)).getConnectionInfo();
verify(mockWifiManager, times(2)).getConnectionInfo(); }
@Test
public void latestNetworkInfo_shouldBeFetchedOnResume() {
mController.onResume();
verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
} }
@Test @Test
@@ -321,9 +342,9 @@ public class WifiDetailPreferenceControllerTest {
@Test @Test
public void canForgetNetwork_noNetwork() { public void canForgetNetwork_noNetwork() {
when(mockAccessPoint.getConfig()).thenReturn(null); when(mockAccessPoint.getConfig()).thenReturn(null);
mController = newWifiDetailPreferenceController();
mController = new WifiDetailPreferenceController( mController.displayPreference(mockScreen);
mockAccessPoint, mContext, mLifecycle, mockWifiManager, mockConnectivityManager); mController.onResume();
assertThat(mController.canForgetNetwork()).isFalse(); assertThat(mController.canForgetNetwork()).isFalse();
} }
@@ -332,9 +353,9 @@ public class WifiDetailPreferenceControllerTest {
public void canForgetNetwork_ephemeral() { public void canForgetNetwork_ephemeral() {
when(mockWifiInfo.isEphemeral()).thenReturn(true); when(mockWifiInfo.isEphemeral()).thenReturn(true);
when(mockAccessPoint.getConfig()).thenReturn(null); when(mockAccessPoint.getConfig()).thenReturn(null);
mController = newWifiDetailPreferenceController();
mController = new WifiDetailPreferenceController( mController.displayPreference(mockScreen);
mockAccessPoint, mContext, mLifecycle, mockWifiManager, mockConnectivityManager); mController.onResume();
assertThat(mController.canForgetNetwork()).isTrue(); assertThat(mController.canForgetNetwork()).isTrue();
} }
@@ -347,10 +368,11 @@ public class WifiDetailPreferenceControllerTest {
@Test @Test
public void forgetNetwork_ephemeral() { public void forgetNetwork_ephemeral() {
String ssid = "ssid"; String ssid = "ssid";
when(mockWifiInfo.isEphemeral()).thenReturn(true); when(mockWifiInfo.isEphemeral()).thenReturn(true);
when(mockWifiInfo.getSSID()).thenReturn(ssid); when(mockWifiInfo.getSSID()).thenReturn(ssid);
mController.onResume();
mController.forgetNetwork(); mController.forgetNetwork();
verify(mockWifiManager).disableEphemeralNetwork(ssid); verify(mockWifiManager).disableEphemeralNetwork(ssid);
@@ -364,4 +386,38 @@ public class WifiDetailPreferenceControllerTest {
verify(mockWifiManager).forget(mockWifiConfig.networkId, null); verify(mockWifiManager).forget(mockWifiConfig.networkId, null);
} }
@Test
public void networkStateChangedIntent_shouldRefetchInfo() {
mController.onResume();
verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
verify(mockWifiManager, times(1)).getConnectionInfo();
mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION));
verify(mockConnectivityManager, times(2)).getNetworkInfo(any(Network.class));
verify(mockWifiManager, times(2)).getConnectionInfo();
}
@Test
public void rssiChangedIntent_shouldRefetchInfo() {
mController.onResume();
verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
verify(mockWifiManager, times(1)).getConnectionInfo();
mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION));
verify(mockConnectivityManager, times(2)).getNetworkInfo(any(Network.class));
verify(mockWifiManager, times(2)).getConnectionInfo();
}
@Test
public void networkDisconnectdState_shouldFinishActivity() {
mController.onResume();
when(mockConnectivityManager.getNetworkInfo(any(Network.class))).thenReturn(null);
mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION));
verify(mockActivity).finish();
}
} }