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

Commit a7228870 authored by Robert Greenwalt's avatar Robert Greenwalt
Browse files

Fix use of memorized phoneId.

We remember the phoneId we used to make the request so when the request is released we can
talk to the proper DcTracker even if the subId -> phoneId mapping is lost (removed the sim).
However the list of requests is a singleton and entries are stored per requestId so
a request that applies to multiple phones only has a single entry - we can't record
the phone id at request submission time.

Change it to store the phoneId at request execution time.  This also removes the need
for a separate "has been executed" boolean since we won't have an executed-phoneId if
it's not been executed.

In the future we should get rid of multiple TelephonyNetworkFactories, simplifying all
this.

bug:24411288
Change-Id: Ie430e0a9251c3ae09384e1a4e29b65fe90f46740
parent 5dea1bc7
Loading
Loading
Loading
Loading
+6 −7
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.internal.telephony.dataconnection;
import android.net.NetworkRequest;
import android.net.NetworkRequest;
import android.os.Message;
import android.os.Message;
import android.telephony.Rlog;
import android.telephony.Rlog;
import android.telephony.SubscriptionManager;
import android.util.LocalLog;
import android.util.LocalLog;


import com.android.internal.util.AsyncChannel;
import com.android.internal.util.AsyncChannel;
@@ -64,18 +65,16 @@ public class DcSwitchAsyncChannel extends AsyncChannel {
    }
    }


    public static class RequestInfo {
    public static class RequestInfo {
        boolean executed;
        final NetworkRequest request;
        final NetworkRequest request;
        final int priority;
        final int priority;
        final int phoneId;
        int executedPhoneId;
        private final LocalLog requestLog;
        private final LocalLog requestLog;


        public RequestInfo(NetworkRequest request, int priority, LocalLog l, int phoneId) {
        public RequestInfo(NetworkRequest request, int priority, LocalLog l) {
            this.request = request;
            this.request = request;
            this.priority = priority;
            this.priority = priority;
            this.requestLog = l;
            this.requestLog = l;
            this.executed = false;
            this.executedPhoneId = SubscriptionManager.INVALID_PHONE_INDEX;
            this.phoneId = phoneId;
        }
        }


        public void log(String str) {
        public void log(String str) {
@@ -88,8 +87,8 @@ public class DcSwitchAsyncChannel extends AsyncChannel {


        @Override
        @Override
        public String toString() {
        public String toString() {
            return "[ request=" + request + ", executed=" + executed +
            return "[ request=" + request + ", executedPhoneId=" + executedPhoneId +
                ", priority=" + priority + ", phoneId=" + phoneId + "]";
                ", priority=" + priority + "]";
        }
        }
    }
    }


+36 −45
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@ import android.provider.Settings;
import android.telephony.Rlog;
import android.telephony.Rlog;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.text.TextUtils;
import android.util.LocalLog;
import android.util.LocalLog;
import android.util.SparseArray;
import android.util.SparseArray;


@@ -147,6 +148,7 @@ public class DctController extends Handler {
            mNetworkFilter[index] = null;
            mNetworkFilter[index] = null;
        }
        }


        // TODO - just make this a singleton.  It'll be simpler
        mNetworkFilter[index] = new NetworkCapabilities();
        mNetworkFilter[index] = new NetworkCapabilities();
        mNetworkFilter[index].addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
        mNetworkFilter[index].addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
        mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_MMS);
        mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_MMS);
@@ -310,14 +312,15 @@ public class DctController extends Handler {
        }
        }
    }
    }


    private int requestNetwork(NetworkRequest request, int priority, LocalLog l, int phoneId) {
    private int requestNetwork(NetworkRequest request, int priority, LocalLog l) {
        logd("requestNetwork request=" + request
        logd("requestNetwork request=" + request + ", priority=" + priority);
                + ", priority=" + priority);
        l.log("Dctc.requestNetwork, priority=" + priority);
        l.log("Dctc.requestNetwork, priority=" + priority);


        RequestInfo requestInfo = new RequestInfo(request, priority, l, phoneId);
        if (mRequestInfos.containsKey(request.requestId) == false) {
            RequestInfo requestInfo = new RequestInfo(request, priority, l);
            mRequestInfos.put(request.requestId, requestInfo);
            mRequestInfos.put(request.requestId, requestInfo);
            processRequests();
            processRequests();
        }


        return PhoneConstants.APN_REQUEST_STARTED;
        return PhoneConstants.APN_REQUEST_STARTED;
    }
    }
@@ -395,8 +398,8 @@ public class DctController extends Handler {
            Iterator<Integer> iterator = mRequestInfos.keySet().iterator();
            Iterator<Integer> iterator = mRequestInfos.keySet().iterator();
            while (iterator.hasNext()) {
            while (iterator.hasNext()) {
                RequestInfo requestInfo = mRequestInfos.get(iterator.next());
                RequestInfo requestInfo = mRequestInfos.get(iterator.next());
                if (requestInfo.phoneId == requestedPhoneId &&
                if (requestInfo.executedPhoneId != INVALID_PHONE_INDEX) continue;
                        !requestInfo.executed) {
                if (getRequestPhoneId(requestInfo.request) == requestedPhoneId) {
                    mDcSwitchAsyncChannel[requestedPhoneId].connect(requestInfo);
                    mDcSwitchAsyncChannel[requestedPhoneId].connect(requestInfo);
                }
                }
            }
            }
@@ -407,12 +410,13 @@ public class DctController extends Handler {
    }
    }


    private void onExecuteRequest(RequestInfo requestInfo) {
    private void onExecuteRequest(RequestInfo requestInfo) {
        if (!requestInfo.executed && mRequestInfos.containsKey(requestInfo.request.requestId)) {
        if (requestInfo.executedPhoneId == INVALID_PHONE_INDEX &&
                mRequestInfos.containsKey(requestInfo.request.requestId)) {
            logd("onExecuteRequest request=" + requestInfo);
            logd("onExecuteRequest request=" + requestInfo);
            requestInfo.log("DctController.onExecuteRequest - executed=" + requestInfo.executed);
            requestInfo.log("DctController.onExecuteRequest");
            requestInfo.executed = true;
            String apn = apnForNetworkRequest(requestInfo.request);
            String apn = apnForNetworkRequest(requestInfo.request);
            int phoneId = requestInfo.phoneId;
            final int phoneId = getRequestPhoneId(requestInfo.request);
            requestInfo.executedPhoneId = phoneId;
            PhoneBase phoneBase = (PhoneBase)mPhones[phoneId].getActivePhone();
            PhoneBase phoneBase = (PhoneBase)mPhones[phoneId].getActivePhone();
            DcTrackerBase dcTracker = phoneBase.mDcTracker;
            DcTrackerBase dcTracker = phoneBase.mDcTracker;
            dcTracker.incApnRefCount(apn, requestInfo.getLog());
            dcTracker.incApnRefCount(apn, requestInfo.getLog());
@@ -424,7 +428,7 @@ public class DctController extends Handler {
        Iterator<Integer> iterator = mRequestInfos.keySet().iterator();
        Iterator<Integer> iterator = mRequestInfos.keySet().iterator();
        while (iterator.hasNext()) {
        while (iterator.hasNext()) {
            RequestInfo requestInfo = mRequestInfos.get(iterator.next());
            RequestInfo requestInfo = mRequestInfos.get(iterator.next());
            if (requestInfo.phoneId == phoneId) {
            if (getRequestPhoneId(requestInfo.request) == phoneId) {
                onExecuteRequest(requestInfo);
                onExecuteRequest(requestInfo);
            }
            }
        }
        }
@@ -434,13 +438,13 @@ public class DctController extends Handler {
        logd("onReleaseRequest request=" + requestInfo);
        logd("onReleaseRequest request=" + requestInfo);
        if (requestInfo != null) {
        if (requestInfo != null) {
            requestInfo.log("DctController.onReleaseRequest");
            requestInfo.log("DctController.onReleaseRequest");
            if (requestInfo.executed) {
            if (requestInfo.executedPhoneId != INVALID_PHONE_INDEX) {
                String apn = apnForNetworkRequest(requestInfo.request);
                String apn = apnForNetworkRequest(requestInfo.request);
                int phoneId = requestInfo.phoneId;
                int phoneId = requestInfo.executedPhoneId;
                requestInfo.executedPhoneId = INVALID_PHONE_INDEX;
                PhoneBase phoneBase = (PhoneBase)mPhones[phoneId].getActivePhone();
                PhoneBase phoneBase = (PhoneBase)mPhones[phoneId].getActivePhone();
                DcTrackerBase dcTracker = phoneBase.mDcTracker;
                DcTrackerBase dcTracker = phoneBase.mDcTracker;
                dcTracker.decApnRefCount(apn, requestInfo.getLog());
                dcTracker.decApnRefCount(apn, requestInfo.getLog());
                requestInfo.executed = false;
            }
            }
        }
        }
    }
    }
@@ -450,7 +454,7 @@ public class DctController extends Handler {
        Iterator<Integer> iterator = mRequestInfos.keySet().iterator();
        Iterator<Integer> iterator = mRequestInfos.keySet().iterator();
        while (iterator.hasNext()) {
        while (iterator.hasNext()) {
            RequestInfo requestInfo = mRequestInfos.get(iterator.next());
            RequestInfo requestInfo = mRequestInfos.get(iterator.next());
            if (requestInfo.phoneId == phoneId) {
            if (requestInfo.executedPhoneId == phoneId) {
                onReleaseRequest(requestInfo);
                onReleaseRequest(requestInfo);
            }
            }
        }
        }
@@ -490,17 +494,7 @@ public class DctController extends Handler {
                RequestInfo requestInfo = mRequestInfos.get(iterator.next());
                RequestInfo requestInfo = mRequestInfos.get(iterator.next());
                String specifier = requestInfo.request.networkCapabilities.getNetworkSpecifier();
                String specifier = requestInfo.request.networkCapabilities.getNetworkSpecifier();
                if (specifier == null || specifier.equals("")) {
                if (specifier == null || specifier.equals("")) {
                    if (requestInfo.executed) {
                    onReleaseRequest(requestInfo);
                        String apn = apnForNetworkRequest(requestInfo.request);
                        logd("[setDataSubId] activePhoneId:" + activePhoneId + ", subId =" +
                                dataSubId);
                        requestInfo.log("DctController.onSettingsChange releasing request");
                        PhoneBase phoneBase =
                                (PhoneBase)mPhones[activePhoneId].getActivePhone();
                        DcTrackerBase dcTracker = phoneBase.mDcTracker;
                        dcTracker.decApnRefCount(apn, requestInfo.getLog());
                        requestInfo.executed = false;
                    }
                }
                }
            }
            }
        }
        }
@@ -515,25 +509,23 @@ public class DctController extends Handler {
    }
    }


    private int getTopPriorityRequestPhoneId() {
    private int getTopPriorityRequestPhoneId() {
        int phoneId = INVALID_PHONE_INDEX;
        String topSubId = null;
        int priority = -1;
        int priority = -1;
        int subId;


        //TODO: Handle SIM Switch
        for (int i=0; i<mPhoneNum; i++) {
        for (RequestInfo requestInfo : mRequestInfos.values()) {
        for (RequestInfo requestInfo : mRequestInfos.values()) {
                logd("selectExecPhone requestInfo = " + requestInfo);
            logd("getTopPriorityRequestPhoneId requestInfo=" + requestInfo);
                if (requestInfo.phoneId == i &&
            if (requestInfo.priority > priority) {
                        priority < requestInfo.priority) {
                priority = requestInfo.priority;
                priority = requestInfo.priority;
                    phoneId = i;
                topSubId = requestInfo.request.networkCapabilities.getNetworkSpecifier();
            }
            }
        }
        }
        if (TextUtils.isEmpty(topSubId)) {
            subId = mSubController.getDefaultDataSubId();
        } else {
            subId = Integer.parseInt(topSubId);
        }
        }

        return mSubController.getPhoneId(subId);
        logd("getTopPriorityRequestPhoneId = " + phoneId
                + ", priority = " + priority);

        return phoneId;
    }
    }


    private void onSubInfoReady() {
    private void onSubInfoReady() {
@@ -724,8 +716,7 @@ public class DctController extends Handler {
            DcTrackerBase dcTracker =((PhoneBase)mPhone).mDcTracker;
            DcTrackerBase dcTracker =((PhoneBase)mPhone).mDcTracker;
            String apn = apnForNetworkRequest(networkRequest);
            String apn = apnForNetworkRequest(networkRequest);
            if (dcTracker.isApnSupported(apn)) {
            if (dcTracker.isApnSupported(apn)) {
                requestNetwork(networkRequest, dcTracker.getApnPriority(apn), l,
                requestNetwork(networkRequest, dcTracker.getApnPriority(apn), l);
                        mPhone.getPhoneId());
            } else {
            } else {
                final String str = "Unsupported APN";
                final String str = "Unsupported APN";
                log(str);
                log(str);