115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh/*
215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Copyright (C) 2010 The Android Open Source Project
315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh *
415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Licensed under the Apache License, Version 2.0 (the "License");
515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * you may not use this file except in compliance with the License.
615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * You may obtain a copy of the License at
715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh *
815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh *      http://www.apache.org/licenses/LICENSE-2.0
915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh *
1015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * Unless required by applicable law or agreed to in writing, software
1115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * distributed under the License is distributed on an "AS IS" BASIS,
1215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * See the License for the specific language governing permissions and
1415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * limitations under the License.
1515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */
1615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
1715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshpackage android.bluetooth;
1815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
1915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.content.Context;
2015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.ConnectivityManager;
210216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwaltimport android.net.DhcpInfoInternal;
2215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.LinkCapabilities;
2315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.LinkProperties;
2415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.NetworkInfo;
2515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.NetworkInfo.DetailedState;
2615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.NetworkStateTracker;
2715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.net.NetworkUtils;
2815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.os.Handler;
2915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.os.Message;
3015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport android.util.Log;
3115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
3215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport java.util.concurrent.atomic.AtomicBoolean;
3315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshimport java.util.concurrent.atomic.AtomicInteger;
3415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
3515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh/**
3615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * This class tracks the data connection associated with Bluetooth
3715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * reverse tethering. This is a singleton class and an instance will be
3815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * created by ConnectivityService. BluetoothService will call into this
3915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * when a reverse tethered connection needs to be activated.
4015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh *
4115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh * @hide
4215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh */
4315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganeshpublic class BluetoothTetheringDataTracker implements NetworkStateTracker {
4415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private static final String NETWORKTYPE = "BLUETOOTH_TETHER";
4515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private static final String TAG = "BluetoothTethering";
4615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
4715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private AtomicBoolean mTeardownRequested = new AtomicBoolean(false);
4815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private AtomicBoolean mPrivateDnsRouteSet = new AtomicBoolean(false);
4915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private AtomicInteger mDefaultGatewayAddr = new AtomicInteger(0);
5015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private AtomicBoolean mDefaultRouteSet = new AtomicBoolean(false);
5115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
5215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private LinkProperties mLinkProperties;
5315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private LinkCapabilities mLinkCapabilities;
5415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private NetworkInfo mNetworkInfo;
5515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
5615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private BluetoothPan mBluetoothPan;
5715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private BluetoothDevice mDevice;
5815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private static String mIface;
5915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
6015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /* For sending events to connectivity service handler */
6115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private Handler mCsHandler;
6215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private Context mContext;
6315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public static BluetoothTetheringDataTracker sInstance;
6415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
6515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    private BluetoothTetheringDataTracker() {
6615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_BLUETOOTH, 0, NETWORKTYPE, "");
6715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mLinkProperties = new LinkProperties();
6815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mLinkCapabilities = new LinkCapabilities();
6915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
7015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mNetworkInfo.setIsAvailable(false);
7115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        setTeardownRequested(false);
7215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
7315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
7415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public static synchronized BluetoothTetheringDataTracker getInstance() {
7515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        if (sInstance == null) sInstance = new BluetoothTetheringDataTracker();
7615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return sInstance;
7715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
7815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
7915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public Object Clone() throws CloneNotSupportedException {
8015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        throw new CloneNotSupportedException();
8115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
8215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
8315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public void setTeardownRequested(boolean isRequested) {
8415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mTeardownRequested.set(isRequested);
8515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
8615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
8715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public boolean isTeardownRequested() {
8815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return mTeardownRequested.get();
8915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
9015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
9115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
9215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Begin monitoring connectivity
9315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
9415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public void startMonitoring(Context context, Handler target) {
9515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mContext = context;
9615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mCsHandler = target;
9774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
9874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        if (adapter != null) {
9974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh            adapter.getProfileProxy(mContext, mProfileServiceListener, BluetoothProfile.PAN);
10074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        }
10115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
10215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
10374ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    private BluetoothProfile.ServiceListener mProfileServiceListener =
10474ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        new BluetoothProfile.ServiceListener() {
10574ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        public void onServiceConnected(int profile, BluetoothProfile proxy) {
10674ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh            mBluetoothPan = (BluetoothPan) proxy;
10774ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        }
10874ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        public void onServiceDisconnected(int profile) {
10974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh            mBluetoothPan = null;
11074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        }
11174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh    };
11274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh
11315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
11415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Disable connectivity to a network
11515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * TODO: do away with return value after making MobileDataStateTracker async
11615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
11715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public boolean teardown() {
11815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mTeardownRequested.set(true);
11974ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh        if (mBluetoothPan != null) {
12074ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh            for (BluetoothDevice device: mBluetoothPan.getConnectedDevices()) {
12174ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh                mBluetoothPan.disconnect(device);
12274ef1199459629c5dd9f272f8cd706d82cdfeeb1Jaikumar Ganesh            }
12315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        }
12415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return true;
12515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
12615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
12715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
12815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Re-enable connectivity to a network after a {@link #teardown()}.
12915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
13015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public boolean reconnect() {
13115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mTeardownRequested.set(false);
13215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        //Ignore
13315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return true;
13415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
13515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
13615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
13715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Turn the wireless radio off for a network.
13815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * @param turnOn {@code true} to turn the radio on, {@code false}
13915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
14015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public boolean setRadio(boolean turnOn) {
14115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return true;
14215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
14315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
14415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
14515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * @return true - If are we currently tethered with another device.
14615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
14715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public synchronized boolean isAvailable() {
14815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return mNetworkInfo.isAvailable();
14915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
15015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
15115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
15215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Tells the underlying networking system that the caller wants to
15315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * begin using the named feature. The interpretation of {@code feature}
15415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * is completely up to each networking implementation.
15515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * @param feature the name of the feature to be used
15615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * @param callingPid the process ID of the process that is issuing this request
15715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * @param callingUid the user ID of the process that is issuing this request
15815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * @return an integer value representing the outcome of the request.
15915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * The interpretation of this value is specific to each networking
16015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * implementation+feature combination, except that the value {@code -1}
16115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * always indicates failure.
16215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * TODO: needs to go away
16315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
16415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public int startUsingNetworkFeature(String feature, int callingPid, int callingUid) {
16515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return -1;
16615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
16715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
16815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
16915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Tells the underlying networking system that the caller is finished
17015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * using the named feature. The interpretation of {@code feature}
17115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * is completely up to each networking implementation.
17215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * @param feature the name of the feature that is no longer needed.
17315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * @param callingPid the process ID of the process that is issuing this request
17415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * @param callingUid the user ID of the process that is issuing this request
17515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * @return an integer value representing the outcome of the request.
17615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * The interpretation of this value is specific to each networking
17715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * implementation+feature combination, except that the value {@code -1}
17815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * always indicates failure.
17915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * TODO: needs to go away
18015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
18115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public int stopUsingNetworkFeature(String feature, int callingPid, int callingUid) {
18215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return -1;
18315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
18415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
1858e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey    @Override
1868e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey    public void setUserDataEnable(boolean enabled) {
1878e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey        Log.w(TAG, "ignoring setUserDataEnable(" + enabled + ")");
1888e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey    }
1898e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey
1908e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey    @Override
1918e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey    public void setPolicyDataEnable(boolean enabled) {
1928e28b7d78232f6cf08739ca0d129cc7f9e650801Jeff Sharkey        Log.w(TAG, "ignoring setPolicyDataEnable(" + enabled + ")");
19315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
19415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
19515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
19615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Check if private DNS route is set for the network
19715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
19815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public boolean isPrivateDnsRouteSet() {
19915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return mPrivateDnsRouteSet.get();
20015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
20115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
20215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
20315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Set a flag indicating private DNS route is set
20415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
20515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public void privateDnsRouteSet(boolean enabled) {
20615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mPrivateDnsRouteSet.set(enabled);
20715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
20815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
20915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
21015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Fetch NetworkInfo for the network
21115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
21215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public synchronized NetworkInfo getNetworkInfo() {
21315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return mNetworkInfo;
21415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
21515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
21615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
21715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Fetch LinkProperties for the network
21815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
21915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public synchronized LinkProperties getLinkProperties() {
22015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return new LinkProperties(mLinkProperties);
22115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
22215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
22315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh   /**
22415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * A capability is an Integer/String pair, the capabilities
22515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * are defined in the class LinkSocket#Key.
22615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     *
22715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * @return a copy of this connections capabilities, may be empty but never null.
22815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
22915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public LinkCapabilities getLinkCapabilities() {
23015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return new LinkCapabilities(mLinkCapabilities);
23115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
23215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
23315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
23415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Fetch default gateway address for the network
23515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
23615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public int getDefaultGatewayAddr() {
23715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return mDefaultGatewayAddr.get();
23815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
23915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
24015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
24115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Check if default route is set
24215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
24315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public boolean isDefaultRouteSet() {
24415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return mDefaultRouteSet.get();
24515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
24615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
24715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
24815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Set a flag indicating default route is set for the network
24915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
25015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public void defaultRouteSet(boolean enabled) {
25115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mDefaultRouteSet.set(enabled);
25215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
25315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
25415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    /**
25515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * Return the system properties name associated with the tcp buffer sizes
25615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     * for this network.
25715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh     */
25815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public String getTcpBufferSizesPropName() {
25915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        return "net.tcp.buffersize.wifi";
26015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
26115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
26215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
26315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public synchronized void startReverseTether(String iface, BluetoothDevice device) {
26415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mIface = iface;
26515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mDevice = device;
26615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        Thread dhcpThread = new Thread(new Runnable() {
26715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh            public void run() {
26815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                //TODO(): Add callbacks for failure and success case.
26915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                //Currently this thread runs independently.
2700216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                DhcpInfoInternal dhcpInfoInternal = new DhcpInfoInternal();
2710216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                if (!NetworkUtils.runDhcp(mIface, dhcpInfoInternal)) {
27215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                    Log.e(TAG, "DHCP request error:" + NetworkUtils.getDhcpError());
27315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                    return;
27415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                }
2750216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                mLinkProperties = dhcpInfoInternal.makeLinkProperties();
27615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                mLinkProperties.setInterfaceName(mIface);
27715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
27815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                mNetworkInfo.setIsAvailable(true);
27915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null);
28015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
28115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                Message msg = mCsHandler.obtainMessage(EVENT_CONFIGURATION_CHANGED, mNetworkInfo);
28215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                msg.sendToTarget();
28315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
28415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo);
28515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh                msg.sendToTarget();
28615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh            }
28715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        });
28815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        dhcpThread.start();
28915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
29015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
29115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    public synchronized void stopReverseTether(String iface) {
29215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        NetworkUtils.stopDhcp(iface);
29315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
29415c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mLinkProperties.clear();
29515c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mNetworkInfo.setIsAvailable(false);
29615c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null);
29715c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
29815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        Message msg = mCsHandler.obtainMessage(EVENT_CONFIGURATION_CHANGED, mNetworkInfo);
29915c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        msg.sendToTarget();
30015c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh
30115c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo);
30215c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh        msg.sendToTarget();
30315c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh    }
304d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt
305d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    public void setDependencyMet(boolean met) {
306d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt        // not supported on this network
307d55a6b498d66d8fc415908ecf63e50f46cce67e8Robert Greenwalt    }
30815c7439acb22ab079dd2ebe42bdf0d2ffd525c5dJaikumar Ganesh}
309