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