1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.net;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.annotation.SuppressLint;
22 import android.annotation.SystemApi;
23 import android.compat.annotation.UnsupportedAppUsage;
24 import android.os.Build;
25 import android.os.Parcel;
26 import android.os.Parcelable;
27 
28 import java.util.Objects;
29 
30 /**
31  * A class representing a configured network.
32  * @hide
33  */
34 @SystemApi
35 public final class IpConfiguration implements Parcelable {
36     private static final String TAG = "IpConfiguration";
37 
38     // This enum has been used by apps through reflection for many releases.
39     // Therefore they can't just be removed. Duplicating these constants to
40     // give an alternate SystemApi is a worse option than exposing them.
41     @SuppressLint("Enum")
42     public enum IpAssignment {
43         /* Use statically configured IP settings. Configuration can be accessed
44          * with staticIpConfiguration */
45         STATIC,
46         /* Use dynamically configured IP settings */
47         DHCP,
48         /* no IP details are assigned, this is used to indicate
49          * that any existing IP settings should be retained */
50         UNASSIGNED
51     }
52 
53     /** @hide */
54     public IpAssignment ipAssignment;
55 
56     /** @hide */
57     public StaticIpConfiguration staticIpConfiguration;
58 
59     // This enum has been used by apps through reflection for many releases.
60     // Therefore they can't just be removed. Duplicating these constants to
61     // give an alternate SystemApi is a worse option than exposing them.
62     @SuppressLint("Enum")
63     public enum ProxySettings {
64         /* No proxy is to be used. Any existing proxy settings
65          * should be cleared. */
66         NONE,
67         /* Use statically configured proxy. Configuration can be accessed
68          * with httpProxy. */
69         STATIC,
70         /* no proxy details are assigned, this is used to indicate
71          * that any existing proxy settings should be retained */
72         UNASSIGNED,
73         /* Use a Pac based proxy.
74          */
75         PAC
76     }
77 
78     /** @hide */
79     public ProxySettings proxySettings;
80 
81     /** @hide */
82     @UnsupportedAppUsage
83     public ProxyInfo httpProxy;
84 
85     private void init(IpAssignment ipAssignment,
86                       ProxySettings proxySettings,
87                       StaticIpConfiguration staticIpConfiguration,
88                       ProxyInfo httpProxy) {
89         this.ipAssignment = ipAssignment;
90         this.proxySettings = proxySettings;
91         this.staticIpConfiguration = (staticIpConfiguration == null) ?
92                 null : new StaticIpConfiguration(staticIpConfiguration);
93         this.httpProxy = (httpProxy == null) ?
94                 null : new ProxyInfo(httpProxy);
95     }
96 
97     public IpConfiguration() {
98         init(IpAssignment.UNASSIGNED, ProxySettings.UNASSIGNED, null, null);
99     }
100 
101     /** @hide */
102     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
103     public IpConfiguration(IpAssignment ipAssignment,
104                            ProxySettings proxySettings,
105                            StaticIpConfiguration staticIpConfiguration,
106                            ProxyInfo httpProxy) {
107         init(ipAssignment, proxySettings, staticIpConfiguration, httpProxy);
108     }
109 
110     public IpConfiguration(@NonNull IpConfiguration source) {
111         this();
112         if (source != null) {
113             init(source.ipAssignment, source.proxySettings,
114                  source.staticIpConfiguration, source.httpProxy);
115         }
116     }
117 
118     public @NonNull IpAssignment getIpAssignment() {
119         return ipAssignment;
120     }
121 
122     public void setIpAssignment(@NonNull IpAssignment ipAssignment) {
123         this.ipAssignment = ipAssignment;
124     }
125 
126     public @Nullable StaticIpConfiguration getStaticIpConfiguration() {
127         return staticIpConfiguration;
128     }
129 
130     public void setStaticIpConfiguration(@Nullable StaticIpConfiguration staticIpConfiguration) {
131         this.staticIpConfiguration = staticIpConfiguration;
132     }
133 
134     public @NonNull ProxySettings getProxySettings() {
135         return proxySettings;
136     }
137 
138     public void setProxySettings(@NonNull ProxySettings proxySettings) {
139         this.proxySettings = proxySettings;
140     }
141 
142     public @Nullable ProxyInfo getHttpProxy() {
143         return httpProxy;
144     }
145 
146     public void setHttpProxy(@Nullable ProxyInfo httpProxy) {
147         this.httpProxy = httpProxy;
148     }
149 
150     @Override
151     public String toString() {
152         StringBuilder sbuf = new StringBuilder();
153         sbuf.append("IP assignment: " + ipAssignment.toString());
154         sbuf.append("\n");
155         if (staticIpConfiguration != null) {
156             sbuf.append("Static configuration: " + staticIpConfiguration.toString());
157             sbuf.append("\n");
158         }
159         sbuf.append("Proxy settings: " + proxySettings.toString());
160         sbuf.append("\n");
161         if (httpProxy != null) {
162             sbuf.append("HTTP proxy: " + httpProxy.toString());
163             sbuf.append("\n");
164         }
165 
166         return sbuf.toString();
167     }
168 
169     @Override
170     public boolean equals(@Nullable Object o) {
171         if (o == this) {
172             return true;
173         }
174 
175         if (!(o instanceof IpConfiguration)) {
176             return false;
177         }
178 
179         IpConfiguration other = (IpConfiguration) o;
180         return this.ipAssignment == other.ipAssignment &&
181                 this.proxySettings == other.proxySettings &&
182                 Objects.equals(this.staticIpConfiguration, other.staticIpConfiguration) &&
183                 Objects.equals(this.httpProxy, other.httpProxy);
184     }
185 
186     @Override
187     public int hashCode() {
188         return 13 + (staticIpConfiguration != null ? staticIpConfiguration.hashCode() : 0) +
189                17 * ipAssignment.ordinal() +
190                47 * proxySettings.ordinal() +
191                83 * httpProxy.hashCode();
192     }
193 
194     /** Implement the Parcelable interface */
195     public int describeContents() {
196         return 0;
197     }
198 
199     /** Implement the Parcelable interface */
200     public void writeToParcel(@NonNull Parcel dest, int flags) {
201         dest.writeString(ipAssignment.name());
202         dest.writeString(proxySettings.name());
203         dest.writeParcelable(staticIpConfiguration, flags);
204         dest.writeParcelable(httpProxy, flags);
205     }
206 
207     /** Implement the Parcelable interface */
208     public static final @NonNull Creator<IpConfiguration> CREATOR =
209         new Creator<IpConfiguration>() {
210             public IpConfiguration createFromParcel(Parcel in) {
211                 IpConfiguration config = new IpConfiguration();
212                 config.ipAssignment = IpAssignment.valueOf(in.readString());
213                 config.proxySettings = ProxySettings.valueOf(in.readString());
214                 config.staticIpConfiguration = in.readParcelable(null);
215                 config.httpProxy = in.readParcelable(null);
216                 return config;
217             }
218 
219             public IpConfiguration[] newArray(int size) {
220                 return new IpConfiguration[size];
221             }
222         };
223 }
224