From 63242bc3ff82a0922f8a9671a2d206a0f13ce19c Mon Sep 17 00:00:00 2001 From: tom hsu Date: Tue, 11 Feb 2025 11:14:23 +0000 Subject: [PATCH] [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 --- .../settings/network/SatelliteRepository.kt | 25 ++++++++++++- .../network/SatelliteRepositoryTest.kt | 37 ++++++++++++++++++- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/network/SatelliteRepository.kt b/src/com/android/settings/network/SatelliteRepository.kt index c70484a7e7a..994f8ec96d4 100644 --- a/src/com/android/settings/network/SatelliteRepository.kt +++ b/src/com/android/settings/network/SatelliteRepository.kt @@ -23,6 +23,7 @@ import android.telephony.satellite.SatelliteModemStateCallback 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 @@ import kotlinx.coroutines.flow.flowOn /** * A repository class for interacting with the SatelliteManager API. */ -class SatelliteRepository( +open class SatelliteRepository( private val context: Context, ) { @@ -196,6 +197,28 @@ class SatelliteRepository( } } + /** + * @return A list with application package names which support Satellite service. + * e.g. "com.android.settings" + */ + open fun getSatelliteDataOptimizedApps(): List { + 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 619d290f0c4..0f845df90e7 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 @@ package com.android.settings.network 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.Mockito.* 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 @@ class SatelliteRepositoryTest { 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() + } +}