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

Commit 95a73dba authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Seperate DataConfig update into Carrier and Device" into tm-d1-dev

parents ab26f860 2f4890f2
Loading
Loading
Loading
Loading
+60 −32
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.internal.telephony.data;

import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.StringDef;
import android.content.BroadcastReceiver;
@@ -29,7 +30,6 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.RegistrantList;
import android.provider.DeviceConfig;
import android.telephony.Annotation.ApnType;
import android.telephony.Annotation.NetCapability;
@@ -41,6 +41,7 @@ import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.IndentingPrintWriter;

import com.android.internal.annotations.VisibleForTesting;
@@ -62,6 +63,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;

/**
@@ -70,6 +72,9 @@ import java.util.stream.Collectors;
 * {@link CarrierConfigManager}. All the data config will be loaded once and stored here.
 */
public class DataConfigManager extends Handler {
    /** The max timeout in ms for data network stuck in a transit state. */
    public static final int MAX_NETWORK_TRANSIT_STATE_TIMEOUT_MS = 3600000;

    /** Event for carrier config changed. */
    private static final int EVENT_CARRIER_CONFIG_CHANGED = 1;

@@ -189,6 +194,10 @@ public class DataConfigManager extends Handler {
    @Retention(RetentionPolicy.SOURCE)
    private @interface DataConfigNetworkType {}

    /** Data config update callbacks. */
    private final @NonNull Set<DataConfigManagerCallback> mDataConfigManagerCallbacks =
            new ArraySet<>();

    /** DeviceConfig key of anomaly report threshold for back to back ims release-request. */
    private static final String KEY_ANOMALY_IMS_RELEASE_REQUEST = "anomaly_ims_release_request";
    /** DeviceConfig key of anomaly report threshold for frequent setup data failure. */
@@ -239,9 +248,6 @@ public class DataConfigManager extends Handler {
    private @NonNull final Phone mPhone;
    private @NonNull final String mLogTag;

    /** The registrants list for config update event. */
    private @NonNull final RegistrantList mConfigUpdateRegistrants = new RegistrantList();

    private @NonNull final CarrierConfigManager mCarrierConfigManager;
    private @NonNull PersistableBundle mCarrierConfig = null;
    private @NonNull Resources mResources = null;
@@ -318,8 +324,46 @@ public class DataConfigManager extends Handler {

        // Must be called to set mCarrierConfig and mResources to non-null values
        updateCarrierConfig();
        // Must be called to set anomaly report threshold to non-null values
        updateDeviceConfig();
        mConfigUpdateRegistrants.notifyRegistrants();
    }

    /**
     * The data config callback.
     */
    public static class DataConfigManagerCallback extends DataCallback {
        /**
         * Constructor
         *
         * @param executor The executor of the callback.
         */
        public DataConfigManagerCallback(@NonNull @CallbackExecutor Executor executor) {
            super(executor);
        }

        /** Callback on carrier config update.*/
        public void onCarrierConfigChanged() {}

        /** Callback on device config update.*/
        public void onDeviceConfigChanged() {}
    }

    /**
     * Register the callback for receiving information from {@link DataConfigManager}.
     *
     * @param callback The callback.
     */
    public void registerCallback(@NonNull DataConfigManagerCallback callback) {
        mDataConfigManagerCallbacks.add(callback);
    }

    /**
     * Unregister the callback.
     *
     * @param callback The previously registered callback.
     */
    public void unregisterCallback(@NonNull DataConfigManagerCallback callback) {
        mDataConfigManagerCallbacks.remove(callback);
    }

    @Override
@@ -328,12 +372,14 @@ public class DataConfigManager extends Handler {
            case EVENT_CARRIER_CONFIG_CHANGED:
                log("EVENT_CARRIER_CONFIG_CHANGED");
                updateCarrierConfig();
                mConfigUpdateRegistrants.notifyRegistrants();
                mDataConfigManagerCallbacks.forEach(callback -> callback.invokeFromExecutor(
                        callback::onCarrierConfigChanged));
                break;
            case EVENT_DEVICE_CONFIG_CHANGED:
                log("EVENT_DEVICE_CONFIG_CHANGED");
                updateDeviceConfig();
                mConfigUpdateRegistrants.notifyRegistrants();
                mDataConfigManagerCallbacks.forEach(callback -> callback.invokeFromExecutor(
                        callback::onDeviceConfigChanged));
                break;
            default:
                loge("Unexpected message " + msg.what);
@@ -347,22 +393,22 @@ public class DataConfigManager extends Handler {

        mImsReleaseRequestAnomalyReportThreshold = parseSlidingWindowCounterThreshold(
                properties.getString(KEY_ANOMALY_IMS_RELEASE_REQUEST, null),
                300000,
                12);
                0,
                2);
        mNetworkUnwantedAnomalyReportThreshold = parseSlidingWindowCounterThreshold(
                properties.getString(KEY_ANOMALY_NETWORK_UNWANTED, null),
                300000,
                0,
                12);
        mSetupDataCallAnomalyReportThreshold = parseSlidingWindowCounterThreshold(
                properties.getString(KEY_ANOMALY_SETUP_DATA_CALL_FAILURE, null),
                0,
                2);
                12);
        mNetworkConnectingTimeout = properties.getInt(
                KEY_ANOMALY_NETWORK_CONNECTING_TIMEOUT, 86400000);
                KEY_ANOMALY_NETWORK_CONNECTING_TIMEOUT, MAX_NETWORK_TRANSIT_STATE_TIMEOUT_MS);
        mNetworkDisconnectingTimeout = properties.getInt(
                KEY_ANOMALY_NETWORK_DISCONNECTING_TIMEOUT, 86400000);
                KEY_ANOMALY_NETWORK_DISCONNECTING_TIMEOUT, MAX_NETWORK_TRANSIT_STATE_TIMEOUT_MS);
        mNetworkHandoverTimeout = properties.getInt(
                KEY_ANOMALY_NETWORK_HANDOVER_TIMEOUT, 86400000);
                KEY_ANOMALY_NETWORK_HANDOVER_TIMEOUT, MAX_NETWORK_TRANSIT_STATE_TIMEOUT_MS);
    }

    /**
@@ -1127,24 +1173,6 @@ public class DataConfigManager extends Handler {
                com.android.internal.R.bool.config_enhanced_iwlan_handover_check);
    }

    /**
     * Registration point for subscription info ready.
     *
     * @param h handler to notify.
     * @param what what code of message when delivered.
     */
    public void registerForConfigUpdate(Handler h, int what) {
        mConfigUpdateRegistrants.addUnique(h, what, null);
    }

    /**
     *
     * @param h The original handler passed in {@link #registerForConfigUpdate(Handler, int)}.
     */
    public void unregisterForConfigUpdate(Handler h) {
        mConfigUpdateRegistrants.remove(h);
    }

    /**
     * Log debug messages.
     * @param s debug messages
+44 −19
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@ import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.RIL;
import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback;
import com.android.internal.telephony.data.DataEvaluation.DataAllowedReason;
import com.android.internal.telephony.data.DataNetworkController.NetworkRequestList;
import com.android.internal.telephony.data.DataRetryManager.DataHandoverRetryEntry;
@@ -651,6 +652,11 @@ public class DataNetwork extends StateMachine {
     */
    private @Nullable LinkBandwidthEstimatorCallback mLinkBandwidthEstimatorCallback;

    /**
     * Data config callback for carrier config update.
     */
    private @Nullable DataConfigManagerCallback mDataConfigManagerCallback;

    /**
     * The network bandwidth.
     */
@@ -980,7 +986,13 @@ public class DataNetwork extends StateMachine {
        @Override
        public void enter() {
            logv("Registering all events.");
            mDataConfigManager.registerForConfigUpdate(getHandler(), EVENT_DATA_CONFIG_UPDATED);
            mDataConfigManagerCallback = new DataConfigManagerCallback(getHandler()::post) {
                @Override
                public void onCarrierConfigChanged() {
                    sendMessage(EVENT_DATA_CONFIG_UPDATED);
                }
            };
            mDataConfigManager.registerCallback(mDataConfigManagerCallback);
            mPhone.getDisplayInfoController().registerForTelephonyDisplayInfoChanged(
                    getHandler(), EVENT_DISPLAY_INFO_CHANGED, null);
            mPhone.getServiceStateTracker().registerForServiceStateChanged(getHandler(),
@@ -1032,14 +1044,14 @@ public class DataNetwork extends StateMachine {
            mPhone.getServiceStateTracker().unregisterForServiceStateChanged(getHandler());
            mPhone.getDisplayInfoController().unregisterForTelephonyDisplayInfoChanged(
                    getHandler());
            mDataConfigManager.unregisterForConfigUpdate(getHandler());
            mDataConfigManager.unregisterCallback(mDataConfigManagerCallback);
        }

        @Override
        public boolean processMessage(Message msg) {
            switch (msg.what) {
                case EVENT_DATA_CONFIG_UPDATED:
                    onDataConfigUpdated();
                    onCarrierConfigUpdated();
                    break;
                case EVENT_SERVICE_STATE_CHANGED: {
                    mDataCallSessionStats.onDrsOrRatChanged(getDataNetworkType());
@@ -1168,10 +1180,14 @@ public class DataNetwork extends StateMachine {
                    deferMessage(msg);
                    break;
                case EVENT_STUCK_IN_TRANSIENT_STATE:
                    // enable detection only for valid timeout range
                    if (mDataConfigManager.getAnomalyNetworkConnectingTimeoutMs()
                            < DataConfigManager.MAX_NETWORK_TRANSIT_STATE_TIMEOUT_MS) {
                        reportAnomaly("Data network stuck in connecting state for "
                                + TimeUnit.MILLISECONDS.toSeconds(
                                mDataConfigManager.getAnomalyNetworkConnectingTimeoutMs())
                                + " seconds.", "58c56403-7ea7-4e56-a0c7-e467114d09b8");
                    }
                    // Setup data failed. Use the retry logic defined in
                    // CarrierConfigManager.KEY_TELEPHONY_DATA_SETUP_RETRY_RULES_STRING_ARRAY.
                    mRetryDelayMillis = DataCallResponse.RETRY_DURATION_UNDEFINED;
@@ -1359,10 +1375,14 @@ public class DataNetwork extends StateMachine {
                    onPcoDataReceived((PcoData) ar.result);
                    break;
                case EVENT_STUCK_IN_TRANSIENT_STATE:
                    // enable detection only for valid timeout range
                    if (mDataConfigManager.getNetworkHandoverTimeoutMs()
                            < DataConfigManager.MAX_NETWORK_TRANSIT_STATE_TIMEOUT_MS) {
                        reportAnomaly("Data service did not respond the handover request within "
                                        + TimeUnit.MILLISECONDS.toSeconds(
                                mDataConfigManager.getNetworkHandoverTimeoutMs()) + " seconds.",
                                "1afe68cb-8b41-4964-a737-4f34372429ea");
                    }

                    // Handover failed. Use the retry logic defined in
                    // CarrierConfigManager.KEY_TELEPHONY_DATA_HANDOVER_RETRY_RULES_STRING_ARRAY.
@@ -1457,11 +1477,16 @@ public class DataNetwork extends StateMachine {
                case EVENT_STUCK_IN_TRANSIENT_STATE:
                    // After frameworks issues deactivate data call request, RIL should report
                    // data disconnected through data call list changed event subsequently.

                    // enable detection only for valid timeout range
                    if (mDataConfigManager.getAnomalyNetworkDisconnectingTimeoutMs()
                            < DataConfigManager.MAX_NETWORK_TRANSIT_STATE_TIMEOUT_MS) {
                        reportAnomaly("RIL did not send data call list changed event after "
                                + "deactivate data call request within "
                                + TimeUnit.MILLISECONDS.toSeconds(
                                mDataConfigManager.getAnomalyNetworkDisconnectingTimeoutMs())
                                + " seconds.", "d0e4fa1c-c57b-4ba5-b4b6-8955487012cc");
                    }
                    mFailCause = DataFailCause.LOST_CONNECTION;
                    transitionTo(mDisconnectedState);
                    break;
@@ -2533,10 +2558,10 @@ public class DataNetwork extends StateMachine {
    }

    /**
     * Called when data config updated.
     * Called when carrier config updated.
     */
    private void onDataConfigUpdated() {
        log("onDataConfigUpdated");
    private void onCarrierConfigUpdated() {
        log("onCarrierConfigUpdated");

        updateBandwidthFromDataConfig();
        updateTcpBufferSizes();
+23 −14
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@ import com.android.internal.telephony.SlidingWindowEventCounter;
import com.android.internal.telephony.SubscriptionInfoUpdater;
import com.android.internal.telephony.TelephonyComponentFactory;
import com.android.internal.telephony.data.AccessNetworksManager.AccessNetworksManagerCallback;
import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback;
import com.android.internal.telephony.data.DataEvaluation.DataAllowedReason;
import com.android.internal.telephony.data.DataEvaluation.DataDisallowedReason;
import com.android.internal.telephony.data.DataEvaluation.DataEvaluationReason;
@@ -134,9 +135,6 @@ import java.util.stream.Collectors;
public class DataNetworkController extends Handler {
    private static final boolean VDBG = false;

    /** Event for data config updated. */
    private static final int EVENT_DATA_CONFIG_UPDATED = 1;

    /** Event for adding a network request. */
    private static final int EVENT_ADD_NETWORK_REQUEST = 2;

@@ -957,7 +955,16 @@ public class DataNetworkController extends Handler {

        mPhone.getServiceStateTracker().registerForServiceStateChanged(this,
                EVENT_SERVICE_STATE_CHANGED);
        mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED);
        mDataConfigManager.registerCallback(new DataConfigManagerCallback(this::post) {
            @Override
            public void onCarrierConfigChanged() {
                DataNetworkController.this.onCarrierConfigUpdated();
            }
            @Override
            public void onDeviceConfigChanged() {
                DataNetworkController.this.onDeviceConfigUpdated();
            }
        });
        mPhone.getServiceStateTracker().registerForPsRestrictedEnabled(this,
                EVENT_PS_RESTRICT_ENABLED, null);
        mPhone.getServiceStateTracker().registerForPsRestrictedDisabled(this,
@@ -1008,9 +1015,6 @@ public class DataNetworkController extends Handler {
    @Override
    public void handleMessage(@NonNull Message msg) {
        switch (msg.what) {
            case EVENT_DATA_CONFIG_UPDATED:
                onDataConfigUpdated();
                break;
            case EVENT_REGISTER_ALL_EVENTS:
                onRegisterAllEvents();
                break;
@@ -2199,21 +2203,26 @@ public class DataNetworkController extends Handler {
    }

    /**
     * Called when data config was updated.
     * Called when carrier config was updated.
     */
    private void onDataConfigUpdated() {
        log("onDataConfigUpdated: config is "
    private void onCarrierConfigUpdated() {
        log("onCarrierConfigUpdated: config is "
                + (mDataConfigManager.isConfigCarrierSpecific() ? "" : "not ")
                + "carrier specific. mSimState="
                + SubscriptionInfoUpdater.simStateString(mSimState)
                + ". DeviceConfig updated.");

        updateAnomalySlidingWindowCounters();
                + SubscriptionInfoUpdater.simStateString(mSimState));
        updateNetworkRequestsPriority();
        sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
                DataEvaluationReason.DATA_CONFIG_CHANGED));
    }

    /**
     * Called when device config was updated.
     */
    private void onDeviceConfigUpdated() {
        log("onDeviceConfigUpdated: DeviceConfig updated.");
        updateAnomalySlidingWindowCounters();
    }

    /**
     * Update each network request's priority.
     */
+11 −11
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import android.util.IndentingPrintWriter;
import android.util.LocalLog;

import com.android.internal.telephony.Phone;
import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback;
import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback;
import com.android.telephony.Rlog;

@@ -64,9 +65,6 @@ import java.util.stream.Collectors;
public class DataProfileManager extends Handler {
    private static final boolean VDBG = true;

    /** Event for data config updated. */
    private static final int EVENT_DATA_CONFIG_UPDATED = 1;

    /** Event for APN database changed. */
    private static final int EVENT_APN_DATABASE_CHANGED = 2;

@@ -156,7 +154,12 @@ public class DataProfileManager extends Handler {
                            @NonNull List<DataProfile> dataProfiles) {
                        DataProfileManager.this.onInternetDataNetworkConnected(dataProfiles);
                    }});
        mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED);
        mDataConfigManager.registerCallback(new DataConfigManagerCallback(this::post) {
            @Override
            public void onCarrierConfigChanged() {
                DataProfileManager.this.onCarrierConfigUpdated();
            }
        });
        mPhone.getContext().getContentResolver().registerContentObserver(
                Telephony.Carriers.CONTENT_URI, true, new ContentObserver(this) {
                    @Override
@@ -171,9 +174,6 @@ public class DataProfileManager extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case EVENT_DATA_CONFIG_UPDATED:
                onDataConfigUpdated();
                break;
            case EVENT_SIM_REFRESH:
                log("Update data profiles due to SIM refresh.");
                updateDataProfiles();
@@ -189,10 +189,10 @@ public class DataProfileManager extends Handler {
    }

    /**
     * Called when data config was updated.
     * Called when carrier config was updated.
     */
    private void onDataConfigUpdated() {
        log("Update data profiles due to config updated.");
    private void onCarrierConfigUpdated() {
        log("Update data profiles due to carrier config updated.");
        updateDataProfiles();

        //TODO: more works needed to be done here.
@@ -273,7 +273,7 @@ public class DataProfileManager extends Handler {
        }

        // Check if any of the profile already supports IMS, if not, add the default one.
        DataProfile dataProfile = profiles.stream()
        dataProfile = profiles.stream()
                .filter(dp -> dp.canSatisfy(NetworkCapabilities.NET_CAPABILITY_IMS))
                .findFirst()
                .orElse(null);
+9 −10
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback;
import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback;
import com.android.internal.telephony.data.DataNetworkController.NetworkRequestList;
import com.android.internal.telephony.data.DataProfileManager.DataProfileManagerCallback;
@@ -71,9 +72,6 @@ import java.util.stream.Collectors;
public class DataRetryManager extends Handler {
    private static final boolean VDBG = false;

    /** Event for data config updated. */
    private static final int EVENT_DATA_CONFIG_UPDATED = 1;

    /** Event for data setup retry. */
    private static final int EVENT_DATA_SETUP_RETRY = 3;

@@ -930,8 +928,12 @@ public class DataRetryManager extends Handler {
        mDataServiceManagers = dataServiceManagers;
        mDataConfigManager = dataNetworkController.getDataConfigManager();
        mDataProfileManager = dataNetworkController.getDataProfileManager();
        mDataConfigManager.registerForConfigUpdate(this, EVENT_DATA_CONFIG_UPDATED);

        mDataConfigManager.registerCallback(new DataConfigManagerCallback(this::post) {
            @Override
            public void onCarrierConfigChanged() {
                DataRetryManager.this.onCarrierConfigUpdated();
            }
        });
        mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                .registerForApnUnthrottled(this, EVENT_DATA_PROFILE_UNTHROTTLED);
        if (!mPhone.getAccessNetworksManager().isInLegacyMode()) {
@@ -964,9 +966,6 @@ public class DataRetryManager extends Handler {
    public void handleMessage(Message msg) {
        AsyncResult ar;
        switch (msg.what) {
            case EVENT_DATA_CONFIG_UPDATED:
                onDataConfigUpdated();
                break;
            case EVENT_DATA_SETUP_RETRY:
                DataSetupRetryEntry dataSetupRetryEntry = (DataSetupRetryEntry) msg.obj;
                Objects.requireNonNull(dataSetupRetryEntry);
@@ -1014,9 +1013,9 @@ public class DataRetryManager extends Handler {
    }

    /**
     * Called when data config is updated.
     * Called when carrier config is updated.
     */
    private void onDataConfigUpdated() {
    private void onCarrierConfigUpdated() {
        onReset(RESET_REASON_DATA_CONFIG_CHANGED);
        mDataSetupRetryRuleList = mDataConfigManager.getDataSetupRetryRules();
        mDataHandoverRetryRuleList = mDataConfigManager.getDataHandoverRetryRules();
Loading