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;
21899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
22899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkeyimport com.android.internal.util.Preconditions;
23899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
24899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkeyimport java.util.concurrent.atomic.AtomicBoolean;
25899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
26899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey/**
27899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * Interface to control and observe state of a specific network, hiding
28899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * network-specific details from {@link ConnectivityManager}. Surfaces events
29899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * through the registered {@link Handler} to enable {@link ConnectivityManager}
30899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * to respond to state changes over time.
31899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey *
32899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey * @hide
33899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey */
34899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkeypublic abstract class BaseNetworkStateTracker implements NetworkStateTracker {
35899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    // TODO: better document threading expectations
36899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    // TODO: migrate to make NetworkStateTracker abstract class
37899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
38899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public static final String PROP_TCP_BUFFER_UNKNOWN = "net.tcp.buffersize.unknown";
39899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public static final String PROP_TCP_BUFFER_WIFI = "net.tcp.buffersize.wifi";
40899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
41899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected Context mContext;
42899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    private Handler mTarget;
43899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
44899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected NetworkInfo mNetworkInfo;
45899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected LinkProperties mLinkProperties;
46899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected LinkCapabilities mLinkCapabilities;
47899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
48899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    private AtomicBoolean mTeardownRequested = new AtomicBoolean(false);
49899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    private AtomicBoolean mPrivateDnsRouteSet = new AtomicBoolean(false);
50899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    private AtomicBoolean mDefaultRouteSet = new AtomicBoolean(false);
51899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
52899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public BaseNetworkStateTracker(int networkType) {
53899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mNetworkInfo = new NetworkInfo(
54899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey                networkType, -1, ConnectivityManager.getNetworkTypeName(networkType), null);
55899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mLinkProperties = new LinkProperties();
56899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mLinkCapabilities = new LinkCapabilities();
57899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
58899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
59899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Deprecated
60899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected Handler getTargetHandler() {
61899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return mTarget;
62899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
63899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
64899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected final void dispatchStateChanged() {
65899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // TODO: include snapshot of other fields when sending
66899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mTarget.obtainMessage(EVENT_STATE_CHANGED, getNetworkInfo()).sendToTarget();
67899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
68899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
69899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected final void dispatchConfigurationChanged() {
70899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // TODO: include snapshot of other fields when sending
71899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mTarget.obtainMessage(EVENT_CONFIGURATION_CHANGED, getNetworkInfo()).sendToTarget();
72899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
73899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
74899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
75899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public final void startMonitoring(Context context, Handler target) {
76899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mContext = Preconditions.checkNotNull(context);
77899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mTarget = Preconditions.checkNotNull(target);
78899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        startMonitoringInternal();
79899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
80899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
81899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    protected abstract void startMonitoringInternal();
82899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
83899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
84899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public final NetworkInfo getNetworkInfo() {
85899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return new NetworkInfo(mNetworkInfo);
86899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
87899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
88899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
89899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public final LinkProperties getLinkProperties() {
90899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return new LinkProperties(mLinkProperties);
91899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
92899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
93899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
94899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public final LinkCapabilities getLinkCapabilities() {
95899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return new LinkCapabilities(mLinkCapabilities);
96899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
97899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
98899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
99c5fd6e59db10bb0069cf64394dce3955234757c1Irfan Sheriff    public void captivePortalCheckComplete() {
100c5fd6e59db10bb0069cf64394dce3955234757c1Irfan Sheriff        // not implemented
101c5fd6e59db10bb0069cf64394dce3955234757c1Irfan Sheriff    }
102c5fd6e59db10bb0069cf64394dce3955234757c1Irfan Sheriff
103c5fd6e59db10bb0069cf64394dce3955234757c1Irfan Sheriff    @Override
104899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public boolean setRadio(boolean turnOn) {
105899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // Base tracker doesn't handle radios
106899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return true;
107899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
108899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
109899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
110899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public boolean isAvailable() {
111899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return mNetworkInfo.isAvailable();
112899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
113899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
114899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
115899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void setUserDataEnable(boolean enabled) {
116899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // Base tracker doesn't handle enabled flags
117899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
118899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
119899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
120899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void setPolicyDataEnable(boolean enabled) {
121899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // Base tracker doesn't handle enabled flags
122899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
123899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
124899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
125899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public boolean isPrivateDnsRouteSet() {
126899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return mPrivateDnsRouteSet.get();
127899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
128899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
129899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
130899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void privateDnsRouteSet(boolean enabled) {
131899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mPrivateDnsRouteSet.set(enabled);
132899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
133899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
134899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
135899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public boolean isDefaultRouteSet() {
136899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return mDefaultRouteSet.get();
137899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
138899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
139899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
140899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void defaultRouteSet(boolean enabled) {
141899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mDefaultRouteSet.set(enabled);
142899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
143899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
144899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
145899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public boolean isTeardownRequested() {
146899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        return mTeardownRequested.get();
147899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
148899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
149899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
150899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void setTeardownRequested(boolean isRequested) {
151899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        mTeardownRequested.set(isRequested);
152899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
153899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey
154899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    @Override
155899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    public void setDependencyMet(boolean met) {
156899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey        // Base tracker doesn't handle dependencies
157899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey    }
158899223b97c9b0ae56a8211a46600914c0ecfd854Jeff Sharkey}
159