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

Commit edc66a18 authored by Jack Yu's avatar Jack Yu Committed by Jayachandran Chinnakkannu
Browse files

Added debug messages and watchdog

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

Bug: 139076980
Test: Manual
Change-Id: Id36217e915debe211edd8d91c6b0c32ce1062fa4
parent 42e63db5
Loading
Loading
Loading
Loading
+50 −7
Original line number Original line Diff line number Diff line
@@ -16,6 +16,8 @@


package com.android.internal.telephony.dataconnection;
package com.android.internal.telephony.dataconnection;


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

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


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

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


    private final class CellularDataServiceCallback extends IDataServiceCallback.Stub {
    private final class CellularDataServiceCallback extends IDataServiceCallback.Stub {

        private final String mTag;

        CellularDataServiceCallback(String tag) {
            mTag = tag;
        }

        public String getTag() {
            return mTag;
        }

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


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


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


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


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


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