blob: 58d00487802c122a259791c0ab13700c7956ac4d [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.net;
import android.content.Context;
import android.os.Handler;
import android.os.Messenger;
import java.util.concurrent.atomic.AtomicBoolean;
import com.android.internal.util.Preconditions;
/**
* Interface to control and observe state of a specific network, hiding
* network-specific details from {@link ConnectivityManager}. Surfaces events
* through the registered {@link Handler} to enable {@link ConnectivityManager}
* to respond to state changes over time.
*
* @hide
*/
public abstract class BaseNetworkStateTracker implements NetworkStateTracker {
// TODO: better document threading expectations
// TODO: migrate to make NetworkStateTracker abstract class
public static final String PROP_TCP_BUFFER_UNKNOWN = "net.tcp.buffersize.unknown";
public static final String PROP_TCP_BUFFER_WIFI = "net.tcp.buffersize.wifi";
protected Context mContext;
private Handler mTarget;
protected NetworkInfo mNetworkInfo;
protected LinkProperties mLinkProperties;
protected NetworkCapabilities mNetworkCapabilities;
protected Network mNetwork = new Network(ConnectivityManager.NETID_UNSET);
private AtomicBoolean mTeardownRequested = new AtomicBoolean(false);
private AtomicBoolean mPrivateDnsRouteSet = new AtomicBoolean(false);
private AtomicBoolean mDefaultRouteSet = new AtomicBoolean(false);
public BaseNetworkStateTracker(int networkType) {
mNetworkInfo = new NetworkInfo(
networkType, -1, ConnectivityManager.getNetworkTypeName(networkType), null);
mLinkProperties = new LinkProperties();
mNetworkCapabilities = new NetworkCapabilities();
}
protected BaseNetworkStateTracker() {
// By default, let the sub classes construct everything
}
@Deprecated
protected Handler getTargetHandler() {
return mTarget;
}
protected final void dispatchStateChanged() {
// TODO: include snapshot of other fields when sending
mTarget.obtainMessage(EVENT_STATE_CHANGED, getNetworkInfo()).sendToTarget();
}
protected final void dispatchConfigurationChanged() {
// TODO: include snapshot of other fields when sending
mTarget.obtainMessage(EVENT_CONFIGURATION_CHANGED, getNetworkInfo()).sendToTarget();
}
@Override
public void startMonitoring(Context context, Handler target) {
mContext = Preconditions.checkNotNull(context);
mTarget = Preconditions.checkNotNull(target);
startMonitoringInternal();
}
protected void startMonitoringInternal() {
}
@Override
public NetworkInfo getNetworkInfo() {
return new NetworkInfo(mNetworkInfo);
}
@Override
public LinkProperties getLinkProperties() {
return new LinkProperties(mLinkProperties);
}
@Override
public NetworkCapabilities getNetworkCapabilities() {
return new NetworkCapabilities(mNetworkCapabilities);
}
@Override
public LinkQualityInfo getLinkQualityInfo() {
return null;
}
@Override
public void captivePortalCheckCompleted(boolean isCaptivePortal) {
// not implemented
}
@Override
public boolean setRadio(boolean turnOn) {
// Base tracker doesn't handle radios
return true;
}
@Override
public boolean isAvailable() {
return mNetworkInfo.isAvailable();
}
@Override
public void setUserDataEnable(boolean enabled) {
// Base tracker doesn't handle enabled flags
}
@Override
public void setPolicyDataEnable(boolean enabled) {
// Base tracker doesn't handle enabled flags
}
@Override
public boolean isPrivateDnsRouteSet() {
return mPrivateDnsRouteSet.get();
}
@Override
public void privateDnsRouteSet(boolean enabled) {
mPrivateDnsRouteSet.set(enabled);
}
@Override
public boolean isDefaultRouteSet() {
return mDefaultRouteSet.get();
}
@Override
public void defaultRouteSet(boolean enabled) {
mDefaultRouteSet.set(enabled);
}
@Override
public boolean isTeardownRequested() {
return mTeardownRequested.get();
}
@Override
public void setTeardownRequested(boolean isRequested) {
mTeardownRequested.set(isRequested);
}
@Override
public void setDependencyMet(boolean met) {
// Base tracker doesn't handle dependencies
}
@Override
public void addStackedLink(LinkProperties link) {
mLinkProperties.addStackedLink(link);
}
@Override
public void removeStackedLink(LinkProperties link) {
mLinkProperties.removeStackedLink(link);
}
@Override
public void supplyMessenger(Messenger messenger) {
// not supported on this network
}
@Override
public String getNetworkInterfaceName() {
if (mLinkProperties != null) {
return mLinkProperties.getInterfaceName();
} else {
return null;
}
}
@Override
public void startSampling(SamplingDataTracker.SamplingSnapshot s) {
// nothing to do
}
@Override
public void stopSampling(SamplingDataTracker.SamplingSnapshot s) {
// nothing to do
}
@Override
public void setNetId(int netId) {
mNetwork = new Network(netId);
}
@Override
public Network getNetwork() {
return mNetwork;
}
}