1899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey/*
2899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * Copyright (C) 2012 The Android Open Source Project
3899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey *
4899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * you may not use this file except in compliance with the License.
6899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * You may obtain a copy of the License at
7899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey *
8899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey *
10899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * See the License for the specific language governing permissions and
14899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * limitations under the License.
15899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey */
16899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
17899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkeypackage android.net;
18899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
19899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkeyimport android.content.Context;
20899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkeyimport android.os.Handler;
21665e1aed5e99af1e66af56c0d73e32fd86f57273Robert Greenwaltimport android.os.Messenger;
22899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
23899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkeyimport java.util.concurrent.atomic.AtomicBoolean;
24899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
2598e1797367ca8cd8b8476f6befdb55f81cd13e19Narayan Kamathimport com.android.internal.util.Preconditions;
2698e1797367ca8cd8b8476f6befdb55f81cd13e19Narayan Kamath
27899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey/**
28899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * Interface to control and observe state of a specific network, hiding
29899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * network-specific details from {@link ConnectivityManager}. Surfaces events
30899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * through the registered {@link Handler} to enable {@link ConnectivityManager}
31899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * to respond to state changes over time.
32899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey *
33899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * @hide
34899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey */
35899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkeypublic abstract class BaseNetworkStateTracker implements NetworkStateTracker {
36899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    // TODO: better document threading expectations
37899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    // TODO: migrate to make NetworkStateTracker abstract class
38899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
39899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public static final String PROP_TCP_BUFFER_UNKNOWN = "net.tcp.buffersize.unknown";
40899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public static final String PROP_TCP_BUFFER_WIFI = "net.tcp.buffersize.wifi";
41899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
42899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected Context mContext;
43899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    private Handler mTarget;
44899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
45899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected NetworkInfo mNetworkInfo;
46899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected LinkProperties mLinkProperties;
47f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt    protected NetworkCapabilities mNetworkCapabilities;
48bcc76d345cdad2eff0f64d1dca9f92f94c8b9f07Paul Jensen    protected Network mNetwork = new Network(ConnectivityManager.NETID_UNSET);
49899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
50899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    private AtomicBoolean mTeardownRequested = new AtomicBoolean(false);
51899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    private AtomicBoolean mPrivateDnsRouteSet = new AtomicBoolean(false);
52899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    private AtomicBoolean mDefaultRouteSet = new AtomicBoolean(false);
53899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
54899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public BaseNetworkStateTracker(int networkType) {
55899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mNetworkInfo = new NetworkInfo(
56899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey                networkType, -1, ConnectivityManager.getNetworkTypeName(networkType), null);
57899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mLinkProperties = new LinkProperties();
58f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt        mNetworkCapabilities = new NetworkCapabilities();
59899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
60899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
611f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    protected BaseNetworkStateTracker() {
621f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde        // By default, let the sub classes construct everything
631f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    }
641f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde
65899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Deprecated
66899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected Handler getTargetHandler() {
67899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return mTarget;
68899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
69899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
70899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected final void dispatchStateChanged() {
71899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // TODO: include snapshot of other fields when sending
72899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mTarget.obtainMessage(EVENT_STATE_CHANGED, getNetworkInfo()).sendToTarget();
73899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
74899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
75899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected final void dispatchConfigurationChanged() {
76899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // TODO: include snapshot of other fields when sending
77899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mTarget.obtainMessage(EVENT_CONFIGURATION_CHANGED, getNetworkInfo()).sendToTarget();
78899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
79899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
80899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
811f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    public void startMonitoring(Context context, Handler target) {
82899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mContext = Preconditions.checkNotNull(context);
83899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mTarget = Preconditions.checkNotNull(target);
84899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        startMonitoringInternal();
85899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
86899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
871f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    protected void startMonitoringInternal() {
881f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde
891f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    }
90899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
91899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
921f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    public NetworkInfo getNetworkInfo() {
93899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return new NetworkInfo(mNetworkInfo);
94899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
95899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
96899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
971f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    public LinkProperties getLinkProperties() {
98899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return new LinkProperties(mLinkProperties);
99899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
100899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
101899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
102f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt    public NetworkCapabilities getNetworkCapabilities() {
103f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt        return new NetworkCapabilities(mNetworkCapabilities);
104899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
105899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
106899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
1076a2d32597a3f158f4ff5b07ad61c7d892d08f3bfVinit Deshapnde    public LinkQualityInfo getLinkQualityInfo() {
1081f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde        return null;
1091f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    }
1101f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde
1111f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    @Override
112d747cbc898ef44e59c3fbf74a8327b6a12aad397Wink Saville    public void captivePortalCheckCompleted(boolean isCaptivePortal) {
113d747cbc898ef44e59c3fbf74a8327b6a12aad397Wink Saville        // not implemented
114d747cbc898ef44e59c3fbf74a8327b6a12aad397Wink Saville    }
115d747cbc898ef44e59c3fbf74a8327b6a12aad397Wink Saville
116d747cbc898ef44e59c3fbf74a8327b6a12aad397Wink Saville    @Override
117899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public boolean setRadio(boolean turnOn) {
118899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // Base tracker doesn't handle radios
119899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return true;
120899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
121899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
122899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
123899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public boolean isAvailable() {
124899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return mNetworkInfo.isAvailable();
125899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
126899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
127899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
128899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void setUserDataEnable(boolean enabled) {
129899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // Base tracker doesn't handle enabled flags
130899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
131899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
132899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
133899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void setPolicyDataEnable(boolean enabled) {
134899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // Base tracker doesn't handle enabled flags
135899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
136899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
137899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
138899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public boolean isPrivateDnsRouteSet() {
139899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return mPrivateDnsRouteSet.get();
140899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
141899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
142899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
143899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void privateDnsRouteSet(boolean enabled) {
144899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mPrivateDnsRouteSet.set(enabled);
145899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
146899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
147899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
148899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public boolean isDefaultRouteSet() {
149899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return mDefaultRouteSet.get();
150899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
151899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
152899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
153899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void defaultRouteSet(boolean enabled) {
154899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mDefaultRouteSet.set(enabled);
155899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
156899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
157899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
158899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public boolean isTeardownRequested() {
159899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return mTeardownRequested.get();
160899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
161899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
162899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
163899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void setTeardownRequested(boolean isRequested) {
164899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mTeardownRequested.set(isRequested);
165899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
166899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
167899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
168899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void setDependencyMet(boolean met) {
169899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // Base tracker doesn't handle dependencies
170899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
17169edd64d9bf839428ce0a7723cd0f1deda98dc0dLorenzo Colitti
17269edd64d9bf839428ce0a7723cd0f1deda98dc0dLorenzo Colitti    @Override
17369edd64d9bf839428ce0a7723cd0f1deda98dc0dLorenzo Colitti    public void addStackedLink(LinkProperties link) {
17469edd64d9bf839428ce0a7723cd0f1deda98dc0dLorenzo Colitti        mLinkProperties.addStackedLink(link);
17569edd64d9bf839428ce0a7723cd0f1deda98dc0dLorenzo Colitti    }
17669edd64d9bf839428ce0a7723cd0f1deda98dc0dLorenzo Colitti
17769edd64d9bf839428ce0a7723cd0f1deda98dc0dLorenzo Colitti    @Override
17869edd64d9bf839428ce0a7723cd0f1deda98dc0dLorenzo Colitti    public void removeStackedLink(LinkProperties link) {
17969edd64d9bf839428ce0a7723cd0f1deda98dc0dLorenzo Colitti        mLinkProperties.removeStackedLink(link);
18069edd64d9bf839428ce0a7723cd0f1deda98dc0dLorenzo Colitti    }
181665e1aed5e99af1e66af56c0d73e32fd86f57273Robert Greenwalt
182665e1aed5e99af1e66af56c0d73e32fd86f57273Robert Greenwalt    @Override
183665e1aed5e99af1e66af56c0d73e32fd86f57273Robert Greenwalt    public void supplyMessenger(Messenger messenger) {
184665e1aed5e99af1e66af56c0d73e32fd86f57273Robert Greenwalt        // not supported on this network
185665e1aed5e99af1e66af56c0d73e32fd86f57273Robert Greenwalt    }
1861f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde
1871f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    @Override
1881f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    public String getNetworkInterfaceName() {
1891f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde        if (mLinkProperties != null) {
1901f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde            return mLinkProperties.getInterfaceName();
1911f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde        } else {
1921f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde            return null;
1931f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde        }
1941f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    }
1951f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde
1961f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    @Override
1971f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    public void startSampling(SamplingDataTracker.SamplingSnapshot s) {
1981f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde        // nothing to do
1991f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    }
2001f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde
2011f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    @Override
2021f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    public void stopSampling(SamplingDataTracker.SamplingSnapshot s) {
2031f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde        // nothing to do
2041f12cb52a494a3eaefc62d03a8d2fdf47a5535e9Vinit Deshapnde    }
2059ba9c58e4a249456794fbfb9989f27bd846d067eRobert Greenwalt
2069ba9c58e4a249456794fbfb9989f27bd846d067eRobert Greenwalt    @Override
2079ba9c58e4a249456794fbfb9989f27bd846d067eRobert Greenwalt    public void setNetId(int netId) {
2089ba9c58e4a249456794fbfb9989f27bd846d067eRobert Greenwalt        mNetwork = new Network(netId);
2099ba9c58e4a249456794fbfb9989f27bd846d067eRobert Greenwalt    }
2109ba9c58e4a249456794fbfb9989f27bd846d067eRobert Greenwalt
2119ba9c58e4a249456794fbfb9989f27bd846d067eRobert Greenwalt    @Override
2129ba9c58e4a249456794fbfb9989f27bd846d067eRobert Greenwalt    public Network getNetwork() {
2139ba9c58e4a249456794fbfb9989f27bd846d067eRobert Greenwalt        return mNetwork;
2149ba9c58e4a249456794fbfb9989f27bd846d067eRobert Greenwalt    }
215899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey}
216