Add capport info to WiFi details(WifiDetailPreferenceController2)

Session expiration time and venue webpage can be obtained through the
captive portal API.

Test: make RunSettingsRoboTests \
      ROBOTEST_FILTER=WifiDetailPreferenceController2Test
      (Since WifiDetailPreferenceController2Test is ignore now,
      there is no test will be run in
      WifiDetailPreferenceController2Test)
Bug: 139269711
Change-Id: I80b93689539c6ba5edafa3d0029376deca7ac1f7
This commit is contained in:
lucaslin
2020-02-19 17:31:41 +08:00
parent 9f7f0b5baf
commit 4ef8ec0e4c
2 changed files with 188 additions and 9 deletions

View File

@@ -29,6 +29,7 @@ import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.VectorDrawable;
import android.net.CaptivePortalData;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.LinkAddress;
@@ -39,6 +40,7 @@ import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.net.NetworkUtils;
import android.net.RouteInfo;
import android.net.Uri;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
@@ -72,6 +74,7 @@ import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
import com.android.settingslib.utils.StringUtil;
import com.android.settingslib.widget.ActionButtonsPreference;
import com.android.settingslib.widget.LayoutPreference;
import com.android.wifitrackerlib.WifiEntry;
@@ -90,6 +93,11 @@ import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.time.Duration;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.StringJoiner;
import java.util.stream.Collectors;
@@ -173,6 +181,7 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
WifiDataUsageSummaryPreferenceController mSummaryHeaderController;
private final IconInjector mIconInjector;
private final Clock mClock;
private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
.clearCapabilities().addTransportType(TRANSPORT_WIFI).build();
@@ -183,6 +192,8 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
if (network.equals(mNetwork) && !lp.equals(mLinkProperties)) {
mLinkProperties = lp;
refreshEntityHeader();
refreshButtons();
refreshIpLayerInfo();
}
}
@@ -253,7 +264,7 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
MetricsFeatureProvider metricsFeatureProvider) {
return new WifiDetailPreferenceController2(
wifiEntry, connectivityManager, context, fragment, handler, lifecycle,
wifiManager, metricsFeatureProvider, new IconInjector(context));
wifiManager, metricsFeatureProvider, new IconInjector(context), new Clock());
}
@VisibleForTesting
@@ -266,7 +277,8 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
Lifecycle lifecycle,
WifiManager wifiManager,
MetricsFeatureProvider metricsFeatureProvider,
IconInjector injector) {
IconInjector injector,
Clock clock) {
super(context);
mWifiEntry = wifiEntry;
@@ -278,6 +290,7 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
mWifiManager = wifiManager;
mMetricsFeatureProvider = metricsFeatureProvider;
mIconInjector = injector;
mClock = clock;
mLifecycle = lifecycle;
lifecycle.addObserver(this);
@@ -313,6 +326,7 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
.setButton4Text(R.string.share)
.setButton4Icon(R.drawable.ic_qrcode_24dp)
.setButton4OnClickListener(view -> shareNetwork());
updateCaptivePortalButton();
mSignalStrengthPref = screen.findPreference(KEY_SIGNAL_STRENGTH_PREF);
mTxLinkSpeedPref = screen.findPreference(KEY_TX_LINK_SPEED);
@@ -333,6 +347,43 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
mSecurityPref.setSummary(mWifiEntry.getSecurityString(false /* concise */));
}
/**
* Update text, icon and listener of the captive portal button.
* @return True if the button should be shown.
*/
private boolean updateCaptivePortalButton() {
final Uri venueInfoUrl = getCaptivePortalVenueInfoUrl();
if (venueInfoUrl == null) {
mButtonsPref.setButton2Text(R.string.wifi_sign_in_button_text)
.setButton2Icon(R.drawable.ic_settings_sign_in)
.setButton2OnClickListener(view -> signIntoNetwork());
return canSignIntoNetwork();
}
mButtonsPref.setButton2Text(R.string.wifi_venue_website_button_text)
.setButton2Icon(R.drawable.ic_settings_sign_in)
.setButton2OnClickListener(view -> {
final Intent infoIntent = new Intent(Intent.ACTION_VIEW);
infoIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
infoIntent.setData(venueInfoUrl);
mContext.startActivity(infoIntent);
});
// Only show the venue website when the network is connected.
return mWifiEntry.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED;
}
private Uri getCaptivePortalVenueInfoUrl() {
final LinkProperties lp = mLinkProperties;
if (lp == null) {
return null;
}
final CaptivePortalData data = lp.getCaptivePortalData();
if (data == null) {
return null;
}
return data.getVenueInfoUrl();
}
private void setupEntityHeader(PreferenceScreen screen) {
LayoutPreference headerPref = screen.findPreference(KEY_HEADER);
@@ -359,6 +410,37 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
mEntityHeaderController.setLabel(mWifiEntry.getTitle());
}
private String getExpiryTimeSummary() {
if (mLinkProperties == null || mLinkProperties.getCaptivePortalData() == null) {
return null;
}
final long expiryTimeMillis = mLinkProperties.getCaptivePortalData().getExpiryTimeMillis();
if (expiryTimeMillis <= 0) {
return null;
}
final ZonedDateTime now = mClock.now();
final ZonedDateTime expiryTime = ZonedDateTime.ofInstant(
Instant.ofEpochMilli(expiryTimeMillis),
now.getZone());
if (now.isAfter(expiryTime)) {
return null;
}
if (now.plusDays(2).isAfter(expiryTime)) {
// Expiration within 2 days: show a duration
return mContext.getString(R.string.wifi_time_remaining, StringUtil.formatElapsedTime(
mContext,
Duration.between(now, expiryTime).getSeconds() * 1000,
false /* withSeconds */));
}
// For more than 2 days, show the expiry date
return mContext.getString(R.string.wifi_expiry_time,
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).format(expiryTime));
}
private void refreshEntityHeader() {
if (usingDataUsageHeader(mContext)) {
mSummaryHeaderController.updateState(mDataUsageSummaryPref);
@@ -367,6 +449,7 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
mEntityHeaderController
.setSummary(summary)
.setSecondSummary(getExpiryTimeSummary())
.setRecyclerView(mFragment.getListView(), mLifecycle)
.done(mFragment.getActivity(), true /* rebind */);
}
@@ -589,13 +672,13 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
private void refreshButtons() {
final boolean canForgetNetwork = mWifiEntry.canForget();
final boolean canSignIntoNetwork = canSignIntoNetwork();
final boolean showCaptivePortalButton = updateCaptivePortalButton();
final boolean canConnectDisconnectNetwork = mWifiEntry.canConnect()
|| mWifiEntry.canDisconnect();
final boolean canShareNetwork = canShareNetwork();
mButtonsPref.setButton1Visible(canForgetNetwork);
mButtonsPref.setButton2Visible(canSignIntoNetwork);
mButtonsPref.setButton2Visible(showCaptivePortalButton);
// If it's expired and connected, shows Disconnect button for users to disconnect it.
// If it's expired and not connected, hides the button and users are not able to connect it.
//
@@ -612,7 +695,7 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
mButtonsPref.setButton3Icon(getConnectDisconnectButtonIconResource());
mButtonsPref.setButton4Visible(canShareNetwork);
mButtonsPref.setVisible(canForgetNetwork
|| canSignIntoNetwork
|| showCaptivePortalButton
|| canConnectDisconnectNetwork
|| canShareNetwork);
}
@@ -839,6 +922,13 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
}
}
@VisibleForTesting
static class Clock {
public ZonedDateTime now() {
return ZonedDateTime.now();
}
}
private boolean usingDataUsageHeader(Context context) {
return FeatureFlagUtils.isEnabled(context, FeatureFlags.WIFI_DETAILS_DATAUSAGE_HEADER);
}