Merge "Add API for NetworkStack to start captive portal"

This commit is contained in:
Remi NGUYEN VAN
2019-02-07 02:39:17 +00:00
committed by Gerrit Code Review
6 changed files with 51 additions and 10 deletions

View File

@@ -3075,6 +3075,7 @@ package android.net {
method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void getLatestTetheringEntitlementValue(int, boolean, @NonNull android.net.ConnectivityManager.TetheringEntitlementValueListener, @Nullable android.os.Handler); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void getLatestTetheringEntitlementValue(int, boolean, @NonNull android.net.ConnectivityManager.TetheringEntitlementValueListener, @Nullable android.os.Handler);
method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported(); method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported();
method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void setAirplaneMode(boolean); method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void setAirplaneMode(boolean);
method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(android.os.Bundle);
method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback);
method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback, android.os.Handler); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int, boolean, android.net.ConnectivityManager.OnStartTetheringCallback, android.os.Handler);
method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void stopTethering(int); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void stopTethering(int);

View File

@@ -608,6 +608,7 @@ package android.net {
} }
public class ConnectivityManager { public class ConnectivityManager {
method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(android.os.Bundle);
field public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC"; field public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC";
field public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT"; field public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT";
} }

View File

@@ -3906,6 +3906,25 @@ public class ConnectivityManager {
} }
} }
/**
* Requests that the system open the captive portal app with the specified extras.
*
* <p>This endpoint is exclusively for use by the NetworkStack and is protected by the
* corresponding permission.
* @param appExtras Extras to include in the app start intent.
* @hide
*/
@SystemApi
@TestApi
@RequiresPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)
public void startCaptivePortalApp(Bundle appExtras) {
try {
mService.startCaptivePortalAppInternal(appExtras);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/** /**
* Determine whether the device is configured to avoid bad wifi. * Determine whether the device is configured to avoid bad wifi.
* @hide * @hide

View File

@@ -27,6 +27,7 @@ import android.net.NetworkQuotaInfo;
import android.net.NetworkRequest; import android.net.NetworkRequest;
import android.net.NetworkState; import android.net.NetworkState;
import android.net.ProxyInfo; import android.net.ProxyInfo;
import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.os.Messenger; import android.os.Messenger;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
@@ -167,6 +168,7 @@ interface IConnectivityManager
void setAcceptUnvalidated(in Network network, boolean accept, boolean always); void setAcceptUnvalidated(in Network network, boolean accept, boolean always);
void setAvoidUnvalidated(in Network network); void setAvoidUnvalidated(in Network network);
void startCaptivePortalApp(in Network network); void startCaptivePortalApp(in Network network);
void startCaptivePortalAppInternal(in Bundle appExtras);
boolean getAvoidBadWifi(); boolean getAvoidBadWifi();
int getMultipathPreference(in Network Network); int getMultipathPreference(in Network Network);

View File

@@ -61,6 +61,7 @@ import android.net.util.SharedLog;
import android.net.util.Stopwatch; import android.net.util.Stopwatch;
import android.net.wifi.WifiInfo; import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Message; import android.os.Message;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.SystemClock; import android.os.SystemClock;
@@ -674,11 +675,11 @@ public class NetworkMonitor extends StateMachine {
public boolean processMessage(Message message) { public boolean processMessage(Message message) {
switch (message.what) { switch (message.what) {
case CMD_LAUNCH_CAPTIVE_PORTAL_APP: case CMD_LAUNCH_CAPTIVE_PORTAL_APP:
final Intent intent = new Intent( final Bundle appExtras = new Bundle();
ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN);
// OneAddressPerFamilyNetwork is not parcelable across processes. // OneAddressPerFamilyNetwork is not parcelable across processes.
intent.putExtra(ConnectivityManager.EXTRA_NETWORK, new Network(mNetwork)); appExtras.putParcelable(
intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL, ConnectivityManager.EXTRA_NETWORK, new Network(mNetwork));
appExtras.putParcelable(ConnectivityManager.EXTRA_CAPTIVE_PORTAL,
new CaptivePortal(new ICaptivePortal.Stub() { new CaptivePortal(new ICaptivePortal.Stub() {
@Override @Override
public void appResponse(int response) { public void appResponse(int response) {
@@ -700,16 +701,14 @@ public class NetworkMonitor extends StateMachine {
} }
})); }));
final CaptivePortalProbeResult probeRes = mLastPortalProbeResult; final CaptivePortalProbeResult probeRes = mLastPortalProbeResult;
intent.putExtra(EXTRA_CAPTIVE_PORTAL_URL, probeRes.detectUrl); appExtras.putString(EXTRA_CAPTIVE_PORTAL_URL, probeRes.detectUrl);
if (probeRes.probeSpec != null) { if (probeRes.probeSpec != null) {
final String encodedSpec = probeRes.probeSpec.getEncodedSpec(); final String encodedSpec = probeRes.probeSpec.getEncodedSpec();
intent.putExtra(EXTRA_CAPTIVE_PORTAL_PROBE_SPEC, encodedSpec); appExtras.putString(EXTRA_CAPTIVE_PORTAL_PROBE_SPEC, encodedSpec);
} }
intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_USER_AGENT, appExtras.putString(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_USER_AGENT,
mCaptivePortalUserAgent); mCaptivePortalUserAgent);
intent.setFlags( mCm.startCaptivePortalApp(appExtras);
Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivityAsUser(intent, UserHandle.CURRENT);
return HANDLED; return HANDLED;
default: default:
return NOT_HANDLED; return NOT_HANDLED;

View File

@@ -3230,6 +3230,25 @@ public class ConnectivityService extends IConnectivityManager.Stub
}); });
} }
/**
* NetworkStack endpoint to start the captive portal app. The NetworkStack needs to use this
* endpoint as it does not have INTERACT_ACROSS_USERS_FULL itself.
* @param appExtras Bundle to use as intent extras for the captive portal application.
* Must be treated as opaque to avoid preventing the captive portal app to
* update its arguments.
*/
@Override
public void startCaptivePortalAppInternal(Bundle appExtras) {
mContext.checkCallingOrSelfPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
final Intent appIntent = new Intent(ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN);
appIntent.putExtras(appExtras);
appIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
Binder.withCleanCallingIdentity(() ->
mContext.startActivityAsUser(appIntent, UserHandle.CURRENT));
}
public boolean avoidBadWifi() { public boolean avoidBadWifi() {
return mMultinetworkPolicyTracker.getAvoidBadWifi(); return mMultinetworkPolicyTracker.getAvoidBadWifi();
} }