diff --git a/core/java/android/net/CaptivePortal.java b/core/java/android/net/CaptivePortal.java new file mode 100644 index 0000000000..ee05f2832a --- /dev/null +++ b/core/java/android/net/CaptivePortal.java @@ -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 CREATOR + = new Parcelable.Creator() { + @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) { + } + } +} diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 01334c3a87..de7ca0c538 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -102,26 +102,26 @@ public class ConnectivityManager { * portal, which is blocking Internet connectivity. The user was presented * with a notification that network sign in is required, * 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 * {@link Network} typed extra called {@link #EXTRA_NETWORK} that represents * the network presenting the captive portal; all communication with the * captive portal must be done using this {@code Network} object. *

- * When the app handling this action believes the user has signed in to - * the network and the captive portal has been dismissed, the app should call - * {@link #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. - *

- * When the app handling this action believes the user explicitly wants + * This activity includes a {@link CaptivePortal} extra named + * {@link #EXTRA_CAPTIVE_PORTAL} that can be used to indicate different + * outcomes of the captive portal sign in to the system: + *

*/ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL"; @@ -187,16 +187,15 @@ public class ConnectivityManager { * {@hide} */ public static final String EXTRA_INET_CONDITION = "inetCondition"; - /** - * The lookup key for a string that is sent out with - * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN}. This string must be - * passed in to {@link #reportCaptivePortalDismissed} and - * {@link #ignoreNetworkWithCaptivePortal}. Retrieve it with - * {@link android.content.Intent#getStringExtra(String)}. + * The lookup key for a {@link CaptivePortal} object included with the + * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} intent. The {@code CaptivePortal} + * object can be used to either indicate to the system that the captive + * portal has been dismissed or that the user does not want to pursue + * 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 * (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 * for typical HTTP proxies - they are general network dependent. However if you're diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index 29557bb661..78f8b95fbb 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -96,8 +96,6 @@ interface IConnectivityManager void reportNetworkConnectivity(in Network network, boolean hasConnectivity); - void captivePortalAppResponse(in Network network, int response, String actionToken); - ProxyInfo getGlobalProxy(); void setGlobalProxy(in ProxyInfo p); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 8ca075f97d..672af5bebe 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -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() { // 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