Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 177cd38b authored by Paul Jensen's avatar Paul Jensen Committed by Android (Google) Code Review
Browse files

Merge "Remove captive portal sign-in actions." into lmp-dev

parents 00c2ff3d a68d2135
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -17054,15 +17054,10 @@ package android.net {
    method public void unregisterDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
    method public void unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback);
    field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
    field public static final java.lang.String ACTION_CAPTIVE_PORTAL_DETECTED = "android.net.conn.CAPTIVE_PORTAL_DETECTED";
    field public static final java.lang.String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL_SIGN_IN";
    field public static final int CAPTIVE_PORTAL_DISCONNECT = 2; // 0x2
    field public static final int CAPTIVE_PORTAL_SIGNED_IN = 1; // 0x1
    field public static final java.lang.String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
    field public static final deprecated int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
    field public static final java.lang.String EXTRA_EXTRA_INFO = "extraInfo";
    field public static final java.lang.String EXTRA_IS_FAILOVER = "isFailover";
    field public static final java.lang.String EXTRA_NETWORK = "network";
    field public static final deprecated java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
    field public static final java.lang.String EXTRA_NETWORK_TYPE = "networkType";
    field public static final java.lang.String EXTRA_NO_CONNECTIVITY = "noConnectivity";
+0 −92
Original line number Diff line number Diff line
@@ -283,98 +283,6 @@ public class ConnectivityManager {
     */
    public static final String EXTRA_IS_CAPTIVE_PORTAL = "captivePortal";

    /**
     * Broadcast Action: A connection has been established to a new network
     * but a captive portal has been detected preventing internet connectivity.
     * This broadcast is sent out prior to providing the user with a
     * notification allowing them to sign into the network, as such it should
     * only be used by apps that can automatically and silently (without user
     * interaction) log into specific captive portals.  It should not be used
     * by apps that prompt the user to sign in, as the user has not yet
     * indicated they want to proceed with signing in.
     * The new network is not the default network so it can only be accessed via
     * the {@link Network} extra {@link #EXTRA_NETWORK}.
     * This is an ordered broadcast and so it is perfectly acceptable for
     * multiple receivers to in turn consider whether they are best suited to
     * address the captive portal.
     * A receiver should abort the broadcast if they are sure they are the
     * appropriate handler of the captive portal.  If the broadcast is aborted,
     * the result code must be set to one of the following:
     * <ul>
     *   <li>{@link #CAPTIVE_PORTAL_SIGNED_IN} The receiver has signed into the
     *       captive portal.  After being verified to provide internet
     *       connectivity, this network will be made the default (assuming
     *       it is preferred over all other active networks).
     *   </li>
     *   <li>{@link #CAPTIVE_PORTAL_DISCONNECT} The receiver is familiar with
     *       this captive portal and knows sign-in is impossible or the user
     *       has indicated they do not want to pursue sign-in.  No other apps
     *       will be given the option of signing in to the network.
     *   </li>
     * </ul>
     */
    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    public static final String ACTION_CAPTIVE_PORTAL_DETECTED =
            "android.net.conn.CAPTIVE_PORTAL_DETECTED";

    /**
     * Broadcast Action: A connection has been established to a new network,
     * a captive portal has been detected preventing internet connectivity,
     * the user was notified, and elected to sign into the captive portal.
     * It may be used by apps that prompt the user to sign in.
     * The new network is not the default network so it can only be accessed via
     * the {@link Network} extra {@link #EXTRA_NETWORK}.
     * This is an ordered broadcast and so it is perfectly acceptable for
     * multiple receivers to in turn consider whether they are best suited to
     * address the captive portal.
     * A receiver should abort the broadcast if they are sure they are the
     * appropriate handler of the captive portal.  If the broadcast is aborted,
     * the result code must be set to one of the following:
     * <ul>
     *   <li>{@link #CAPTIVE_PORTAL_SIGNED_IN} The receiver has signed into the
     *       captive portal.  After being verified to provide internet
     *       connectivity, this network will be made the default (assuming
     *       it is preferred over all other active networks).
     *   </li>
     *   <li>{@link #CAPTIVE_PORTAL_DISCONNECT} The user has indicated they do
     *       not want to pursue sign-in.  No other apps will be given the
     *       option of signing in to the network.
     *   </li>
     * </ul>
     */
    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    public static final String ACTION_CAPTIVE_PORTAL_SIGN_IN =
            "android.net.conn.CAPTIVE_PORTAL_SIGN_IN";

    /**
     * The lookup key for a {@link Network} object passed along with a
     * {@link #ACTION_CAPTIVE_PORTAL_DETECTED} or
     * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} intent.  This network is not the
     * default network and must be accessed using this {@link Network} object.
     * Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
     */
    public static final String EXTRA_NETWORK = "network";

    /**
     * Specified as a result code of a {@link #ACTION_CAPTIVE_PORTAL_DETECTED} or
     * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} receiver to indicate
     * the receiver has signed into the
     * captive portal.  After being verified to provide internet
     * connectivity, this network will be made the default (assuming
     * it is preferred over all other active networks).
     */
    public static final int CAPTIVE_PORTAL_SIGNED_IN = 1;

    /**
     * Specified as a result code of a {@link #ACTION_CAPTIVE_PORTAL_DETECTED} or
     * {@link #ACTION_CAPTIVE_PORTAL_SIGN_IN} receiver to indicate
     * the receiver is familiar with
     * this captive portal and knows sign-in is impossible or the user
     * has indicated they do not want to pursue sign-in.  No other apps will
     * be given the option of signing in to the network.
     */
    public static final int CAPTIVE_PORTAL_DISCONNECT = 2;

    /**
     * The absence of a connection type.
     * @hide
+2 −100
Original line number Diff line number Diff line
@@ -223,9 +223,7 @@ public class NetworkMonitor extends StateMachine {
    private State mOfflineState = new OfflineState();
    private State mValidatedState = new ValidatedState();
    private State mEvaluatingState = new EvaluatingState();
    private State mUninteractiveAppsPromptedState = new UninteractiveAppsPromptedState();
    private State mUserPromptedState = new UserPromptedState();
    private State mInteractiveAppsPromptedState = new InteractiveAppsPromptedState();
    private State mCaptivePortalState = new CaptivePortalState();
    private State mLingeringState = new LingeringState();

@@ -243,9 +241,7 @@ public class NetworkMonitor extends StateMachine {
        addState(mOfflineState, mDefaultState);
        addState(mValidatedState, mDefaultState);
        addState(mEvaluatingState, mDefaultState);
        addState(mUninteractiveAppsPromptedState, mDefaultState);
        addState(mUserPromptedState, mDefaultState);
        addState(mInteractiveAppsPromptedState, mDefaultState);
        addState(mCaptivePortalState, mDefaultState);
        addState(mLingeringState, mDefaultState);
        setInitialState(mOfflineState);
@@ -368,7 +364,7 @@ public class NetworkMonitor extends StateMachine {
                    if (httpResponseCode == 204) {
                        transitionTo(mValidatedState);
                    } else if (httpResponseCode >= 200 && httpResponseCode <= 399) {
                        transitionTo(mUninteractiveAppsPromptedState);
                        transitionTo(mUserPromptedState);
                    } else if (++mRetries > MAX_RETRIES) {
                        transitionTo(mOfflineState);
                    } else if (mReevaluateDelayMs >= 0) {
@@ -382,71 +378,6 @@ public class NetworkMonitor extends StateMachine {
        }
    }

    private class AppRespondedBroadcastReceiver extends BroadcastReceiver {
        private static final int CAPTIVE_PORTAL_UNINITIALIZED_RETURN_CODE = 0;
        private boolean mCanceled;
        AppRespondedBroadcastReceiver() {
            mCanceled = false;
        }
        public void send(String action) {
            Intent intent = new Intent(action);
            intent.putExtra(ConnectivityManager.EXTRA_NETWORK, mNetworkAgentInfo.network);
            mContext.sendOrderedBroadcastAsUser(intent, UserHandle.ALL, null, this, getHandler(),
                    CAPTIVE_PORTAL_UNINITIALIZED_RETURN_CODE, null, null);
        }
        public void cancel() {
            mCanceled = true;
        }
        @Override
        public void onReceive(Context context, Intent intent) {
            if (!mCanceled) {
                cancel();
                switch (getResultCode()) {
                    case ConnectivityManager.CAPTIVE_PORTAL_SIGNED_IN:
                        sendMessage(EVENT_APP_BYPASSED_CAPTIVE_PORTAL);
                        break;
                    case ConnectivityManager.CAPTIVE_PORTAL_DISCONNECT:
                        sendMessage(EVENT_APP_INDICATES_SIGN_IN_IMPOSSIBLE);
                        break;
                    // NOTE: This case label makes compiler enforce no overlap between result codes.
                    case CAPTIVE_PORTAL_UNINITIALIZED_RETURN_CODE:
                    default:
                        sendMessage(EVENT_NO_APP_RESPONSE);
                        break;
                }
            }
        }
    }

    private class UninteractiveAppsPromptedState extends State {
        private AppRespondedBroadcastReceiver mReceiver;
        @Override
        public void enter() {
            mReceiver = new AppRespondedBroadcastReceiver();
            mReceiver.send(ConnectivityManager.ACTION_CAPTIVE_PORTAL_DETECTED);
        }
        @Override
        public boolean processMessage(Message message) {
            if (DBG) log(getName() + message.toString());
            switch (message.what) {
                case EVENT_APP_BYPASSED_CAPTIVE_PORTAL:
                    transitionTo(mValidatedState);
                    return HANDLED;
                case EVENT_APP_INDICATES_SIGN_IN_IMPOSSIBLE:
                    transitionTo(mOfflineState);
                    return HANDLED;
                case EVENT_NO_APP_RESPONSE:
                    transitionTo(mUserPromptedState);
                    return HANDLED;
                default:
                    return NOT_HANDLED;
            }
        }
        public void exit() {
            mReceiver.cancel();
        }
    }

    private class UserPromptedState extends State {
        private class UserRespondedBroadcastReceiver extends BroadcastReceiver {
            private final int mToken;
@@ -487,7 +418,7 @@ public class NetworkMonitor extends StateMachine {
                case CMD_USER_WANTS_SIGN_IN:
                    if (message.arg1 != mUserPromptedToken)
                        return HANDLED;
                    transitionTo(mInteractiveAppsPromptedState);
                    transitionTo(mCaptivePortalState);
                    return HANDLED;
                default:
                    return NOT_HANDLED;
@@ -504,35 +435,6 @@ public class NetworkMonitor extends StateMachine {
        }
    }

    private class InteractiveAppsPromptedState extends State {
        private AppRespondedBroadcastReceiver mReceiver;
        @Override
        public void enter() {
            mReceiver = new AppRespondedBroadcastReceiver();
            mReceiver.send(ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN);
        }
        @Override
        public boolean processMessage(Message message) {
            if (DBG) log(getName() + message.toString());
            switch (message.what) {
                case EVENT_APP_BYPASSED_CAPTIVE_PORTAL:
                    transitionTo(mValidatedState);
                    return HANDLED;
                case EVENT_APP_INDICATES_SIGN_IN_IMPOSSIBLE:
                    transitionTo(mOfflineState);
                    return HANDLED;
                case EVENT_NO_APP_RESPONSE:
                    transitionTo(mCaptivePortalState);
                    return HANDLED;
                default:
                    return NOT_HANDLED;
            }
        }
        public void exit() {
            mReceiver.cancel();
        }
    }

    private class CaptivePortalState extends State {
        private class CaptivePortalLoggedInBroadcastReceiver extends BroadcastReceiver {
            private final int mToken;