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

Commit 7ca66468 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge changes from topic "data_refactoring" am: 3266b0d6 am: 8a795390

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/2011659

Change-Id: Ib4f31d4255e8fd0693fdcd7e044bfb42a422dc36
parents 3e37c1b8 8a795390
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ import android.util.Log;
import com.android.ims.ImsManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.IccCardConstants.State;
import com.android.internal.telephony.dataconnection.DataEnabledOverride;
import com.android.internal.telephony.data.DataEnabledOverride;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.telephony.uicc.UiccCard;
+2 −0
Original line number Diff line number Diff line
@@ -398,6 +398,7 @@ public class DataConfigManager extends Handler {
     * @return The metered APN types when connected to a home network
     */
    public @NonNull @ApnType List<Integer> getMeteredApnTypes() {
        // TODO: return as set instead of list
        return Collections.unmodifiableList(mMeteredApnTypes);
    }

@@ -405,6 +406,7 @@ public class DataConfigManager extends Handler {
     * @return The metered APN types when roaming
     */
    public @NonNull @ApnType List<Integer> getMeteredApnTypesWhenRoaming() {
        // TODO: return as set instead of list
        return Collections.unmodifiableList(mRoamingMeteredApnTypes);
    }

+3 −3
Original line number Diff line number Diff line
/*
 * Copyright 2019 The Android Open Source Project
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

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

import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -31,7 +31,7 @@ import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.SubscriptionController;
import com.android.internal.telephony.dataconnection.DataEnabledOverride.OverrideConditions.Condition;
import com.android.internal.telephony.data.DataEnabledOverride.OverrideConditions.Condition;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+9 −2
Original line number Diff line number Diff line
@@ -179,13 +179,14 @@ public class DataEvaluation {
        DATA_RESTRICTED_CHANGED,
        /** Network capabilities changed. The unsatisfied requests might have chances to attach. */
        DATA_NETWORK_CAPABILITIES_CHANGED,
        /** When emergency call started or ended. */
        EMERGENCY_CALL_CHANGED,
    }

    /** Disallowed reasons. There could be multiple reasons if data connection is not allowed. */
    public enum DataDisallowedReason {
        // Soft failure reasons. A soft reason means that in certain conditions, data is still
        // allowed. Normally those reasons are due to users settings.

        /** Data is disabled by the user or policy. */
        DATA_DISABLED(false),
        /** Data roaming is disabled by the user. */
@@ -214,7 +215,9 @@ public class DataEvaluation {
        /** Unable to find a suitable data profile. */
        NO_SUITABLE_DATA_PROFILE(true),
        /** Current data network type not allowed. */
        DATA_NETWORK_TYPE_NOT_ALLOWED(true);
        DATA_NETWORK_TYPE_NOT_ALLOWED(true),
        /** Device is currently in an emergency call. */
        EMERGENCY_CALL(true);

        private final boolean mIsHardReason;

@@ -257,6 +260,10 @@ public class DataEvaluation {
         * the user enables or disables data.
         */
        UNMETERED_USAGE,
        /**
         * The network request supports MMS and MMS is always allowed.
         */
        MMS_REQUEST,
        /**
         * The network request is restricted (i.e. Only privilege apps can access the network.)
         */
+104 −24
Original line number Diff line number Diff line
@@ -161,6 +161,9 @@ public class DataNetworkController extends Handler {
    /** Event for registering all events. */
    private static final int EVENT_REGISTER_ALL_EVENTS = 19;

    /** Event for emergency call started or ended. */
    private static final int EVENT_EMERGENCY_CALL_CHANGED = 20;

    /** The supported IMS features. This is for IMS graceful tear down support. */
    private static final Collection<Integer> SUPPORTED_IMS_FEATURES =
            List.of(ImsFeature.FEATURE_MMTEL, ImsFeature.FEATURE_RCS);
@@ -615,7 +618,7 @@ public class DataNetworkController extends Handler {
                                DataEvaluationReason.DATA_ENABLED_CHANGED));
                    }
                    @Override
                    public void onRoamingEnabledChanged(boolean enabled) {
                    public void onDataRoamingEnabledChanged(boolean enabled) {
                        // If data roaming is enabled by the user, evaluate the unsatisfied network
                        // requests and then attempt to setup data networks to satisfy them.
                        // If data roaming is disabled, evaluate the existing data networks and
@@ -677,6 +680,7 @@ public class DataNetworkController extends Handler {
                EVENT_PS_RESTRICT_ENABLED, null);
        mPhone.getServiceStateTracker().registerForPsRestrictedDisabled(this,
                EVENT_PS_RESTRICT_DISABLED, null);
        mPhone.registerForEmergencyCallToggle(this, EVENT_EMERGENCY_CALL_CHANGED, null);
        mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                .registerForServiceBindingChanged(this, EVENT_DATA_SERVICE_BINDING_CHANGED);

@@ -781,6 +785,15 @@ public class DataNetworkController extends Handler {
            case EVENT_SERVICE_STATE_CHANGED:
                onServiceStateChanged();
                break;
            case EVENT_EMERGENCY_CALL_CHANGED:
                if (mPhone.isInEcm()) {
                    sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
                            DataEvaluationReason.EMERGENCY_CALL_CHANGED));
                } else {
                    sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
                            DataEvaluationReason.EMERGENCY_CALL_CHANGED));
                }
                break;
            default:
                loge("Unexpected event " + msg.what);
        }
@@ -974,11 +987,10 @@ public class DataNetworkController extends Handler {
            evaluation.addDataDisallowedReason(DataDisallowedReason.DEFAULT_DATA_UNSELECTED);
        }

        // TODO: Support data roaming check
        /*if (mServiceState.getDataRoaming() &&
                !mDataSettingManager.isDataRoamingEnabled()) {
        // Check if data roaming is disabled.
        if (mServiceState.getDataRoaming() && !mDataSettingsManager.isDataRoamingEnabled()) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.ROAMING_DISABLED);
        }*/
        }

        // Check if data is restricted by the network.
        if (mPsRestricted) {
@@ -1011,15 +1023,59 @@ public class DataNetworkController extends Handler {
            evaluation.addDataDisallowedReason(DataDisallowedReason.NO_SUITABLE_DATA_PROFILE);
        }

        // TODO: Support data enabled/disabled check
        // Check if data is disabled
        int[] apnTypes = Arrays.stream(networkRequest.getApnTypesCapabilities())
                .map(DataUtils::networkCapabilityToApnType).toArray();
        int apnType = 0;
        for (int apn : apnTypes) {
            apnType |= apn;
        }
        if (apnType == 0 ? !mDataSettingsManager.isDataEnabled()
                : !mDataSettingsManager.isDataEnabled(apnType)) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_DISABLED);
        }

        // TODO: Handle restricted request
        // TODO: Handle unmetered request
        // Check if device is CDMA and is currently in ECBM
        if (mPhone.isInEcm() && mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.EMERGENCY_CALL);
        }

        if (!evaluation.isDataAllowed()) {
            // TODO: Add more soft disallowed reason bypass support.
        } else {
        // Check whether to allow data in certain situations if data is disallowed for soft reasons
        if (evaluation.isDataAllowed()) {
            evaluation.addDataAllowedReason(DataAllowedReason.NORMAL);
        } else if (!evaluation.containsHardDisallowedReasons()) {
            // Check if request is MMS and MMS is always allowed
            if (networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)
                    && mDataSettingsManager.isMmsAlwaysAllowed()) {
                evaluation.addDataAllowedReason(DataAllowedReason.MMS_REQUEST);
            }

            // Check if request is unmetered (WiFi or unmetered APN)
            if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
                evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE);
            } else if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
                List<Integer> meteredApns = mServiceState.getDataRoaming()
                        ? mDataConfigManager.getMeteredApnTypesWhenRoaming()
                        : mDataConfigManager.getMeteredApnTypes();
                boolean unmetered = !meteredApns.isEmpty() && apnTypes.length != 0;
                for (int apn : apnTypes) {
                    if (meteredApns.contains(apn)) {
                        unmetered = false;
                        break;
                    }
                }
                if (unmetered) {
                    evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE);
                }
            }

            // Check if request is restricted
            if (!networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
                evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST);
            }
        }

        if (evaluation.isDataAllowed()) {
            evaluation.setCandidateDataProfile(dataProfile);
        }

@@ -1109,8 +1165,22 @@ public class DataNetworkController extends Handler {
            evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_RESTRICTED_BY_NETWORK);
        }

        // TODO: Add data enabled check after DataSettingsManager is available.
        // TODO: Add data roaming check after DataSettingsManager is available.
        // Check if device is CDMA and is currently in ECBM
        if (mPhone.isInEcm() && mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.EMERGENCY_CALL);
        }

        // Check if data is disabled
        boolean dataDisabled = false;
        if (!mDataSettingsManager.isDataEnabled()) {
            dataDisabled = true;
        }

        // Check if data roaming is disabled
        if (mPhone.getServiceState().getDataRoaming()
                && !mDataSettingsManager.isDataRoamingEnabled()) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.ROAMING_DISABLED);
        }

        // Check if current data network type is allowed by the data profile. Use the lingering
        // network type. Some data network is allowed to create on certain RATs, but can linger
@@ -1118,17 +1188,27 @@ public class DataNetworkController extends Handler {
        // extend its life cycle to 3G.
        int networkType = getDataNetworkType(dataNetwork.getTransport());
        DataProfile dataProfile = dataNetwork.getDataProfile();
        if (dataProfile.getApnSetting() != null
        if (dataProfile.getApnSetting() != null) {
            // Check if data is disabled for the APN type
            dataDisabled = !mDataSettingsManager.isDataEnabled(
                    dataProfile.getApnSetting().getApnTypeBitmask());

            // Sometimes network temporarily OOS and network type becomes UNKNOWN. We don't
            // tear down network in that case.
                && networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN
            if (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN
                    && !dataProfile.getApnSetting().canSupportLingeringNetworkType(networkType)) {
                log("networkType=" + TelephonyManager.getNetworkTypeName(networkType)
                        + ", networkTypeBitmask="
                        + dataProfile.getApnSetting().getNetworkTypeBitmask()
                        + ", lingeringNetworkTypeBitmask="
                        + dataProfile.getApnSetting().getLingeringNetworkTypeBitmask());
            evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_NETWORK_TYPE_NOT_ALLOWED);
                evaluation.addDataDisallowedReason(
                        DataDisallowedReason.DATA_NETWORK_TYPE_NOT_ALLOWED);
            }
        }

        if (dataDisabled) {
            evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_DISABLED);
        }

        if (evaluation.isDataAllowed()) {
Loading