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

Commit cffda0b4 authored by Willy Hu's avatar Willy Hu Committed by Jack Yu
Browse files

Implement the Functions for DataConfigManager

- Get the timer between recovery action.
- Get the skip flag from DataConfigManager.
- Update data stall configs when EVENT_DATA_CONFIG_UPDATED

Bug: 178670629
Test: Build pass.
      atest com.android.internal.telephony.data --iterations 100
Merged-In: I2c9fd7f4610db67304fe779ab51001ca82607ced
Change-Id: I2c9fd7f4610db67304fe779ab51001ca82607ced
parent 38ff232a
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -793,6 +793,26 @@ public class DataConfigManager extends Handler {
        }
    }

    /**
     * @return Get recovery action delay in milliseconds between recovery actions.
     *
     * @see CarrierConfigManager#KEY_DATA_STALL_RECOVERY_TIMERS_LONG_ARRAY
     */
    public @NonNull long[] getDataStallRecoveryDelayMillis() {
        return mCarrierConfig.getLongArray(
            CarrierConfigManager.KEY_DATA_STALL_RECOVERY_TIMERS_LONG_ARRAY);
    }

    /**
     * @return Get the data stall recovery should skip boolean array.
     *
     * @see CarrierConfigManager#KEY_DATA_STALL_RECOVERY_SHOULD_SKIP_BOOL_ARRAY
     */
    public @NonNull boolean[] getDataStallRecoveryShouldSkipArray() {
        return mCarrierConfig.getBooleanArray(
            CarrierConfigManager.KEY_DATA_STALL_RECOVERY_SHOULD_SKIP_BOOL_ARRAY);
    }

    /**
     * Registration point for subscription info ready
     *
+75 −29
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
import java.util.concurrent.Executor;

/**
@@ -134,7 +135,12 @@ public class DataStallRecoveryManager extends Handler {
    /** Whether mobile data change to Enabled during data stall. */
    private boolean mMobileDataChangedToEnabledDuringDataStall;

    private @NonNull DataStallRecoveryManagerCallback mDataStallRecoveryManagerCallback;
    /** The array for the timers between recovery actions. */
    private @NonNull long[] mDataStallRecoveryDelayMillisArray;
    /** The boolean array for the flags. They are used to skip the recovery actions if needed. */
    private @NonNull boolean[] mSkipRecoveryActionArray;

    private DataStallRecoveryManagerCallback mDataStallRecoveryManagerCallback;

    /**
     * The data stall recovery manager callback. Note this is only used for passing information
@@ -193,6 +199,7 @@ public class DataStallRecoveryManager extends Handler {
                        });
        mDataStallRecoveryManagerCallback = callback;
        mRadioPowerState = mPhone.getRadioPowerState();
        updateDataStallRecoveryConfigs();

        registerAllEvents();
    }
@@ -244,12 +251,42 @@ public class DataStallRecoveryManager extends Handler {
        }
    }

    /** Update the data stall recovery configs from DataConfigManager. */
    private void updateDataStallRecoveryConfigs() {
        mDataStallRecoveryDelayMillisArray = mDataConfigManager.getDataStallRecoveryDelayMillis();
        mSkipRecoveryActionArray = mDataConfigManager.getDataStallRecoveryShouldSkipArray();
    }

    /**
     * Get the duration for specific data stall recovery action.
     *
     * @param recoveryAction The recovery action to query.
     * @return the delay in milliseconds for the specific recovery action.
     */
    private long getDataStallRecoveryDelayMillis(@RecoveryAction int recoveryAction) {
        return mDataStallRecoveryDelayMillisArray[recoveryAction];
    }

    /**
     * Check if the recovery action needs to be skipped.
     *
     * @param recoveryAction The recovery action.
     * @return {@code true} if the action needs to be skipped.
     */
    private boolean shouldSkipRecoveryAction(@RecoveryAction int recoveryAction) {
        return mSkipRecoveryActionArray[recoveryAction];
    }

    /** Called when data config was updated. */
    private void onDataConfigUpdated() {
        // TODO: (b/178670629): Get the new config from DataConfigManager.
        updateDataStallRecoveryConfigs();
    }

    /** Called when mobile data setting changed. */
    /**
     * Called when mobile data setting changed.
     *
     * @param enabled true for mobile data settings enabled & false for disabled.
     */
    private void onMobileDataEnabledChanged(boolean enabled) {
        logl("onMobileDataEnabledChanged: DataEnabled:" + enabled + ",DataStalled:" + mDataStalled);
        // Store the mobile data changed flag (from disabled to enabled) as TRUE
@@ -326,6 +363,23 @@ public class DataStallRecoveryManager extends Handler {
                && mRadioPowerState == TelephonyManager.RADIO_POWER_ON) {
            mRecovryAction = RECOVERY_ACTION_RESET_MODEM;
        }
        // To check the flag from DataConfigManager if we need to skip the step.
        if (shouldSkipRecoveryAction(mRecovryAction)) {
            switch (mRecovryAction) {
                case RECOVERY_ACTION_GET_DATA_CALL_LIST:
                    setRecoveryAction(RECOVERY_ACTION_CLEANUP);
                    break;
                case RECOVERY_ACTION_CLEANUP:
                    setRecoveryAction(RECOVERY_ACTION_RADIO_RESTART);
                    break;
                case RECOVERY_ACTION_RADIO_RESTART:
                    setRecoveryAction(RECOVERY_ACTION_RESET_MODEM);
                    break;
                case RECOVERY_ACTION_RESET_MODEM:
                    resetAction();
                    break;
            }
        }

        log("setRecoveryAction: " + recoveryActionToString(mRecovryAction));
    }
@@ -348,16 +402,6 @@ public class DataStallRecoveryManager extends Handler {
        return (SystemClock.elapsedRealtime() - mTimeLastRecoveryStartMs);
    }

    /**
     * Get duration between recovery from DataStallRecoveryConfig.
     *
     * @return the time in milliseconds between recovery action.
     */
    private long getMinDurationBetweenRecovery() {
        // TODO: (b/178670629): Get the duration from DataConfigManager
        return 3 * 60 * 1000;
    }

    /**
     * Broadcast intent when data stall occurred.
     *
@@ -396,12 +440,19 @@ public class DataStallRecoveryManager extends Handler {
        mPhone.rebootModem(null);
    }

    /** Initialize the network check timer. */
    private void startNetworkCheckTimer() {
        log("startNetworkCheckTimer()");
    /**
     * Initialize the network check timer.
     *
     * @param action The recovery action to start the network check timer.
     */
    private void startNetworkCheckTimer(@RecoveryAction int action) {
        // Ignore send message delayed due to reached the last action.
        if (action == RECOVERY_ACTION_RESET_MODEM) return;
        log("startNetworkCheckTimer(): " + getDataStallRecoveryDelayMillis(action) + "ms");
        if (!mNetworkCheckTimerStarted) {
            mNetworkCheckTimerStarted = true;
            sendMessageDelayed(obtainMessage(EVENT_DO_RECOVERY), getMinDurationBetweenRecovery());
            sendMessageDelayed(
                    obtainMessage(EVENT_DO_RECOVERY), getDataStallRecoveryDelayMillis(action));
        }
    }

@@ -423,7 +474,7 @@ public class DataStallRecoveryManager extends Handler {
    private boolean isRecoveryNeeded() {
        logv("enter: isRecoveryNeeded()");
        // To avoid back to back recovery, wait for a grace period
        if (getElapsedTimeSinceRecoveryMs() < getMinDurationBetweenRecovery()) {
        if (getElapsedTimeSinceRecoveryMs() < getDataStallRecoveryDelayMillis(mLastAction)) {
            log("skip back to back data stall recovery");
            return false;
        }
@@ -442,8 +493,6 @@ public class DataStallRecoveryManager extends Handler {
            return false;
        }

        // TODO: (b/178670629): check the customized carrier config to skip the recovery action

        return true;
    }

@@ -523,7 +572,7 @@ public class DataStallRecoveryManager extends Handler {
                                + recoveryActionToString(recoveryAction));
        }

        startNetworkCheckTimer();
        startNetworkCheckTimer(mLastAction);
    }

    /**
@@ -566,13 +615,6 @@ public class DataStallRecoveryManager extends Handler {
        }
    }

    /** The data stall recovery config. */
    public static final class DataStallRecoveryConfig {
        DataStallRecoveryConfig(String stringConfig) {
            // TODO: (b/178670629): Parsing the config string.
        }
    }

    /**
     * Log debug messages.
     *
@@ -626,7 +668,6 @@ public class DataStallRecoveryManager extends Handler {
        pw.println("mIsValidNetwork=" + mIsValidNetwork);
        pw.println("mDataStalled=" + mDataStalled);
        pw.println("mDataStallStartMs=" + mDataStallStartMs);
        pw.println("mMobileDataEnabled=" + mMobileDataEnabled);
        pw.println("mRadioPowerState=" + radioPowerStateToString(mRadioPowerState));
        pw.println("mLastActionReported=" + mLastActionReported);
        pw.println("mTimeLastRecoveryStartMs=" + mTimeLastRecoveryStartMs);
@@ -635,6 +676,11 @@ public class DataStallRecoveryManager extends Handler {
        pw.println(
                "mMobileDataChangedToEnabledDuringDataStall="
                        + mMobileDataChangedToEnabledDuringDataStall);
        pw.println(
                "DataStallRecoveryDelayMillisArray="
                        + Arrays.toString(mDataStallRecoveryDelayMillisArray));
        pw.println("SkipRecoveryActionArray=" + Arrays.toString(mSkipRecoveryActionArray));
        pw.decreaseIndent();
        pw.println("");

        pw.println("Local logs:");
+1 −0
Original line number Diff line number Diff line
@@ -608,6 +608,7 @@ public abstract class TelephonyTest {
        doReturn(mAccessNetworksManager).when(mPhone).getAccessNetworksManager();
        doReturn(mDataEnabledSettings).when(mPhone).getDataEnabledSettings();
        doReturn(mDcTracker).when(mPhone).getDcTracker(anyInt());
        doReturn(mDataSettingsManager).when(mDataNetworkController).getDataSettingsManager();
        doReturn(mDataNetworkController).when(mPhone).getDataNetworkController();
        doReturn(mDataSettingsManager).when(mPhone).getDataSettingsManager();
        doReturn(mCarrierPrivilegesTracker).when(mPhone).getCarrierPrivilegesTracker();
+11 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

package com.android.internal.telephony.data;

import static com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback;
import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback;

import static com.google.common.truth.Truth.assertThat;

@@ -28,6 +28,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import android.net.NetworkAgent;
import android.telephony.CarrierConfigManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;

@@ -54,6 +55,15 @@ public class DataStallRecoveryManagerTest extends TelephonyTest {
        logd("DataStallRecoveryManagerTest +Setup!");
        super.setUp(getClass().getSimpleName());
        doReturn(true).when(mPhone).isUsingNewDataStack();
        mCarrierConfigManager = mPhone.getContext().getSystemService(CarrierConfigManager.class);
        long[] dataStallRecoveryTimersArray = new long[] {1, 1, 1};
        boolean[] dataStallRecoveryStepsArray = new boolean[] {false, false, false, false};
        doReturn(dataStallRecoveryTimersArray)
                .when(mDataConfigManager)
                .getDataStallRecoveryDelayMillis();
        doReturn(dataStallRecoveryStepsArray)
                .when(mDataConfigManager)
                .getDataStallRecoveryShouldSkipArray();
        doReturn(mSST).when(mPhone).getServiceStateTracker();
        doAnswer(
                invocation -> {