[Wi-Fi] Refine code for saved AccessPoints

The change targets to refine SavedAccessPointsPreferenceController and
SubscribedAccessPointsPreferenceController

1. Remove feature flag check for saved Passpoint display.
2. They do not implements WifiManager.ActionListener.
3. Separate the code to collect saved AccessPoints data and the code to
   update preferences.
4. Let getAvailabilityStatus() returns result according to the saved
   AccessPoints data.
5. Update preferences at SavedAccessPointsWifiSettings#onStart()
   instead of life cycle onStart() of these 2 controllers.
   This is for the change of 2.
6. Do not use PreferenceGroupChildrenCache in
   SubscribedAccessPointsPreferenceController, this is for code
   alignment of SavedAccessPointsPreferenceController.
   Now these 2 controllers have very similar design, it will be easier
   to refine SubscribedAccessPointsPreferenceController as a child of
   SavedAccessPointsPreferenceController.

Bug: 127206629
Test: make RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.wifi.savedaccesspoints
      Manual: Add and forget Wi-Fi accesspoints and observe UI display.

Change-Id: Id6f95d5b64e57a98c2c2e6ab09a4dec70a71b615
This commit is contained in:
Arc Wang
2019-10-08 17:58:20 +08:00
committed by Raff Tsai
parent ab1277f6a5
commit 1f7d2dc54c
6 changed files with 99 additions and 239 deletions

View File

@@ -16,10 +16,8 @@
package com.android.settings.wifi.savedaccesspoints;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -27,10 +25,6 @@ import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.R;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.utils.ThreadUtils;
import com.android.settingslib.wifi.AccessPoint;
import com.android.settingslib.wifi.AccessPointPreference;
import com.android.settingslib.wifi.AccessPointPreference.UserBadgeCache;
@@ -38,21 +32,22 @@ import com.android.settingslib.wifi.WifiSavedConfigUtils;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* Controller that manages a PreferenceGroup, which contains a list of saved access points.
*/
public class SavedAccessPointsPreferenceController extends BasePreferenceController implements
LifecycleObserver, OnStart, Preference.OnPreferenceClickListener,
WifiManager.ActionListener {
Preference.OnPreferenceClickListener {
private static final String TAG = "SavedAPPrefCtrl";
private static final String TAG = "SavedApPrefCtrl";
private final WifiManager mWifiManager;
private final UserBadgeCache mUserBadgeCache;
private PreferenceGroup mPreferenceGroup;
private SavedAccessPointsWifiSettings mHost;
@VisibleForTesting
List<AccessPoint> mAccessPoints;
public SavedAccessPointsPreferenceController(Context context,
String preferenceKey) {
@@ -68,86 +63,46 @@ public class SavedAccessPointsPreferenceController extends BasePreferenceControl
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
return mAccessPoints.size() > 0 ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreferenceGroup = screen.findPreference(getPreferenceKey());
}
@Override
public void onStart() {
refreshSavedAccessPoints();
}
public void postRefreshSavedAccessPoints() {
ThreadUtils.postOnMainThread(() -> refreshSavedAccessPoints());
updatePreference();
super.displayPreference(screen);
}
@Override
public boolean onPreferenceClick(Preference preference) {
final Preference preferenceInGroup = mPreferenceGroup.findPreference(preference.getKey());
if (mHost != null) {
final Preference preferenceInGroup =
mPreferenceGroup.findPreference(preference.getKey());
mHost.showWifiPage((AccessPointPreference) preferenceInGroup);
}
return false;
}
@Override
public void onSuccess() {
postRefreshSavedAccessPoints();
private void refreshSavedAccessPoints() {
mAccessPoints = WifiSavedConfigUtils.getAllConfigs(mContext, mWifiManager).stream()
.filter(accessPoint -> !accessPoint.isPasspointConfig())
.sorted(SavedNetworkComparator.INSTANCE)
.collect(Collectors.toList());
}
@Override
public void onFailure(int reason) {
postRefreshSavedAccessPoints();
}
@VisibleForTesting
void refreshSavedAccessPoints() {
if (mPreferenceGroup == null) {
Log.w(TAG, "PreferenceGroup is null, skipping.");
return;
}
final Context prefContext = mPreferenceGroup.getContext();
final List<AccessPoint> accessPoints =
WifiSavedConfigUtils.getAllConfigs(mContext, mWifiManager);
Collections.sort(accessPoints, SavedNetworkComparator.INSTANCE);
private void updatePreference() {
mPreferenceGroup.removeAll();
for (AccessPoint accessPoint : mAccessPoints) {
final String key = accessPoint.getKey();
final int accessPointsSize = accessPoints.size();
for (int i = 0; i < accessPointsSize; ++i) {
AccessPoint ap = accessPoints.get(i);
if (mHost != null && mHost.isSubscriptionsFeatureEnabled()
&& ap.isPasspointConfig()) {
continue;
}
String key = ap.getKey();
AccessPointPreference preference = new AccessPointPreference(ap, prefContext,
mUserBadgeCache, true);
final AccessPointPreference preference = new AccessPointPreference(accessPoint,
mContext, mUserBadgeCache, true /* forSavedNetworks */);
preference.setKey(key);
preference.setIcon(null);
preference.setOnPreferenceClickListener(this);
mPreferenceGroup.addPreference(preference);
preference.setOrder(i);
}
if (mPreferenceGroup.getPreferenceCount() < 1) {
Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!");
mPreferenceGroup.setVisible(false);
} else {
mPreferenceGroup.setVisible(true);
}
if (mHost != null && !mHost.isSubscriptionsFeatureEnabled()) {
mPreferenceGroup.setVisible(true);
mPreferenceGroup.setTitle(null);
mPreferenceGroup.setLayoutResource(R.layout.preference_category_no_label);
}
}
}

View File

@@ -20,13 +20,13 @@ import android.annotation.Nullable;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
import android.util.FeatureFlagUtils;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.FeatureFlags;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.development.featureflags.FeatureFlagPersistent;
import com.android.settings.wifi.WifiSettings;
import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
import com.android.settingslib.wifi.AccessPoint;
@@ -39,7 +39,8 @@ public class SavedAccessPointsWifiSettings extends DashboardFragment {
private static final String TAG = "SavedAccessPoints";
private Bundle mAccessPointSavedState;
@VisibleForTesting
Bundle mAccessPointSavedState;
private AccessPoint mSelectedAccessPoint;
// Instance state key
@@ -76,10 +77,22 @@ public class SavedAccessPointsWifiSettings extends DashboardFragment {
if (savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)) {
mAccessPointSavedState =
savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
} else {
mAccessPointSavedState = null;
}
}
}
@Override
public void onStart() {
super.onStart();
if (mAccessPointSavedState != null) {
final PreferenceScreen screen = getPreferenceScreen();
use(SavedAccessPointsPreferenceController.class).displayPreference(screen);
use(SubscribedAccessPointsPreferenceController.class).displayPreference(screen);
}
}
public void showWifiPage(@Nullable AccessPointPreference accessPoint) {
removeDialog(WifiSettings.WIFI_DIALOG_ID);
@@ -117,9 +130,4 @@ public class SavedAccessPointsWifiSettings extends DashboardFragment {
outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState);
}
}
boolean isSubscriptionsFeatureEnabled() {
return FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.MOBILE_NETWORK_V2)
&& FeatureFlagPersistent.isEnabled(getContext(), FeatureFlags.NETWORK_INTERNET_V2);
}
}

View File

@@ -16,10 +16,8 @@
package com.android.settings.wifi.savedaccesspoints;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -27,10 +25,6 @@ import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.utils.PreferenceGroupChildrenCache;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.utils.ThreadUtils;
import com.android.settingslib.wifi.AccessPoint;
import com.android.settingslib.wifi.AccessPointPreference;
import com.android.settingslib.wifi.AccessPointPreference.UserBadgeCache;
@@ -38,29 +32,28 @@ import com.android.settingslib.wifi.WifiSavedConfigUtils;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* Controller that manages a PreferenceGroup, which contains a list of subscribed access points.
*/
// TODO(b/127206629): Code refactor to avoid duplicated coding after removed feature flag.
public class SubscribedAccessPointsPreferenceController extends BasePreferenceController implements
LifecycleObserver, OnStart, Preference.OnPreferenceClickListener,
WifiManager.ActionListener {
Preference.OnPreferenceClickListener {
private static final String TAG = "SubscribedAPPrefCtrl";
private static final String TAG = "SubscribedApPrefCtrl";
private final WifiManager mWifiManager;
private final PreferenceGroupChildrenCache mChildrenCache;
private final UserBadgeCache mUserBadgeCache;
private PreferenceGroup mPreferenceGroup;
private SavedAccessPointsWifiSettings mHost;
@VisibleForTesting
List<AccessPoint> mAccessPoints;
public SubscribedAccessPointsPreferenceController(Context context,
String preferenceKey) {
super(context, preferenceKey);
mUserBadgeCache = new AccessPointPreference.UserBadgeCache(context.getPackageManager());
mWifiManager = context.getSystemService(WifiManager.class);
mChildrenCache = new PreferenceGroupChildrenCache();
}
public SubscribedAccessPointsPreferenceController setHost(SavedAccessPointsWifiSettings host) {
@@ -70,89 +63,46 @@ public class SubscribedAccessPointsPreferenceController extends BasePreferenceCo
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
return mAccessPoints.size() > 0 ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreferenceGroup = screen.findPreference(getPreferenceKey());
}
@Override
public void onStart() {
refreshSubscribedAccessPoints();
}
public void postRefreshSubscribedAccessPoints() {
ThreadUtils.postOnMainThread(() -> refreshSubscribedAccessPoints());
updatePreference();
super.displayPreference(screen);
}
@Override
public boolean onPreferenceClick(Preference preference) {
if (mHost != null) {
mHost.showWifiPage((AccessPointPreference) preference);
final Preference preferenceInGroup =
mPreferenceGroup.findPreference(preference.getKey());
mHost.showWifiPage((AccessPointPreference) preferenceInGroup);
}
return false;
}
@Override
public void onSuccess() {
postRefreshSubscribedAccessPoints();
private void refreshSubscribedAccessPoints() {
mAccessPoints = WifiSavedConfigUtils.getAllConfigs(mContext, mWifiManager).stream()
.filter(accessPoint -> accessPoint.isPasspointConfig())
.sorted(SavedNetworkComparator.INSTANCE)
.collect(Collectors.toList());
}
@Override
public void onFailure(int reason) {
postRefreshSubscribedAccessPoints();
}
private void updatePreference() {
mPreferenceGroup.removeAll();
for (AccessPoint accessPoint : mAccessPoints) {
final String key = accessPoint.getKey();
@VisibleForTesting
void refreshSubscribedAccessPoints() {
if (mPreferenceGroup == null) {
Log.w(TAG, "PreferenceGroup is null, skipping.");
return;
}
final AccessPointPreference preference = new AccessPointPreference(accessPoint,
mContext, mUserBadgeCache, true /* forSavedNetworks */);
preference.setKey(key);
preference.setIcon(null);
preference.setOnPreferenceClickListener(this);
if (mHost != null && !mHost.isSubscriptionsFeatureEnabled()) {
mPreferenceGroup.setVisible(false);
return;
}
final Context prefContext = mPreferenceGroup.getContext();
final List<AccessPoint> accessPoints =
WifiSavedConfigUtils.getAllConfigs(mContext, mWifiManager);
Collections.sort(accessPoints, SavedNetworkComparator.INSTANCE);
mChildrenCache.cacheRemoveAllPrefs(mPreferenceGroup);
final int accessPointsSize = accessPoints.size();
for (int i = 0; i < accessPointsSize; ++i) {
AccessPoint ap = accessPoints.get(i);
if (!ap.isPasspointConfig()) {
continue;
}
final String key = ap.getKey();
AccessPointPreference preference =
(AccessPointPreference) mChildrenCache.getCachedPreference(key);
if (preference == null) {
preference = new AccessPointPreference(ap, prefContext, mUserBadgeCache, true);
preference.setKey(key);
preference.setIcon(null);
preference.setOnPreferenceClickListener(this);
mPreferenceGroup.addPreference(preference);
}
preference.setOrder(i);
}
mChildrenCache.removeCachedPrefs(mPreferenceGroup);
if (mPreferenceGroup.getPreferenceCount() < 1) {
Log.w(TAG, "Subscribed networks activity loaded,"
+ " but there are no subscribed networks!");
mPreferenceGroup.setVisible(false);
} else {
mPreferenceGroup.setVisible(true);
mPreferenceGroup.addPreference(preference);
}
}
}