[Satellite Settings] Add a new API to SatelliteRepository

Flag: com.android.internal.telephony.flags.satellite_25q4_apis
Bug: b/395813844
Test: atest pass
Change-Id: Ife9e370dbcb3694adfd0bfbcc2ec2a742fbc4434
diff --git a/src/com/android/settings/network/SatelliteRepository.kt b/src/com/android/settings/network/SatelliteRepository.kt
index c70484a..994f8ec 100644
--- a/src/com/android/settings/network/SatelliteRepository.kt
+++ b/src/com/android/settings/network/SatelliteRepository.kt
@@ -23,6 +23,7 @@
 import android.util.Log
 import androidx.annotation.VisibleForTesting
 import androidx.concurrent.futures.CallbackToFutureAdapter
+import com.android.internal.telephony.flags.Flags
 import com.google.common.util.concurrent.Futures.immediateFuture
 import com.google.common.util.concurrent.ListenableFuture
 import java.util.concurrent.Executor
@@ -40,7 +41,7 @@
 /**
  * A repository class for interacting with the SatelliteManager API.
  */
-class SatelliteRepository(
+open class SatelliteRepository(
     private val context: Context,
 ) {
 
@@ -196,6 +197,28 @@
         }
     }
 
+    /**
+     *  @return A list with application package names which support Satellite service.
+     *  e.g. "com.android.settings"
+     */
+    open fun getSatelliteDataOptimizedApps(): List<String> {
+        if (!Flags.satellite25q4Apis()) {
+            return emptyList()
+        }
+        val satelliteManager: SatelliteManager? =
+            context.getSystemService(SatelliteManager::class.java)
+        if (satelliteManager == null) {
+            Log.d(TAG, "SatelliteManager is null")
+            return emptyList()
+        }
+        try {
+            return satelliteManager.getSatelliteDataOptimizedApps();
+        } catch (e: IllegalStateException) {
+            Log.w(TAG, "IllegalStateException $e")
+        }
+        return emptyList()
+    }
+
     companion object {
         private const val TAG: String = "SatelliteRepository"
 
diff --git a/tests/robotests/src/com/android/settings/network/SatelliteRepositoryTest.kt b/tests/robotests/src/com/android/settings/network/SatelliteRepositoryTest.kt
index 619d290..0f845df 100644
--- a/tests/robotests/src/com/android/settings/network/SatelliteRepositoryTest.kt
+++ b/tests/robotests/src/com/android/settings/network/SatelliteRepositoryTest.kt
@@ -18,10 +18,12 @@
 
 import android.content.Context
 import android.os.OutcomeReceiver
+import android.platform.test.annotations.EnableFlags
 import android.telephony.satellite.SatelliteManager
 import android.telephony.satellite.SatelliteManager.SatelliteException
 import android.telephony.satellite.SatelliteModemStateCallback
 import androidx.test.core.app.ApplicationProvider
+import com.android.internal.telephony.flags.Flags
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.ListenableFuture
 import kotlinx.coroutines.flow.first
@@ -38,10 +40,10 @@
 import org.mockito.Spy
 import org.mockito.junit.MockitoJUnit
 import org.mockito.junit.MockitoRule
+import org.mockito.kotlin.whenever
 import org.robolectric.RobolectricTestRunner
 import java.util.concurrent.Executor
 
-
 @RunWith(RobolectricTestRunner::class)
 class SatelliteRepositoryTest {
 
@@ -267,4 +269,35 @@
 
         assertThat(flow.first()).isFalse()
     }
-}
\ No newline at end of file
+
+    @Test
+    @EnableFlags(Flags.FLAG_SATELLITE_25Q4_APIS)
+    fun getSatelliteDataOptimizedApps_returnPackageNameList() = runBlocking {
+        whenever(
+            mockSatelliteManager.getSatelliteDataOptimizedApps()
+        ).thenReturn(
+            listOf(
+                "com.android.settings",
+                "com.android.apps.messaging",
+                "com.android.dialer",
+                "com.android.systemui"
+            )
+        )
+
+        val result = repository.getSatelliteDataOptimizedApps()
+
+        assertThat(result.size == 4).isTrue()
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_SATELLITE_25Q4_APIS)
+    fun getSatelliteDataOptimizedApps_noTelephony_returnEmptyList() = runBlocking {
+        whenever(
+            mockSatelliteManager.getSatelliteDataOptimizedApps()
+        ).thenThrow(IllegalStateException("Telephony is null"))
+
+        val result = repository.getSatelliteDataOptimizedApps()
+
+        assertThat(result.isEmpty()).isTrue()
+    }
+}