Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7097116e authored by Remi NGUYEN VAN's avatar Remi NGUYEN VAN Committed by android-build-merger
Browse files

Merge "Migrate bluetooth tethering to IIpclient" am: 69b5d17a am: b7c5e1f9

am: 73fd6ef3

Change-Id: I7173bd22fa6a0bd07f93f4027504aa3a816fd2df
parents da453ea7 73fd6ef3
Loading
Loading
Loading
Loading
+64 −19
Original line number Original line Diff line number Diff line
@@ -25,12 +25,17 @@ import android.net.NetworkCapabilities;
import android.net.NetworkFactory;
import android.net.NetworkFactory;
import android.net.NetworkInfo;
import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState;
import android.net.NetworkInfo.DetailedState;
import android.net.ip.IpClient;
import android.net.ip.IIpClient;
import android.net.ip.IpClient.WaitForProvisioningCallback;
import android.net.ip.IpClientUtil;
import android.net.ip.IpClientUtil.WaitForProvisioningCallbacks;
import android.net.shared.ProvisioningConfiguration;
import android.os.Looper;
import android.os.Looper;
import android.os.RemoteException;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.Slog;
import android.util.Slog;


import com.android.internal.annotations.GuardedBy;

/**
/**
 * This class tracks the data connection associated with Bluetooth
 * This class tracks the data connection associated with Bluetooth
 * reverse tethering. PanService calls it when a reverse tethered
 * reverse tethering. PanService calls it when a reverse tethered
@@ -49,7 +54,9 @@ public class BluetoothTetheringNetworkFactory extends NetworkFactory {


    // All accesses to these must be synchronized(this).
    // All accesses to these must be synchronized(this).
    private final NetworkInfo mNetworkInfo;
    private final NetworkInfo mNetworkInfo;
    private IpClient mIpClient;
    private IIpClient mIpClient;
    @GuardedBy("this")
    private int mIpClientStartIndex = 0;
    private String mInterfaceName;
    private String mInterfaceName;
    private NetworkAgent mNetworkAgent;
    private NetworkAgent mNetworkAgent;


@@ -65,13 +72,64 @@ public class BluetoothTetheringNetworkFactory extends NetworkFactory {
        setCapabilityFilter(mNetworkCapabilities);
        setCapabilityFilter(mNetworkCapabilities);
    }
    }


    private class BtIpClientCallback extends WaitForProvisioningCallbacks {
        private final int mCurrentStartIndex;

        private BtIpClientCallback(int currentStartIndex) {
            mCurrentStartIndex = currentStartIndex;
        }

        @Override
        public void onIpClientCreated(IIpClient ipClient) {
            synchronized (BluetoothTetheringNetworkFactory.this) {
                if (mCurrentStartIndex != mIpClientStartIndex) {
                    // Do not start IpClient: the current request is obsolete.
                    // IpClient will be GCed eventually as the IIpClient Binder token goes out
                    // of scope.
                    return;
                }
                mIpClient = ipClient;
                try {
                    mIpClient.startProvisioning(new ProvisioningConfiguration.Builder()
                            .withoutMultinetworkPolicyTracker()
                            .withoutIpReachabilityMonitor()
                            .build().toStableParcelable());
                } catch (RemoteException e) {
                    Slog.e(TAG, "Error starting IpClient provisioning", e);
                }
            }
        }

        @Override
        public void onLinkPropertiesChange(LinkProperties newLp) {
            synchronized (BluetoothTetheringNetworkFactory.this) {
                if (mNetworkAgent != null && mNetworkInfo.isConnected()) {
                    mNetworkAgent.sendLinkProperties(newLp);
                }
            }
        }
    }

    private void stopIpClientLocked() {
    private void stopIpClientLocked() {
        // Mark all previous start requests as obsolete
        mIpClientStartIndex++;
        if (mIpClient != null) {
        if (mIpClient != null) {
            try {
                mIpClient.shutdown();
                mIpClient.shutdown();
            } catch (RemoteException e) {
                Slog.e(TAG, "Error shutting down IpClient", e);
            }
            mIpClient = null;
            mIpClient = null;
        }
        }
    }
    }


    private BtIpClientCallback startIpClientLocked() {
        mIpClientStartIndex++;
        final BtIpClientCallback callback = new BtIpClientCallback(mIpClientStartIndex);
        IpClientUtil.makeIpClient(mContext, mInterfaceName, callback);
        return callback;
    }

    // Called by NetworkFactory when PanService and NetworkFactory both desire a Bluetooth
    // Called by NetworkFactory when PanService and NetworkFactory both desire a Bluetooth
    // reverse-tether connection.  A network interface for Bluetooth reverse-tethering can be
    // reverse-tether connection.  A network interface for Bluetooth reverse-tethering can be
    // assumed to be available because we only register our NetworkFactory when it is so.
    // assumed to be available because we only register our NetworkFactory when it is so.
@@ -84,16 +142,7 @@ public class BluetoothTetheringNetworkFactory extends NetworkFactory {
            @Override
            @Override
            public void run() {
            public void run() {
                LinkProperties linkProperties;
                LinkProperties linkProperties;
                final WaitForProvisioningCallback ipcCallback = new WaitForProvisioningCallback() {
                final WaitForProvisioningCallbacks ipcCallback;
                    @Override
                    public void onLinkPropertiesChange(LinkProperties newLp) {
                        synchronized (BluetoothTetheringNetworkFactory.this) {
                            if (mNetworkAgent != null && mNetworkInfo.isConnected()) {
                                mNetworkAgent.sendLinkProperties(newLp);
                            }
                        }
                    }
                };


                synchronized (BluetoothTetheringNetworkFactory.this) {
                synchronized (BluetoothTetheringNetworkFactory.this) {
                    if (TextUtils.isEmpty(mInterfaceName)) {
                    if (TextUtils.isEmpty(mInterfaceName)) {
@@ -102,11 +151,7 @@ public class BluetoothTetheringNetworkFactory extends NetworkFactory {
                    }
                    }
                    log("ipProvisioningThread(+" + mInterfaceName + "): " + "mNetworkInfo="
                    log("ipProvisioningThread(+" + mInterfaceName + "): " + "mNetworkInfo="
                            + mNetworkInfo);
                            + mNetworkInfo);
                    mIpClient = new IpClient(mContext, mInterfaceName, ipcCallback);
                    ipcCallback = startIpClientLocked();
                    mIpClient.startProvisioning(mIpClient.buildProvisioningConfiguration()
                            .withoutMultinetworkPolicyTracker()
                            .withoutIpReachabilityMonitor()
                            .build());
                    mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, null);
                    mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, null);
                }
                }