Merge "Add android.net.CaptivePortal class for captive-portal-handling-app callbacks" into mnc-dev

This commit is contained in:
Paul Jensen
2015-07-10 14:57:09 +00:00
committed by Android (Google) Code Review
4 changed files with 129 additions and 110 deletions

View File

@@ -0,0 +1,108 @@
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed urnder the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.net;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
/**
* A class allowing apps handling the {@link ConnectivityManager#ACTION_CAPTIVE_PORTAL_SIGN_IN}
* activity to indicate to the system different outcomes of captive portal sign in. This class is
* passed as an extra named {@link ConnectivityManager#EXTRA_CAPTIVE_PORTAL} with the
* {@code ACTION_CAPTIVE_PORTAL_SIGN_IN} activity.
*/
public class CaptivePortal implements Parcelable {
/** @hide */
public static final int APP_RETURN_DISMISSED = 0;
/** @hide */
public static final int APP_RETURN_UNWANTED = 1;
/** @hide */
public static final int APP_RETURN_WANTED_AS_IS = 2;
private final IBinder mBinder;
/** @hide */
public CaptivePortal(IBinder binder) {
mBinder = binder;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeStrongBinder(mBinder);
}
public static final Parcelable.Creator<CaptivePortal> CREATOR
= new Parcelable.Creator<CaptivePortal>() {
@Override
public CaptivePortal createFromParcel(Parcel in) {
return new CaptivePortal(in.readStrongBinder());
}
@Override
public CaptivePortal[] newArray(int size) {
return new CaptivePortal[size];
}
};
/**
* Indicate to the system that the captive portal has been
* dismissed. In response the framework will re-evaluate the network's
* connectivity and might take further action thereafter.
*/
public void reportCaptivePortalDismissed() {
try {
ICaptivePortal.Stub.asInterface(mBinder).appResponse(APP_RETURN_DISMISSED);
} catch (RemoteException e) {
}
}
/**
* Indicate to the system that the user does not want to pursue signing in to the
* captive portal and the system should continue to prefer other networks
* without captive portals for use as the default active data network. The
* system will not retest the network for a captive portal so as to avoid
* disturbing the user with further sign in to network notifications.
*/
public void ignoreNetwork() {
try {
ICaptivePortal.Stub.asInterface(mBinder).appResponse(APP_RETURN_UNWANTED);
} catch (RemoteException e) {
}
}
/**
* Indicate to the system the user wants to use this network as is, even though
* the captive portal is still in place. The system will treat the network
* as if it did not have a captive portal when selecting the network to use
* as the default active data network. This may result in this network
* becoming the default active data network, which could disrupt network
* connectivity for apps because the captive portal is still in place.
* @hide
*/
public void useNetwork() {
try {
ICaptivePortal.Stub.asInterface(mBinder).appResponse(APP_RETURN_WANTED_AS_IS);
} catch (RemoteException e) {
}
}
}

View File

@@ -102,26 +102,26 @@ public class ConnectivityManager {
* portal, which is blocking Internet connectivity. The user was presented * portal, which is blocking Internet connectivity. The user was presented
* with a notification that network sign in is required, * with a notification that network sign in is required,
* and the user invoked the notification's action indicating they * and the user invoked the notification's action indicating they
* desire to sign in to the network. Apps handling this action should * desire to sign in to the network. Apps handling this activity should
* facilitate signing in to the network. This action includes a * facilitate signing in to the network. This action includes a
* {@link Network} typed extra called {@link #EXTRA_NETWORK} that represents * {@link Network} typed extra called {@link #EXTRA_NETWORK} that represents
* the network presenting the captive portal; all communication with the * the network presenting the captive portal; all communication with the
* captive portal must be done using this {@code Network} object. * captive portal must be done using this {@code Network} object.
* <p/> * <p/>
* When the app handling this action believes the user has signed in to * This activity includes a {@link CaptivePortal} extra named
* the network and the captive portal has been dismissed, the app should call * {@link #EXTRA_CAPTIVE_PORTAL} that can be used to indicate different
* {@link #reportCaptivePortalDismissed} so the system can reevaluate the network. * outcomes of the captive portal sign in to the system:
* If reevaluation finds the network no longer subject to a captive portal, * <ul>
* the network may become the default active data network. * <li> When the app handling this action believes the user has signed in to
* <p/> * the network and the captive portal has been dismissed, the app should
* When the app handling this action believes the user explicitly wants * call {@link CaptivePortal#reportCaptivePortalDismissed} so the system can
* reevaluate the network. If reevaluation finds the network no longer
* subject to a captive portal, the network may become the default active
* data network. </li>
* <li> When the app handling this action believes the user explicitly wants
* to ignore the captive portal and the network, the app should call * to ignore the captive portal and the network, the app should call
* {@link #ignoreNetworkWithCaptivePortal}. * {@link CaptivePortal#ignoreNetwork}. </li>
* <p/> * </ul>
* Note that this action includes a {@code String} extra named
* {@link #EXTRA_CAPTIVE_PORTAL_TOKEN} that must
* be passed in to {@link #reportCaptivePortalDismissed} and
* {@link #ignoreNetworkWithCaptivePortal}.
*/ */
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL"; public static final String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
@@ -187,16 +187,15 @@ public class ConnectivityManager {
* {@hide} * {@hide}
*/ */
public static final String EXTRA_INET_CONDITION = "inetCondition"; public static final String EXTRA_INET_CONDITION = "inetCondition";
/** /**
* The lookup key for a string that is sent out with * The lookup key for a {@link CaptivePortal} object included with the
* {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN}. This string must be * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} intent. The {@code CaptivePortal}
* passed in to {@link #reportCaptivePortalDismissed} and * object can be used to either indicate to the system that the captive
* {@link #ignoreNetworkWithCaptivePortal}. Retrieve it with * portal has been dismissed or that the user does not want to pursue
* {@link android.content.Intent#getStringExtra(String)}. * signing in to captive portal. Retrieve it with
* {@link android.content.Intent#getParcelableExtra(String)}.
*/ */
public static final String EXTRA_CAPTIVE_PORTAL_TOKEN = "captivePortalToken"; public static final String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL";
/** /**
* Broadcast action to indicate the change of data activity status * Broadcast action to indicate the change of data activity status
* (idle or active) on a network in a recent period. * (idle or active) on a network in a recent period.
@@ -1779,82 +1778,6 @@ public class ConnectivityManager {
} }
} }
/** {@hide} */
public static final int CAPTIVE_PORTAL_APP_RETURN_DISMISSED = 0;
/** {@hide} */
public static final int CAPTIVE_PORTAL_APP_RETURN_UNWANTED = 1;
/** {@hide} */
public static final int CAPTIVE_PORTAL_APP_RETURN_WANTED_AS_IS = 2;
/**
* Called by an app handling the {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN}
* action to indicate to the system that the captive portal has been
* dismissed. In response the framework will re-evaluate the network's
* connectivity and might take further action thereafter.
*
* @param network The {@link Network} object passed via
* {@link #EXTRA_NETWORK} with the
* {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
* @param actionToken The {@code String} passed via
* {@link #EXTRA_CAPTIVE_PORTAL_TOKEN} with the
* {@code ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
*/
public void reportCaptivePortalDismissed(Network network, String actionToken) {
try {
mService.captivePortalAppResponse(network, CAPTIVE_PORTAL_APP_RETURN_DISMISSED,
actionToken);
} catch (RemoteException e) {
}
}
/**
* Called by an app handling the {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN}
* action to indicate that the user does not want to pursue signing in to
* captive portal and the system should continue to prefer other networks
* without captive portals for use as the default active data network. The
* system will not retest the network for a captive portal so as to avoid
* disturbing the user with further sign in to network notifications.
*
* @param network The {@link Network} object passed via
* {@link #EXTRA_NETWORK} with the
* {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
* @param actionToken The {@code String} passed via
* {@link #EXTRA_CAPTIVE_PORTAL_TOKEN} with the
* {@code ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
*/
public void ignoreNetworkWithCaptivePortal(Network network, String actionToken) {
try {
mService.captivePortalAppResponse(network, CAPTIVE_PORTAL_APP_RETURN_UNWANTED,
actionToken);
} catch (RemoteException e) {
}
}
/**
* Called by an app handling the {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN}
* action to indicate the user wants to use this network as is, even though
* the captive portal is still in place. The system will treat the network
* as if it did not have a captive portal when selecting the network to use
* as the default active data network. This may result in this network
* becoming the default active data network, which could disrupt network
* connectivity for apps because the captive portal is still in place.
*
* @param network The {@link Network} object passed via
* {@link #EXTRA_NETWORK} with the
* {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
* @param actionToken The {@code String} passed via
* {@link #EXTRA_CAPTIVE_PORTAL_TOKEN} with the
* {@code ACTION_CAPTIVE_PORTAL_SIGN_IN} action.
* @hide
*/
public void useNetworkWithCaptivePortal(Network network, String actionToken) {
try {
mService.captivePortalAppResponse(network, CAPTIVE_PORTAL_APP_RETURN_WANTED_AS_IS,
actionToken);
} catch (RemoteException e) {
}
}
/** /**
* Set a network-independent global http proxy. This is not normally what you want * Set a network-independent global http proxy. This is not normally what you want
* for typical HTTP proxies - they are general network dependent. However if you're * for typical HTTP proxies - they are general network dependent. However if you're

View File

@@ -96,8 +96,6 @@ interface IConnectivityManager
void reportNetworkConnectivity(in Network network, boolean hasConnectivity); void reportNetworkConnectivity(in Network network, boolean hasConnectivity);
void captivePortalAppResponse(in Network network, int response, String actionToken);
ProxyInfo getGlobalProxy(); ProxyInfo getGlobalProxy();
void setGlobalProxy(in ProxyInfo p); void setGlobalProxy(in ProxyInfo p);

View File

@@ -2750,16 +2750,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
public void captivePortalAppResponse(Network network, int response, String actionToken) {
if (response == ConnectivityManager.CAPTIVE_PORTAL_APP_RETURN_WANTED_AS_IS) {
enforceConnectivityInternalPermission();
}
final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
if (nai == null) return;
nai.networkMonitor.sendMessage(NetworkMonitor.CMD_CAPTIVE_PORTAL_APP_FINISHED, response, 0,
actionToken);
}
private ProxyInfo getDefaultProxy() { private ProxyInfo getDefaultProxy() {
// this information is already available as a world read/writable jvm property // this information is already available as a world read/writable jvm property
// so this API change wouldn't have a benifit. It also breaks the passing // so this API change wouldn't have a benifit. It also breaks the passing