Merge "Add API for NetworkStack to start captive portal"
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user