Support api to control data by thermal service

Support api to control data by thermal service
Restructure data enablement API to have single API
with reason as an input to stop adding new apis
for new usecases.

Bug: 151342791
Test: cts
Change-Id: Ic5634e6f790bee8586ace1653fecd4ce4e738a82
diff --git a/src/java/com/android/internal/telephony/GsmCdmaPhone.java b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
index 3a5dbbf..9b57076 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaPhone.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
@@ -3078,7 +3078,8 @@
             case EVENT_SET_CARRIER_DATA_ENABLED:
                 ar = (AsyncResult) msg.obj;
                 boolean enabled = (boolean) ar.result;
-                mDataEnabledSettings.setCarrierDataEnabled(enabled);
+                mDataEnabledSettings.setDataEnabled(TelephonyManager.DATA_ENABLED_REASON_CARRIER,
+                        enabled);
                 break;
             case EVENT_DEVICE_PROVISIONED_CHANGE:
                 mDataEnabledSettings.updateProvisionedChanged();
diff --git a/src/java/com/android/internal/telephony/MultiSimSettingController.java b/src/java/com/android/internal/telephony/MultiSimSettingController.java
index af76f8c..2b99369 100644
--- a/src/java/com/android/internal/telephony/MultiSimSettingController.java
+++ b/src/java/com/android/internal/telephony/MultiSimSettingController.java
@@ -699,7 +699,8 @@
                     && phone.isUserDataEnabled()
                     && !areSubscriptionsInSameGroup(defaultDataSub, phone.getSubId())) {
                 log("setting data to false on " + phone.getSubId());
-                phone.getDataEnabledSettings().setUserDataEnabled(false);
+                phone.getDataEnabledSettings().setDataEnabled(
+                        TelephonyManager.DATA_ENABLED_REASON_USER, false);
             }
         }
     }
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java b/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java
index 10c9db6..fc4619c 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java
@@ -69,7 +69,8 @@
                     REASON_PROVISIONED_CHANGED,
                     REASON_PROVISIONING_DATA_ENABLED_CHANGED,
                     REASON_OVERRIDE_RULE_CHANGED,
-                    REASON_OVERRIDE_CONDITION_CHANGED
+                    REASON_OVERRIDE_CONDITION_CHANGED,
+                    REASON_THERMAL_DATA_ENABLED
             })
     public @interface DataEnabledChangedReason {}
 
@@ -91,6 +92,8 @@
 
     public static final int REASON_OVERRIDE_CONDITION_CHANGED = 8;
 
+    public static final int REASON_THERMAL_DATA_ENABLED = 9;
+
     /**
      * responds to the setInternalDataEnabled call - used internally to turn off data.
      * For example during emergency calls
@@ -108,6 +111,15 @@
      */
     private boolean mCarrierDataEnabled = true;
 
+    /**
+     * Flag indicating data allowed by Thermal service or not.
+     */
+    private boolean mThermalDataEnabled = true;
+
+    /**
+     * Flag indicating whether data is allowed or not for the device. It can be disabled by
+     * user, carrier, policy or thermal
+     */
     private boolean mIsDataEnabled = false;
 
     private final Phone mPhone;
@@ -172,6 +184,7 @@
                 + ", mPolicyDataEnabled=" + mPolicyDataEnabled
                 + ", mCarrierDataEnabled=" + mCarrierDataEnabled
                 + ", mIsDataEnabled=" + mIsDataEnabled
+                + ", mThermalDataEnabled=" + mThermalDataEnabled
                 + ", " + mDataEnabledOverride
                 + "]";
     }
@@ -204,7 +217,7 @@
         return mInternalDataEnabled;
     }
 
-    public synchronized void setUserDataEnabled(boolean enabled) {
+    private synchronized void setUserDataEnabled(boolean enabled) {
         // By default the change should propagate to the group.
         setUserDataEnabled(enabled, true);
     }
@@ -233,6 +246,32 @@
         }
     }
 
+    /**
+     * Policy control of data connection with reason
+     * @param reason the reason the data enable change is taking place
+     * @param enabled True if enabling the data, otherwise disabling.
+     */
+    public synchronized void setDataEnabled(@TelephonyManager.DataEnabledReason int reason,
+            boolean enabled) {
+        switch (reason) {
+            case TelephonyManager.DATA_ENABLED_REASON_USER:
+                setUserDataEnabled(enabled);
+                break;
+            case TelephonyManager.DATA_ENABLED_REASON_CARRIER:
+                setCarrierDataEnabled(enabled);
+                break;
+            case TelephonyManager.DATA_ENABLED_REASON_POLICY:
+                setPolicyDataEnabled(enabled);
+                break;
+            case TelephonyManager.DATA_ENABLED_REASON_THERMAL:
+                setThermalDataEnabled(enabled);
+                break;
+            default:
+                log("Invalid data enable reason " + reason);
+                break;
+        }
+    }
+
     public synchronized boolean isUserDataEnabled() {
         // User data should always be true for opportunistic subscription.
         if (isStandAloneOpportunistic(mPhone.getSubId(), mPhone.getContext())) return true;
@@ -300,7 +339,7 @@
         return mDataEnabledOverride.isDataAllowedInVoiceCall();
     }
 
-    public synchronized void setPolicyDataEnabled(boolean enabled) {
+    private synchronized void setPolicyDataEnabled(boolean enabled) {
         if (mPolicyDataEnabled != enabled) {
             localLog("PolicyDataEnabled", enabled);
             mPolicyDataEnabled = enabled;
@@ -312,7 +351,7 @@
         return mPolicyDataEnabled;
     }
 
-    public synchronized void setCarrierDataEnabled(boolean enabled) {
+    private synchronized void setCarrierDataEnabled(boolean enabled) {
         if (mCarrierDataEnabled != enabled) {
             localLog("CarrierDataEnabled", enabled);
             mCarrierDataEnabled = enabled;
@@ -324,6 +363,18 @@
         return mCarrierDataEnabled;
     }
 
+    private synchronized void setThermalDataEnabled(boolean enabled) {
+        if (mThermalDataEnabled != enabled) {
+            localLog("ThermalDataEnabled", enabled);
+            mThermalDataEnabled = enabled;
+            updateDataEnabledAndNotify(REASON_THERMAL_DATA_ENABLED);
+        }
+    }
+
+    public synchronized boolean isThermalDataEnabled() {
+        return mThermalDataEnabled;
+    }
+
     public synchronized void updateProvisionedChanged() {
         updateDataEnabledAndNotify(REASON_PROVISIONED_CHANGED);
     }
@@ -336,6 +387,27 @@
         return mIsDataEnabled;
     }
 
+    /**
+     * Check if data is enabled for a specific reason {@@TelephonyManager.DataEnabledReason}
+     *
+     * @return {@code true} if the overall data is enabled; {@code false} if not.
+     */
+    public synchronized boolean isDataEnabledWithReason(
+            @TelephonyManager.DataEnabledReason int reason) {
+        switch (reason) {
+            case TelephonyManager.DATA_ENABLED_REASON_USER:
+                return isUserDataEnabled();
+            case TelephonyManager.DATA_ENABLED_REASON_CARRIER:
+                return isCarrierDataEnabled();
+            case TelephonyManager.DATA_ENABLED_REASON_POLICY:
+                return isPolicyDataEnabled();
+            case TelephonyManager.DATA_ENABLED_REASON_THERMAL:
+                return isThermalDataEnabled();
+            default:
+                return false;
+        }
+    }
+
     private synchronized void updateDataEnabledAndNotify(int reason) {
         boolean prevDataEnabled = mIsDataEnabled;
 
@@ -352,7 +424,7 @@
         } else {
             mIsDataEnabled = mInternalDataEnabled && (isUserDataEnabled() || mDataEnabledOverride
                     .shouldOverrideDataEnabledSettings(mPhone, ApnSetting.TYPE_ALL))
-                    && mPolicyDataEnabled && mCarrierDataEnabled;
+                    && mPolicyDataEnabled && mCarrierDataEnabled && mThermalDataEnabled;
         }
     }
 
@@ -469,7 +541,7 @@
                     .shouldOverrideDataEnabledSettings(mPhone, apnType);
 
             return (mInternalDataEnabled && mPolicyDataEnabled && mCarrierDataEnabled
-                    && (userDataEnabled || isDataEnabledOverridden));
+                    && mThermalDataEnabled && (userDataEnabled || isDataEnabledOverridden));
         }
     }
 
diff --git a/src/java/com/android/internal/telephony/vendor/VendorMultiSimSettingController.java b/src/java/com/android/internal/telephony/vendor/VendorMultiSimSettingController.java
index 026b6f5..117b0ea 100644
--- a/src/java/com/android/internal/telephony/vendor/VendorMultiSimSettingController.java
+++ b/src/java/com/android/internal/telephony/vendor/VendorMultiSimSettingController.java
@@ -18,17 +18,17 @@
 
 import android.content.Context;
 import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
 import android.telephony.SubscriptionInfo;
+import android.telephony.TelephonyManager;
 import android.util.Log;
+
 import com.android.internal.telephony.GlobalSettingsHelper;
 import com.android.internal.telephony.MultiSimSettingController;
-import com.android.internal.telephony.SubscriptionController;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.SubscriptionController;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 /*
  * Extending VendorMultiSimSettingController to override default
@@ -90,7 +90,8 @@
                 // For active subscription, call setUserDataEnabled through DataEnabledSettings.
                 Phone phone = PhoneFactory.getPhone(mSubController.getPhoneId(currentSubId));
                 if (phone != null) {
-                    phone.getDataEnabledSettings().setUserDataEnabled(enable);
+                    phone.getDataEnabledSettings().setDataEnabled(
+                            TelephonyManager.DATA_ENABLED_REASON_USER, enable);
                 }
             } else {
                 // For inactive subscription, directly write into global settings.
diff --git a/tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java
index af72c70..04e2eee 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java
@@ -313,7 +313,8 @@
         mMultiSimSettingControllerUT.notifyCarrierConfigChanged(0, 1);
         mMultiSimSettingControllerUT.notifyCarrierConfigChanged(1, 2);
         processAllMessages();
-        verify(mDataEnabledSettingsMock2).setUserDataEnabled(false);
+        verify(mDataEnabledSettingsMock2).setDataEnabled(
+                TelephonyManager.DATA_ENABLED_REASON_USER, false);
 
         // Enable on non-default sub should trigger setDefaultDataSubId.
         mMultiSimSettingControllerUT.notifyUserDataEnabled(2, true);
@@ -324,7 +325,8 @@
         doReturn(2).when(mSubControllerMock).getDefaultDataSubId();
         mMultiSimSettingControllerUT.notifyDefaultDataSubChanged();
         processAllMessages();
-        verify(mDataEnabledSettingsMock1).setUserDataEnabled(false);
+        verify(mDataEnabledSettingsMock1).setDataEnabled(
+                TelephonyManager.DATA_ENABLED_REASON_USER, false);
 
         doReturn(1).when(mSubControllerMock).getDefaultDataSubId();
         doReturn(1).when(mSubControllerMock).getDefaultSmsSubId();
@@ -391,7 +393,8 @@
         doReturn(1).when(mSubControllerMock).getDefaultDataSubId();
         mMultiSimSettingControllerUT.notifyDefaultDataSubChanged();
         processAllMessages();
-        verify(mDataEnabledSettingsMock2).setUserDataEnabled(false);
+        verify(mDataEnabledSettingsMock2).setDataEnabled(
+                TelephonyManager.DATA_ENABLED_REASON_USER, false);
         mMultiSimSettingControllerUT.notifyUserDataEnabled(2, false);
         processAllMessages();
         assertFalse(GlobalSettingsHelper.getBoolean(
@@ -439,7 +442,8 @@
         mMultiSimSettingControllerUT.notifyCarrierConfigChanged(1, 2);
         processAllMessages();
         verify(mSubControllerMock).setDefaultDataSubId(2);
-        verify(mDataEnabledSettingsMock1, never()).setUserDataEnabled(anyBoolean());
+        verify(mDataEnabledSettingsMock1, never()).setDataEnabled(
+                anyInt(), anyBoolean());
         // No user selection needed, no intent should be sent.
         verify(mContext, never()).sendBroadcast(any());
 
@@ -456,8 +460,10 @@
         mMultiSimSettingControllerUT.notifyUserDataEnabled(2, true);
         processAllMessages();
         verify(mSubControllerMock, never()).setDefaultDataSubId(anyInt());
-        verify(mDataEnabledSettingsMock1, never()).setUserDataEnabled(anyBoolean());
-        verify(mDataEnabledSettingsMock2, never()).setUserDataEnabled(anyBoolean());
+        verify(mDataEnabledSettingsMock1, never()).setDataEnabled(
+                eq(TelephonyManager.DATA_ENABLED_REASON_USER), anyBoolean());
+        verify(mDataEnabledSettingsMock2, never()).setDataEnabled(
+                TelephonyManager.DATA_ENABLED_REASON_USER, false);
     }
 
     @Test
@@ -551,13 +557,16 @@
         // loaded on both subscriptions.
         mMultiSimSettingControllerUT.notifyAllSubscriptionLoaded();
         processAllMessages();
-        verify(mDataEnabledSettingsMock2, never()).setUserDataEnabled(false);
+        verify(mDataEnabledSettingsMock2, never()).setDataEnabled(
+                TelephonyManager.DATA_ENABLED_REASON_USER, false);
         mMultiSimSettingControllerUT.notifyCarrierConfigChanged(0, 1);
         processAllMessages();
-        verify(mDataEnabledSettingsMock2, never()).setUserDataEnabled(false);
+        verify(mDataEnabledSettingsMock2, never()).setDataEnabled(
+                TelephonyManager.DATA_ENABLED_REASON_USER, false);
         mMultiSimSettingControllerUT.notifyCarrierConfigChanged(1, 2);
         processAllMessages();
-        verify(mDataEnabledSettingsMock2).setUserDataEnabled(false);
+        verify(mDataEnabledSettingsMock2).setDataEnabled(
+                TelephonyManager.DATA_ENABLED_REASON_USER, false);
 
         // Switch from sub 2 to sub 3 in phone[1].
         clearInvocations(mSubControllerMock);
@@ -639,7 +648,8 @@
                 SubscriptionManager.INVALID_SUBSCRIPTION_ID);
         processAllMessages();
         // Nothing should happen as carrier config is not ready for sub 2.
-        verify(mDataEnabledSettingsMock2, never()).setUserDataEnabled(false);
+        verify(mDataEnabledSettingsMock2, never()).setDataEnabled(
+                TelephonyManager.DATA_ENABLED_REASON_USER, false);
 
         // Still notify carrier config without specifying subId2, but this time subController
         // and CarrierConfigManager have subId 2 active and ready.
@@ -651,6 +661,7 @@
                 SubscriptionManager.INVALID_SUBSCRIPTION_ID);
         processAllMessages();
         // This time user data should be disabled on phone1.
-        verify(mDataEnabledSettingsMock2).setUserDataEnabled(false);
+        verify(mDataEnabledSettingsMock2).setDataEnabled(
+                TelephonyManager.DATA_ENABLED_REASON_USER, false);
     }
 }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledSettingsTest.java b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledSettingsTest.java
index 52c9573..b3fe158 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledSettingsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataEnabledSettingsTest.java
@@ -27,6 +27,7 @@
 import static org.mockito.Mockito.verify;
 
 import android.os.HandlerThread;
+import android.telephony.TelephonyManager;
 import android.telephony.data.ApnSetting;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -104,7 +105,7 @@
     @Test
     @SmallTest
     public void testSetAlwaysAllowMmsData() throws Exception {
-        mDataEnabledSettingsUT.setUserDataEnabled(false);
+        mDataEnabledSettingsUT.setDataEnabled(TelephonyManager.DATA_ENABLED_REASON_USER, false);
         assertTrue(mDataEnabledSettingsUT.setAlwaysAllowMmsData(true));
         ArgumentCaptor<String> stringCaptor = ArgumentCaptor.forClass(String.class);
         verify(mSubscriptionController).setDataEnabledOverrideRules(anyInt(),
@@ -120,7 +121,23 @@
         assertEquals("", stringCaptor.getValue());
         assertFalse(mDataEnabledSettingsUT.isDataEnabled(ApnSetting.TYPE_MMS));
 
-        mDataEnabledSettingsUT.setUserDataEnabled(true);
+        mDataEnabledSettingsUT.setDataEnabled(TelephonyManager.DATA_ENABLED_REASON_USER, true);
         assertTrue(mDataEnabledSettingsUT.isDataEnabled(ApnSetting.TYPE_MMS));
     }
+
+    @Test
+    @SmallTest
+    public void testSetThermalDataEnabled() throws Exception {
+        mDataEnabledSettingsUT.setDataEnabled(TelephonyManager.DATA_ENABLED_REASON_THERMAL,
+                false);
+        assertFalse(mDataEnabledSettingsUT.isDataEnabledWithReason(
+                TelephonyManager.DATA_ENABLED_REASON_THERMAL));
+        assertFalse(mDataEnabledSettingsUT.isDataEnabled());
+
+        mDataEnabledSettingsUT.setDataEnabled(TelephonyManager.DATA_ENABLED_REASON_THERMAL,
+                true);
+        assertTrue(mDataEnabledSettingsUT.isDataEnabledWithReason(
+                TelephonyManager.DATA_ENABLED_REASON_THERMAL));
+        assertTrue(mDataEnabledSettingsUT.isDataEnabled());
+    }
 }