1/*
2 * Copyright (C) 2012 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
17package android.net;
18
19import android.content.Context;
20import android.os.Handler;
21import android.os.Messenger;
22
23import java.util.concurrent.atomic.AtomicBoolean;
24
25import com.android.internal.util.Preconditions;
26
27/**
28 * Interface to control and observe state of a specific network, hiding
29 * network-specific details from {@link ConnectivityManager}. Surfaces events
30 * through the registered {@link Handler} to enable {@link ConnectivityManager}
31 * to respond to state changes over time.
32 *
33 * @hide
34 */
35public abstract class BaseNetworkStateTracker implements NetworkStateTracker {
36    // TODO: better document threading expectations
37    // TODO: migrate to make NetworkStateTracker abstract class
38
39    public static final String PROP_TCP_BUFFER_UNKNOWN = "net.tcp.buffersize.unknown";
40    public static final String PROP_TCP_BUFFER_WIFI = "net.tcp.buffersize.wifi";
41
42    protected Context mContext;
43    private Handler mTarget;
44
45    protected NetworkInfo mNetworkInfo;
46    protected LinkProperties mLinkProperties;
47    protected NetworkCapabilities mNetworkCapabilities;
48    protected Network mNetwork = new Network(ConnectivityManager.NETID_UNSET);
49
50    private AtomicBoolean mTeardownRequested = new AtomicBoolean(false);
51    private AtomicBoolean mPrivateDnsRouteSet = new AtomicBoolean(false);
52    private AtomicBoolean mDefaultRouteSet = new AtomicBoolean(false);
53
54    public BaseNetworkStateTracker(int networkType) {
55        mNetworkInfo = new NetworkInfo(
56                networkType, -1, ConnectivityManager.getNetworkTypeName(networkType), null);
57        mLinkProperties = new LinkProperties();
58        mNetworkCapabilities = new NetworkCapabilities();
59    }
60
61    protected BaseNetworkStateTracker() {
62        // By default, let the sub classes construct everything
63    }
64
65    @Deprecated
66    protected Handler getTargetHandler() {
67        return mTarget;
68    }
69
70    protected final void dispatchStateChanged() {
71        // TODO: include snapshot of other fields when sending
72        mTarget.obtainMessage(EVENT_STATE_CHANGED, getNetworkInfo()).sendToTarget();
73    }
74
75    protected final void dispatchConfigurationChanged() {
76        // TODO: include snapshot of other fields when sending
77        mTarget.obtainMessage(EVENT_CONFIGURATION_CHANGED, getNetworkInfo()).sendToTarget();
78    }
79
80    @Override
81    public void startMonitoring(Context context, Handler target) {
82        mContext = Preconditions.checkNotNull(context);
83        mTarget = Preconditions.checkNotNull(target);
84        startMonitoringInternal();
85    }
86
87    protected void startMonitoringInternal() {
88
89    }
90
91    @Override
92    public NetworkInfo getNetworkInfo() {
93        return new NetworkInfo(mNetworkInfo);
94    }
95
96    @Override
97    public LinkProperties getLinkProperties() {
98        return new LinkProperties(mLinkProperties);
99    }
100
101    @Override
102    public NetworkCapabilities getNetworkCapabilities() {
103        return new NetworkCapabilities(mNetworkCapabilities);
104    }
105
106    @Override
107    public LinkQualityInfo getLinkQualityInfo() {
108        return null;
109    }
110
111    @Override
112    public void captivePortalCheckCompleted(boolean isCaptivePortal) {
113        // not implemented
114    }
115
116    @Override
117    public boolean setRadio(boolean turnOn) {
118        // Base tracker doesn't handle radios
119        return true;
120    }
121
122    @Override
123    public boolean isAvailable() {
124        return mNetworkInfo.isAvailable();
125    }
126
127    @Override
128    public void setUserDataEnable(boolean enabled) {
129        // Base tracker doesn't handle enabled flags
130    }
131
132    @Override
133    public void setPolicyDataEnable(boolean enabled) {
134        // Base tracker doesn't handle enabled flags
135    }
136
137    @Override
138    public boolean isPrivateDnsRouteSet() {
139        return mPrivateDnsRouteSet.get();
140    }
141
142    @Override
143    public void privateDnsRouteSet(boolean enabled) {
144        mPrivateDnsRouteSet.set(enabled);
145    }
146
147    @Override
148    public boolean isDefaultRouteSet() {
149        return mDefaultRouteSet.get();
150    }
151
152    @Override
153    public void defaultRouteSet(boolean enabled) {
154        mDefaultRouteSet.set(enabled);
155    }
156
157    @Override
158    public boolean isTeardownRequested() {
159        return mTeardownRequested.get();
160    }
161
162    @Override
163    public void setTeardownRequested(boolean isRequested) {
164        mTeardownRequested.set(isRequested);
165    }
166
167    @Override
168    public void setDependencyMet(boolean met) {
169        // Base tracker doesn't handle dependencies
170    }
171
172    @Override
173    public void addStackedLink(LinkProperties link) {
174        mLinkProperties.addStackedLink(link);
175    }
176
177    @Override
178    public void removeStackedLink(LinkProperties link) {
179        mLinkProperties.removeStackedLink(link);
180    }
181
182    @Override
183    public void supplyMessenger(Messenger messenger) {
184        // not supported on this network
185    }
186
187    @Override
188    public String getNetworkInterfaceName() {
189        if (mLinkProperties != null) {
190            return mLinkProperties.getInterfaceName();
191        } else {
192            return null;
193        }
194    }
195
196    @Override
197    public void startSampling(SamplingDataTracker.SamplingSnapshot s) {
198        // nothing to do
199    }
200
201    @Override
202    public void stopSampling(SamplingDataTracker.SamplingSnapshot s) {
203        // nothing to do
204    }
205
206    @Override
207    public void setNetId(int netId) {
208        mNetwork = new Network(netId);
209    }
210
211    @Override
212    public Network getNetwork() {
213        return mNetwork;
214    }
215}
216