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

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

Merge "Implement DataSettingsManager"

parents 3128100e a74e9a42
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -72,7 +72,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