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

Commit 153b4374 authored by Robert Greenwalt's avatar Robert Greenwalt
Browse files

Don't reset connections switching default->hipri

A usecase is to use hipri to keep alive 3g connections when wifi
is about to be brought up.  They are the same network, so don't
do the reset unless both are down.

This will go away when we get the deferred network downing.

bug:2865630
Change-Id: I07729b7776fe5ea129120c688cf7839a55a7ed95
parent 71cbae81
Loading
Loading
Loading
Loading
+105 −74
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.os.RemoteException;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.ServiceManager;
import com.android.internal.telephony.ITelephony;
@@ -50,7 +51,6 @@ public class MobileDataStateTracker implements NetworkStateTracker {
    private ITelephony mPhoneService;

    private String mApnType;
    private BroadcastReceiver mStateReceiver;
    private static String[] sDnsPropNames;
    private NetworkInfo mNetworkInfo;
    private boolean mTeardownRequested = false;
@@ -61,6 +61,10 @@ public class MobileDataStateTracker implements NetworkStateTracker {
    private int mDefaultGatewayAddr = 0;
    private boolean mDefaultRouteSet = false;

    // DEFAULT and HIPRI are the same connection.  If we're one of these we need to check if
    // the other is also disconnected before we reset sockets
    private boolean mIsDefaultOrHipri = false;

    /**
     * Create a new MobileDataStateTracker
     * @param context the application context of the caller
@@ -76,6 +80,10 @@ public class MobileDataStateTracker implements NetworkStateTracker {
                TelephonyManager.getDefault().getNetworkType(), tag,
                TelephonyManager.getDefault().getNetworkTypeName());
        mApnType = networkTypeToApnType(netType);
        if (netType == ConnectivityManager.TYPE_MOBILE ||
                netType == ConnectivityManager.TYPE_MOBILE_HIPRI) {
            mIsDefaultOrHipri = true;
        }

        mPhoneService = null;

@@ -90,7 +98,6 @@ public class MobileDataStateTracker implements NetworkStateTracker {
                "net.gprs.dns2",
                "net.ppp0.dns1",
                "net.ppp0.dns2"};

    }

    /**
@@ -141,8 +148,7 @@ public class MobileDataStateTracker implements NetworkStateTracker {
        filter.addAction(TelephonyIntents.ACTION_DATA_CONNECTION_FAILED);
        filter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);

        mStateReceiver = new MobileDataStateReceiver();
        mContext.registerReceiver(mStateReceiver, filter);
        mContext.registerReceiver(new MobileDataStateReceiver(), filter);
        mMobileDataState = Phone.DataState.DISCONNECTED;
    }

@@ -173,8 +179,9 @@ public class MobileDataStateTracker implements NetworkStateTracker {
    }

    private class MobileDataStateReceiver extends BroadcastReceiver {
        IConnectivityManager mConnectivityManager;

        public void onReceive(Context context, Intent intent) {
            synchronized(this) {
            if (intent.getAction().equals(TelephonyIntents.
                    ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) {
                String apnType = intent.getStringExtra(Phone.DATA_APN_TYPE_KEY);
@@ -204,7 +211,32 @@ public class MobileDataStateTracker implements NetworkStateTracker {
                            }

                            setDetailedState(DetailedState.DISCONNECTED, reason, apnName);
                                if (mNetworkProperties != null) {
                            boolean doReset = true;
                            if (mIsDefaultOrHipri == true) {
                                // both default and hipri must go down before we reset
                                int typeToCheck = (Phone.APN_TYPE_DEFAULT.equals(mApnType) ?
                                    ConnectivityManager.TYPE_MOBILE_HIPRI :
                                    ConnectivityManager.TYPE_MOBILE);
                                if (mConnectivityManager == null) {
                                    IBinder b = ServiceManager.getService(
                                            mContext.CONNECTIVITY_SERVICE);
                                    mConnectivityManager = IConnectivityManager.Stub.asInterface(b);
                                }
                                try {
                                    if (mConnectivityManager != null) {
                                        NetworkInfo info = mConnectivityManager.getNetworkInfo(
                                                typeToCheck);
                                        if (info.isConnected() == true) {
                                            doReset = false;
                                        }
                                    }
                                } catch (RemoteException e) {
                                    // just go ahead with the reset
                                    Log.e(TAG, "Exception trying to contact ConnService: "
                                            + e);
                                }
                            }
                            if (doReset && mNetworkProperties != null) {
                                String iface = mNetworkProperties.getInterfaceName();
                                if (iface != null) NetworkUtils.resetConnections(iface);
                            }
@@ -251,7 +283,6 @@ public class MobileDataStateTracker implements NetworkStateTracker {
            setSubtype(tm.getNetworkType(), tm.getNetworkTypeName());
        }
    }
    }

    private void getPhoneService(boolean forceRefresh) {
        if ((mPhoneService == null) || forceRefresh) {