149e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen/*
249e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * Copyright (C) 2015 The Android Open Source Project
349e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen *
449e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * Licensed urnder the Apache License, Version 2.0 (the "License");
549e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * you may not use this file except in compliance with the License.
649e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * You may obtain a copy of the License at
749e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen *
849e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen *      http://www.apache.org/licenses/LICENSE-2.0
949e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen *
1049e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * Unless required by applicable law or agreed to in writing, software
1149e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * distributed under the License is distributed on an "AS IS" BASIS,
1249e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1349e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * See the License for the specific language governing permissions and
1449e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * limitations under the License.
1549e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen */
1649e3edff5156f471819e4ea2a88994bca70bd870Paul Jensenpackage android.net;
1749e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen
1849e3edff5156f471819e4ea2a88994bca70bd870Paul Jensenimport android.os.IBinder;
1949e3edff5156f471819e4ea2a88994bca70bd870Paul Jensenimport android.os.Parcel;
2049e3edff5156f471819e4ea2a88994bca70bd870Paul Jensenimport android.os.Parcelable;
2149e3edff5156f471819e4ea2a88994bca70bd870Paul Jensenimport android.os.RemoteException;
2249e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen
2349e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen/**
2449e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * A class allowing apps handling the {@link ConnectivityManager#ACTION_CAPTIVE_PORTAL_SIGN_IN}
2549e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * activity to indicate to the system different outcomes of captive portal sign in.  This class is
2649e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * passed as an extra named {@link ConnectivityManager#EXTRA_CAPTIVE_PORTAL} with the
2749e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen * {@code ACTION_CAPTIVE_PORTAL_SIGN_IN} activity.
2849e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen */
2949e3edff5156f471819e4ea2a88994bca70bd870Paul Jensenpublic class CaptivePortal implements Parcelable {
3049e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    /** @hide */
3149e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    public static final int APP_RETURN_DISMISSED    = 0;
3249e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    /** @hide */
3349e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    public static final int APP_RETURN_UNWANTED     = 1;
3449e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    /** @hide */
3549e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    public static final int APP_RETURN_WANTED_AS_IS = 2;
3649e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen
3749e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    private final IBinder mBinder;
3849e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen
3949e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    /** @hide */
4049e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    public CaptivePortal(IBinder binder) {
4149e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        mBinder = binder;
4249e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    }
4349e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen
4449e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    @Override
4549e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    public int describeContents() {
4649e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        return 0;
4749e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    }
4849e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen
4949e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    @Override
5049e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    public void writeToParcel(Parcel out, int flags) {
5149e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        out.writeStrongBinder(mBinder);
5249e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    }
5349e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen
5449e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    public static final Parcelable.Creator<CaptivePortal> CREATOR
5549e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen            = new Parcelable.Creator<CaptivePortal>() {
5649e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        @Override
5749e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        public CaptivePortal createFromParcel(Parcel in) {
5849e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen            return new CaptivePortal(in.readStrongBinder());
5949e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        }
6049e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen
6149e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        @Override
6249e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        public CaptivePortal[] newArray(int size) {
6349e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen            return new CaptivePortal[size];
6449e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        }
6549e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    };
6649e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen
6749e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    /**
6849e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * Indicate to the system that the captive portal has been
6949e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * dismissed.  In response the framework will re-evaluate the network's
7049e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * connectivity and might take further action thereafter.
7149e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     */
7249e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    public void reportCaptivePortalDismissed() {
7349e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        try {
7449e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen            ICaptivePortal.Stub.asInterface(mBinder).appResponse(APP_RETURN_DISMISSED);
7549e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        } catch (RemoteException e) {
7649e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        }
7749e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    }
7849e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen
7949e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    /**
8049e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * Indicate to the system that the user does not want to pursue signing in to the
8149e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * captive portal and the system should continue to prefer other networks
8249e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * without captive portals for use as the default active data network.  The
8349e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * system will not retest the network for a captive portal so as to avoid
8449e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * disturbing the user with further sign in to network notifications.
8549e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     */
8649e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    public void ignoreNetwork() {
8749e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        try {
8849e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen            ICaptivePortal.Stub.asInterface(mBinder).appResponse(APP_RETURN_UNWANTED);
8949e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        } catch (RemoteException e) {
9049e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        }
9149e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    }
9249e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen
9349e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    /**
9449e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * Indicate to the system the user wants to use this network as is, even though
9549e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * the captive portal is still in place.  The system will treat the network
9649e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * as if it did not have a captive portal when selecting the network to use
9749e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * as the default active data network. This may result in this network
9849e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * becoming the default active data network, which could disrupt network
9949e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * connectivity for apps because the captive portal is still in place.
10049e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     * @hide
10149e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen     */
10249e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    public void useNetwork() {
10349e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        try {
10449e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen            ICaptivePortal.Stub.asInterface(mBinder).appResponse(APP_RETURN_WANTED_AS_IS);
10549e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        } catch (RemoteException e) {
10649e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen        }
10749e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen    }
10849e3edff5156f471819e4ea2a88994bca70bd870Paul Jensen}
109