Merge tag 'android-13.0.0_r52' into int/13/fp3

Android 13.0.0 Release 52 (TQ3A.230605.012)

* tag 'android-13.0.0_r52':
  Fetching Phone number
  Update to /external/robolectric rather than older /external/robolectric-shadows

Change-Id: I01cfbb59a71734fd4030709ee97d3bf9f632c10d
diff --git a/Android.bp b/Android.bp
index 2917cfc..b586dc6 100644
--- a/Android.bp
+++ b/Android.bp
@@ -53,8 +53,8 @@
 }
 
 filegroup {
-    name: "mms-metrics-srcs",
+    name: "mms-service-srcs",
     srcs: [
-        "src/com/android/mms/service/metrics/*.java",
+        "src/com/android/mms/service/**/*.java",
     ],
-}
\ No newline at end of file
+}
diff --git a/src/com/android/mms/service/MmsHttpClient.java b/src/com/android/mms/service/MmsHttpClient.java
index 5cec66f..b54b1aa 100644
--- a/src/com/android/mms/service/MmsHttpClient.java
+++ b/src/com/android/mms/service/MmsHttpClient.java
@@ -52,6 +52,8 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import com.android.internal.annotations.VisibleForTesting;
+
 /**
  * MMS HTTP client for sending and downloading MMS messages
  */
@@ -452,6 +454,21 @@
         return sb.toString();
     }
 
+    private static String getPhoneNumberForMacroLine1(TelephonyManager telephonyManager,
+        Context context, int subId) {
+        String phoneNo = telephonyManager.getLine1Number();
+        if (TextUtils.isEmpty(phoneNo)) {
+            SubscriptionManager subscriptionManager = context.getSystemService(
+                SubscriptionManager.class);
+            if (subscriptionManager != null) {
+                phoneNo = subscriptionManager.getPhoneNumber(subId);
+            } else {
+                LogUtil.e("subscriptionManager is null");
+            }
+        }
+        return phoneNo;
+    }
+
     /*
      * Macro names
      */
@@ -471,15 +488,16 @@
      * @param subId     The subscription ID used to get line number, etc.
      * @return The value of the defined macro
      */
-    private static String getMacroValue(Context context, String macro, Bundle mmsConfig,
-            int subId) {
+    @VisibleForTesting
+    public static String getMacroValue(Context context, String macro, Bundle mmsConfig,
+        int subId) {
         final TelephonyManager telephonyManager = ((TelephonyManager) context.getSystemService(
             Context.TELEPHONY_SERVICE)).createForSubscriptionId(subId);
         if (MACRO_LINE1.equals(macro)) {
-            return telephonyManager.getLine1Number();
+            return getPhoneNumberForMacroLine1(telephonyManager, context, subId);
         } else if (MACRO_LINE1NOCOUNTRYCODE.equals(macro)) {
             return PhoneUtils.getNationalNumber(telephonyManager,
-                telephonyManager.getLine1Number());
+                getPhoneNumberForMacroLine1(telephonyManager, context, subId));
         } else if (MACRO_NAI.equals(macro)) {
             return getNai(telephonyManager, mmsConfig);
         }
diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp
index 1b170c0..5821367 100644
--- a/tests/robotests/Android.bp
+++ b/tests/robotests/Android.bp
@@ -19,4 +19,5 @@
     ],
 
     instrumentation_for: "MmsService",
+    upstream: true,
 }
diff --git a/tests/unittests/Android.bp b/tests/unittests/Android.bp
index 92371c6..595b4be 100644
--- a/tests/unittests/Android.bp
+++ b/tests/unittests/Android.bp
@@ -19,9 +19,9 @@
         "android.test.base",
         "android.test.mock",
     ],
-    srcs: ["src/**/*.java", ":mms-metrics-srcs"],
+    srcs: ["src/**/*.java", ":mms-service-srcs"],
     platform_apis: true,
     test_suites: ["device-tests"],
     certificate: "platform",
     instrumentation_for: "MmsService",
-}
\ No newline at end of file
+}
diff --git a/tests/unittests/src/com/android/mms/service/MmsHttpClientTest.java b/tests/unittests/src/com/android/mms/service/MmsHttpClientTest.java
new file mode 100644
index 0000000..dd126e8
--- /dev/null
+++ b/tests/unittests/src/com/android/mms/service/MmsHttpClientTest.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2023 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.mms.service;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.os.Bundle;
+import android.telephony.ServiceState;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.After;
+import org.junit.Before;
+import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+import org.junit.Test;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.reset;
+
+import android.util.Log;
+
+public class MmsHttpClientTest {
+    // Mocked classes
+    private Context mContext;
+    private TelephonyManager mTelephonyManager;
+    private SubscriptionManager mSubscriptionManager;
+
+    // The raw phone number from TelephonyManager.getLine1Number
+    private static final String MACRO_LINE1 = "LINE1";
+    // The phone number without country code
+    private static final String MACRO_LINE1NOCOUNTRYCODE = "LINE1NOCOUNTRYCODE";
+    private String line1Number = "1234567890";
+    private String subscriberPhoneNumber = "0987654321";
+    private int subId = 1;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(ApplicationProvider.getApplicationContext());
+        mTelephonyManager = mock(TelephonyManager.class);
+        mSubscriptionManager = mock(SubscriptionManager.class);
+
+        when(mContext.getSystemService(Context.TELEPHONY_SERVICE))
+            .thenReturn(mTelephonyManager);
+        when(mTelephonyManager.createForSubscriptionId(anyInt()))
+            .thenReturn(mTelephonyManager);
+        when(mContext.getSystemService(SubscriptionManager.class))
+            .thenReturn(mSubscriptionManager);
+    }
+
+    @After
+    public void tearDown() {
+        mContext = null;
+        mTelephonyManager = null;
+        mSubscriptionManager = null;
+    }
+
+    @Test
+    public void getPhoneNumberForMacroLine1() {
+        String macro = MACRO_LINE1;
+        Bundle mmsConfig = new Bundle();
+        String emptyStr = "";
+        String phoneNo;
+
+        /* when getLine1Number returns valid number */
+        doReturn(line1Number).when(mTelephonyManager).getLine1Number();
+        phoneNo = MmsHttpClient.getMacroValue(mContext, macro, mmsConfig, subId);
+        assertThat(phoneNo).isEqualTo(line1Number);
+        // getLine1NumberAPI should be called
+        verify(mTelephonyManager).getLine1Number();
+        // getPhoneNumber should never be called
+        verify(mSubscriptionManager, never()).getPhoneNumber(subId);
+
+        /* when getLine1Number returns empty string */
+        doReturn(emptyStr).when(mTelephonyManager).getLine1Number();
+        when(mSubscriptionManager.getPhoneNumber(subId)).thenReturn(subscriberPhoneNumber);
+        phoneNo = MmsHttpClient.getMacroValue(mContext, macro, mmsConfig, subId);
+        assertThat(phoneNo).isEqualTo(subscriberPhoneNumber);
+        verify(mSubscriptionManager).getPhoneNumber(subId);
+
+        /* when getLine1Number returns null */
+        reset(mSubscriptionManager);
+        when(mSubscriptionManager.getPhoneNumber(subId)).thenReturn(subscriberPhoneNumber);
+        doReturn(null).when(mTelephonyManager).getLine1Number();
+        phoneNo = MmsHttpClient.getMacroValue(mContext, macro, mmsConfig, subId);
+        assertThat(phoneNo).isEqualTo(subscriberPhoneNumber);
+        verify(mSubscriptionManager).getPhoneNumber(subId);
+    }
+
+    @Test
+    public void getPhoneNumberForMacroLine1CountryCode() throws Exception {
+        String macro = MACRO_LINE1NOCOUNTRYCODE;
+        String emptyStr = "";
+        String phoneNo;
+        Bundle mmsConfig = new Bundle();
+
+        /* when getLine1Number returns valid number */
+        doReturn(line1Number).when(mTelephonyManager).getLine1Number();
+        phoneNo = MmsHttpClient.getMacroValue(mContext, macro, mmsConfig, subId);
+        assertThat(phoneNo).contains(line1Number);
+        // getLine1NumberAPI should be called
+        verify(mTelephonyManager).getLine1Number();
+        // getPhoneNumber should never be called
+        verify(mSubscriptionManager, never()).getPhoneNumber(subId);
+
+        /* when getLine1Number returns empty string */
+        doReturn(emptyStr).when(mTelephonyManager).getLine1Number();
+        when(mSubscriptionManager.getPhoneNumber(subId)).thenReturn(subscriberPhoneNumber);
+        phoneNo = MmsHttpClient.getMacroValue(mContext, macro, mmsConfig, subId);
+        assertThat(phoneNo).contains(subscriberPhoneNumber);
+        verify(mSubscriptionManager).getPhoneNumber(subId);
+
+        /* when getLine1Number returns null */
+        reset(mSubscriptionManager);
+        when(mSubscriptionManager.getPhoneNumber(subId)).thenReturn(subscriberPhoneNumber);
+        doReturn(null).when(mTelephonyManager).getLine1Number();
+        phoneNo = MmsHttpClient.getMacroValue(mContext, macro, mmsConfig, subId);
+        assertThat(phoneNo).contains(subscriberPhoneNumber);
+        verify(mSubscriptionManager).getPhoneNumber(subId);
+    }
+}