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

Commit e904778f authored by Jack Yu's avatar Jack Yu
Browse files

Added debug messages and watchdog

Added debug messages and watchdog to catch
unresponsive data service issue.

Bug: 139076980
Test: Manual
Merged-In: Id36217e915debe211edd8d91c6b0c32ce1062fa4
Change-Id: Id36217e915debe211edd8d91c6b0c32ce1062fa4
(cherry picked from commit edc66a18)
parent 003196a8
Loading
Loading
Loading
Loading
+50 −7
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.telephony.dataconnection;

import static android.text.format.DateUtils.MINUTE_IN_MILLIS;

import android.annotation.NonNull;
import android.app.AppOpsManager;
import android.content.BroadcastReceiver;
@@ -39,6 +41,7 @@ import android.os.ServiceManager;
import android.os.UserHandle;
import android.telephony.AccessNetworkConstants;
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.AnomalyReporter;
import android.telephony.CarrierConfigManager;
import android.telephony.Rlog;
import android.telephony.data.DataCallResponse;
@@ -55,6 +58,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
@@ -68,6 +72,10 @@ public class DataServiceManager extends Handler {

    private static final int EVENT_BIND_DATA_SERVICE = 1;

    private static final int EVENT_WATCHDOG_TIMEOUT = 2;

    private static final long REQUEST_UNRESPONDED_TIMEOUT = 10 * MINUTE_IN_MILLIS; // 10 mins

    private final Phone mPhone;

    private final String mTag;
@@ -171,18 +179,19 @@ public class DataServiceManager extends Handler {
                service.linkToDeath(mDeathRecipient, 0);
                mIDataService.createDataServiceProvider(mPhone.getPhoneId());
                mIDataService.registerForDataCallListChanged(mPhone.getPhoneId(),
                        new CellularDataServiceCallback());
                        new CellularDataServiceCallback("dataCallListChanged"));
            } catch (RemoteException e) {
                mDeathRecipient.binderDied();
                loge("Remote exception. " + e);
                return;
            }

            removeMessages(EVENT_WATCHDOG_TIMEOUT);
            mServiceBindingChangedRegistrants.notifyResult(true);
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
            if (DBG) log("onServiceDisconnected");
            removeMessages(EVENT_WATCHDOG_TIMEOUT);
            mIDataService.asBinder().unlinkToDeath(mDeathRecipient, 0);
            mIDataService = null;
            mBound = false;
@@ -192,6 +201,17 @@ public class DataServiceManager extends Handler {
    }

    private final class CellularDataServiceCallback extends IDataServiceCallback.Stub {

        private final String mTag;

        CellularDataServiceCallback(String tag) {
            mTag = tag;
        }

        public String getTag() {
            return mTag;
        }

        @Override
        public void onSetupDataCallComplete(@DataServiceCallback.ResultCode int resultCode,
                                            DataCallResponse response) {
@@ -199,6 +219,7 @@ public class DataServiceManager extends Handler {
                log("onSetupDataCallComplete. resultCode = " + resultCode + ", response = "
                        + response);
            }
            removeMessages(EVENT_WATCHDOG_TIMEOUT, CellularDataServiceCallback.this);
            Message msg = mMessageMap.remove(asBinder());
            if (msg != null) {
                msg.getData().putParcelable(DATA_CALL_RESPONSE, response);
@@ -211,6 +232,7 @@ public class DataServiceManager extends Handler {
        @Override
        public void onDeactivateDataCallComplete(@DataServiceCallback.ResultCode int resultCode) {
            if (DBG) log("onDeactivateDataCallComplete. resultCode = " + resultCode);
            removeMessages(EVENT_WATCHDOG_TIMEOUT, CellularDataServiceCallback.this);
            Message msg = mMessageMap.remove(asBinder());
            sendCompleteMessage(msg, resultCode);
        }
@@ -279,11 +301,25 @@ public class DataServiceManager extends Handler {
            case EVENT_BIND_DATA_SERVICE:
                bindDataService();
                break;
            case EVENT_WATCHDOG_TIMEOUT:
                handleRequestUnresponded((CellularDataServiceCallback) msg.obj);
                break;
            default:
                loge("Unhandled event " + msg.what);
        }
    }

    private void handleRequestUnresponded(CellularDataServiceCallback callback) {
        String message = "Request " + callback.getTag() + " unresponded on transport "
                + AccessNetworkConstants.transportTypeToString(mTransportType) + " in "
                + REQUEST_UNRESPONDED_TIMEOUT / 1000 + " seconds.";
        log(message);
        // Using fixed UUID to avoid duplicate bugreport notification
        AnomalyReporter.reportAnomaly(
                UUID.fromString("f5d5cbe6-9bd6-4009-b764-42b1b649b1de"),
                message);
    }

    private void bindDataService() {
        Intent intent = null;
        String packageName = getDataServicePackageName();
@@ -490,11 +526,13 @@ public class DataServiceManager extends Handler {
            return;
        }

        CellularDataServiceCallback callback = new CellularDataServiceCallback();
        CellularDataServiceCallback callback = new CellularDataServiceCallback("setupDataCall");
        if (onCompleteMessage != null) {
            mMessageMap.put(callback.asBinder(), onCompleteMessage);
        }
        try {
            sendMessageDelayed(obtainMessage(EVENT_WATCHDOG_TIMEOUT, callback),
                    REQUEST_UNRESPONDED_TIMEOUT);
            mIDataService.setupDataCall(mPhone.getPhoneId(), accessNetworkType, dataProfile,
                    isRoaming, allowRoaming, reason, linkProperties, callback);
        } catch (RemoteException e) {
@@ -525,11 +563,14 @@ public class DataServiceManager extends Handler {
            return;
        }

        CellularDataServiceCallback callback = new CellularDataServiceCallback();
        CellularDataServiceCallback callback =
                new CellularDataServiceCallback("deactivateDataCall");
        if (onCompleteMessage != null) {
            mMessageMap.put(callback.asBinder(), onCompleteMessage);
        }
        try {
            sendMessageDelayed(obtainMessage(EVENT_WATCHDOG_TIMEOUT, callback),
                    REQUEST_UNRESPONDED_TIMEOUT);
            mIDataService.deactivateDataCall(mPhone.getPhoneId(), cid, reason, callback);
        } catch (RemoteException e) {
            loge("Cannot invoke deactivateDataCall on data service.");
@@ -555,7 +596,8 @@ public class DataServiceManager extends Handler {
            return;
        }

        CellularDataServiceCallback callback = new CellularDataServiceCallback();
        CellularDataServiceCallback callback =
                new CellularDataServiceCallback("setInitialAttachApn");
        if (onCompleteMessage != null) {
            mMessageMap.put(callback.asBinder(), onCompleteMessage);
        }
@@ -588,7 +630,7 @@ public class DataServiceManager extends Handler {
            return;
        }

        CellularDataServiceCallback callback = new CellularDataServiceCallback();
        CellularDataServiceCallback callback = new CellularDataServiceCallback("setDataProfile");
        if (onCompleteMessage != null) {
            mMessageMap.put(callback.asBinder(), onCompleteMessage);
        }
@@ -615,7 +657,8 @@ public class DataServiceManager extends Handler {
            return;
        }

        CellularDataServiceCallback callback = new CellularDataServiceCallback();
        CellularDataServiceCallback callback =
                new CellularDataServiceCallback("requestDataCallList");
        if (onCompleteMessage != null) {
            mMessageMap.put(callback.asBinder(), onCompleteMessage);
        }