16346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim/*
26346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * Copyright (C) 2014 The Android Open Source Project
36346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim *
46346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * Licensed under the Apache License, Version 2.0 (the "License");
56346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * you may not use this file except in compliance with the License.
66346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * You may obtain a copy of the License at
76346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim *
86346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim *      http://www.apache.org/licenses/LICENSE-2.0
96346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim *
106346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * Unless required by applicable law or agreed to in writing, software
116346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * distributed under the License is distributed on an "AS IS" BASIS,
126346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * See the License for the specific language governing permissions and
146346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * limitations under the License.
156346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim */
166346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
176346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimpackage android.net;
186346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
190a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colittiimport android.net.StaticIpConfiguration;
206346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.os.Parcel;
216346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport android.os.Parcelable;
226346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
236346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimimport java.util.Objects;
246346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
256346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim/**
266346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * A class representing a configured network.
276346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim * @hide
286346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim */
296346155c5a48495944041e65ec279c88b0fa1391Jaewan Kimpublic class IpConfiguration implements Parcelable {
306346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    private static final String TAG = "IpConfiguration";
316346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
326346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public enum IpAssignment {
336346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        /* Use statically configured IP settings. Configuration can be accessed
340a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti         * with staticIpConfiguration */
356346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        STATIC,
366346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        /* Use dynamically configured IP settigns */
376346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        DHCP,
386346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        /* no IP details are assigned, this is used to indicate
396346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim         * that any existing IP settings should be retained */
406346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        UNASSIGNED
416346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
426346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
436346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpAssignment ipAssignment;
446346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
450a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public StaticIpConfiguration staticIpConfiguration;
460a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
476346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public enum ProxySettings {
486346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        /* No proxy is to be used. Any existing proxy settings
496346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim         * should be cleared. */
506346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        NONE,
516346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        /* Use statically configured proxy. Configuration can be accessed
520a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti         * with httpProxy. */
536346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        STATIC,
546346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        /* no proxy details are assigned, this is used to indicate
556346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim         * that any existing proxy settings should be retained */
566346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        UNASSIGNED,
576346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        /* Use a Pac based proxy.
586346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim         */
596346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        PAC
606346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
616346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
626346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public ProxySettings proxySettings;
636346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
640a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public ProxyInfo httpProxy;
656346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
660a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    private void init(IpAssignment ipAssignment,
670a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                      ProxySettings proxySettings,
680a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                      StaticIpConfiguration staticIpConfiguration,
690a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                      ProxyInfo httpProxy) {
700a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        this.ipAssignment = ipAssignment;
710a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        this.proxySettings = proxySettings;
720a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        this.staticIpConfiguration = (staticIpConfiguration == null) ?
730a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                null : new StaticIpConfiguration(staticIpConfiguration);
740a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        this.httpProxy = (httpProxy == null) ?
750a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                null : new ProxyInfo(httpProxy);
766346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
776346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
786346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfiguration() {
790a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        init(IpAssignment.UNASSIGNED, ProxySettings.UNASSIGNED, null, null);
806346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
816346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
826346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public IpConfiguration(IpAssignment ipAssignment,
836346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                           ProxySettings proxySettings,
840a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                           StaticIpConfiguration staticIpConfiguration,
850a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                           ProxyInfo httpProxy) {
860a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        init(ipAssignment, proxySettings, staticIpConfiguration, httpProxy);
870a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
880a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
890a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public IpConfiguration(IpConfiguration source) {
900a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        this();
910a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        if (source != null) {
920a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti            init(source.ipAssignment, source.proxySettings,
930a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                 source.staticIpConfiguration, source.httpProxy);
940a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        }
950a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
960a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
970a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public IpAssignment getIpAssignment() {
980a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        return ipAssignment;
990a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
1000a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
1010a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public void setIpAssignment(IpAssignment ipAssignment) {
1026346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        this.ipAssignment = ipAssignment;
1030a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
1040a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
1050a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public StaticIpConfiguration getStaticIpConfiguration() {
1060a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        return staticIpConfiguration;
1070a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
1080a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
1090a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public void setStaticIpConfiguration(StaticIpConfiguration staticIpConfiguration) {
1100a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        this.staticIpConfiguration = staticIpConfiguration;
1110a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
1120a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
1130a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public ProxySettings getProxySettings() {
1140a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        return proxySettings;
1150a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
1160a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
1170a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public void setProxySettings(ProxySettings proxySettings) {
1186346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        this.proxySettings = proxySettings;
1190a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
1200a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
1210a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public ProxyInfo getHttpProxy() {
1220a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        return httpProxy;
1230a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    }
1240a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti
1250a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    public void setHttpProxy(ProxyInfo httpProxy) {
1260a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        this.httpProxy = httpProxy;
1276346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
1286346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1296346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    @Override
1306346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public String toString() {
1316346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        StringBuilder sbuf = new StringBuilder();
1326346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        sbuf.append("IP assignment: " + ipAssignment.toString());
1336346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        sbuf.append("\n");
1340a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        if (staticIpConfiguration != null) {
1350a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti            sbuf.append("Static configuration: " + staticIpConfiguration.toString());
1360a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti            sbuf.append("\n");
1370a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        }
1386346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        sbuf.append("Proxy settings: " + proxySettings.toString());
1396346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        sbuf.append("\n");
1400a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        if (httpProxy != null) {
1410a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti            sbuf.append("HTTP proxy: " + httpProxy.toString());
1420a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti            sbuf.append("\n");
1430a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        }
1446346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1456346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return sbuf.toString();
1466346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
1476346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1486346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    @Override
1496346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public boolean equals(Object o) {
1506346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        if (o == this) {
1516346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            return true;
1526346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        }
1536346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1546346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        if (!(o instanceof IpConfiguration)) {
1556346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            return false;
1566346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        }
1576346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1586346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        IpConfiguration other = (IpConfiguration) o;
1596346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return this.ipAssignment == other.ipAssignment &&
1606346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                this.proxySettings == other.proxySettings &&
1610a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                Objects.equals(this.staticIpConfiguration, other.staticIpConfiguration) &&
1620a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                Objects.equals(this.httpProxy, other.httpProxy);
1636346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
1646346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1656346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    @Override
1666346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public int hashCode() {
1670a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        return 13 + (staticIpConfiguration != null ? staticIpConfiguration.hashCode() : 0) +
1686346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim               17 * ipAssignment.ordinal() +
1690a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti               47 * proxySettings.ordinal() +
1700a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti               83 * httpProxy.hashCode();
1716346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
1726346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1736346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** Implement the Parcelable interface */
1746346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public int describeContents() {
1756346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        return 0;
1766346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
1776346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1786346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** Implement the Parcelable interface  */
1796346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public void writeToParcel(Parcel dest, int flags) {
1806346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        dest.writeString(ipAssignment.name());
1816346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        dest.writeString(proxySettings.name());
1820a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        dest.writeParcelable(staticIpConfiguration, flags);
1830a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        dest.writeParcelable(httpProxy, flags);
1846346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    }
1856346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1866346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    /** Implement the Parcelable interface */
1876346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim    public static final Creator<IpConfiguration> CREATOR =
1886346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        new Creator<IpConfiguration>() {
1896346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            public IpConfiguration createFromParcel(Parcel in) {
1906346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                IpConfiguration config = new IpConfiguration();
1916346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                config.ipAssignment = IpAssignment.valueOf(in.readString());
1926346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                config.proxySettings = ProxySettings.valueOf(in.readString());
1930a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                config.staticIpConfiguration = in.readParcelable(null);
1940a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                config.httpProxy = in.readParcelable(null);
1956346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                return config;
1966346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            }
1976346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim
1986346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            public IpConfiguration[] newArray(int size) {
1996346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim                return new IpConfiguration[size];
2006346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim            }
2016346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim        };
2026346155c5a48495944041e65ec279c88b0fa1391Jaewan Kim}
203