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 17 package android.net; 18 19 import android.content.Context; 20 import android.os.Handler; 21 import android.os.Messenger; 22 23 import java.util.concurrent.atomic.AtomicBoolean; 24 25 import 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 */ 35 public 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 supplyMessenger(Messenger messenger) { 174 // not supported on this network 175 } 176 177 @Override 178 public String getNetworkInterfaceName() { 179 if (mLinkProperties != null) { 180 return mLinkProperties.getInterfaceName(); 181 } else { 182 return null; 183 } 184 } 185 186 @Override 187 public void startSampling(SamplingDataTracker.SamplingSnapshot s) { 188 // nothing to do 189 } 190 191 @Override 192 public void stopSampling(SamplingDataTracker.SamplingSnapshot s) { 193 // nothing to do 194 } 195 196 @Override 197 public void setNetId(int netId) { 198 mNetwork = new Network(netId); 199 } 200 201 @Override 202 public Network getNetwork() { 203 return mNetwork; 204 } 205 } 206