Loading src/com/android/settings/network/telephony/MobileNetworkSettings.java +13 −5 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.ViewModelProvider; import androidx.preference.Preference; Loading @@ -66,6 +67,8 @@ import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.utils.ThreadUtils; import kotlin.Unit; import java.util.ArrayList; import java.util.Arrays; import java.util.List; Loading Loading @@ -359,6 +362,16 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings impleme public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); collectAirplaneModeAndFinishIfOn(this); LifecycleOwner viewLifecycleOwner = getViewLifecycleOwner(); new SubscriptionRepository(requireContext()) .collectSubscriptionVisible(mSubId, viewLifecycleOwner, (isVisible) -> { if (!isVisible) { Log.d(LOG_TAG, "Due to subscription not visible, closes page"); finishFragment(); } return Unit.INSTANCE; }); } @Override Loading Loading @@ -532,11 +545,6 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings impleme Log.d(LOG_TAG, "Set subInfo to default subInfo."); } } if (mSubscriptionInfoEntity == null && getActivity() != null) { // If the current subId is not existed, finish it. finishFragment(); return; } onSubscriptionDetailChanged(); } } src/com/android/settings/network/telephony/SubscriptionRepository.kt +25 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,31 @@ class SubscriptionRepository(private val context: Context) { fun getSelectableSubscriptionInfoList(): List<SubscriptionInfo> = context.getSelectableSubscriptionInfoList() /** Flow of whether the subscription visible for the given [subId]. */ fun isSubscriptionVisibleFlow(subId: Int): Flow<Boolean> { return subscriptionsChangedFlow() .map { val subInfo = subscriptionManager.availableSubscriptionInfoList?.firstOrNull { subInfo -> subInfo.subscriptionId == subId } subInfo != null && SubscriptionUtil.isSubscriptionVisible(subscriptionManager, context, subInfo) } .conflate() .onEach { Log.d(TAG, "[$subId] isSubscriptionVisibleFlow: $it") } .flowOn(Dispatchers.Default) } /** TODO: Move this to UI layer, when UI layer migrated to Kotlin. */ fun collectSubscriptionVisible( subId: Int, lifecycleOwner: LifecycleOwner, action: (Boolean) -> Unit, ) { isSubscriptionVisibleFlow(subId).collectLatestWithLifecycle(lifecycleOwner, action = action) } /** Flow of whether the subscription enabled for the given [subId]. */ fun isSubscriptionEnabledFlow(subId: Int): Flow<Boolean> { if (!SubscriptionManager.isValidSubscriptionId(subId)) return flowOf(false) Loading tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt +26 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,32 @@ class SubscriptionRepositoryTest { assertThat(subInfos.map { it.subscriptionId }).containsExactly(SUB_ID_3_NOT_IN_SLOT) } @Test fun isSubscriptionVisibleFlow_available_returnTrue() = runBlocking { mockSubscriptionManager.stub { on { getAvailableSubscriptionInfoList() } doReturn listOf(SubscriptionInfo.Builder().apply { setId(SUB_ID_IN_SLOT_0) }.build()) } val isVisible = repository.isSubscriptionVisibleFlow(SUB_ID_IN_SLOT_0).firstWithTimeoutOrNull() assertThat(isVisible).isTrue() } @Test fun isSubscriptionVisibleFlow_unavailable_returnFalse() = runBlocking { mockSubscriptionManager.stub { on { getAvailableSubscriptionInfoList() } doReturn listOf(SubscriptionInfo.Builder().apply { setId(SUB_ID_IN_SLOT_0) }.build()) } val isVisible = repository.isSubscriptionVisibleFlow(SUB_ID_IN_SLOT_1).firstWithTimeoutOrNull() assertThat(isVisible).isFalse() } @Test fun phoneNumberFlow() = runBlocking { mockSubscriptionManager.stub { Loading Loading
src/com/android/settings/network/telephony/MobileNetworkSettings.java +13 −5 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.ViewModelProvider; import androidx.preference.Preference; Loading @@ -66,6 +67,8 @@ import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.utils.ThreadUtils; import kotlin.Unit; import java.util.ArrayList; import java.util.Arrays; import java.util.List; Loading Loading @@ -359,6 +362,16 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings impleme public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); collectAirplaneModeAndFinishIfOn(this); LifecycleOwner viewLifecycleOwner = getViewLifecycleOwner(); new SubscriptionRepository(requireContext()) .collectSubscriptionVisible(mSubId, viewLifecycleOwner, (isVisible) -> { if (!isVisible) { Log.d(LOG_TAG, "Due to subscription not visible, closes page"); finishFragment(); } return Unit.INSTANCE; }); } @Override Loading Loading @@ -532,11 +545,6 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings impleme Log.d(LOG_TAG, "Set subInfo to default subInfo."); } } if (mSubscriptionInfoEntity == null && getActivity() != null) { // If the current subId is not existed, finish it. finishFragment(); return; } onSubscriptionDetailChanged(); } }
src/com/android/settings/network/telephony/SubscriptionRepository.kt +25 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,31 @@ class SubscriptionRepository(private val context: Context) { fun getSelectableSubscriptionInfoList(): List<SubscriptionInfo> = context.getSelectableSubscriptionInfoList() /** Flow of whether the subscription visible for the given [subId]. */ fun isSubscriptionVisibleFlow(subId: Int): Flow<Boolean> { return subscriptionsChangedFlow() .map { val subInfo = subscriptionManager.availableSubscriptionInfoList?.firstOrNull { subInfo -> subInfo.subscriptionId == subId } subInfo != null && SubscriptionUtil.isSubscriptionVisible(subscriptionManager, context, subInfo) } .conflate() .onEach { Log.d(TAG, "[$subId] isSubscriptionVisibleFlow: $it") } .flowOn(Dispatchers.Default) } /** TODO: Move this to UI layer, when UI layer migrated to Kotlin. */ fun collectSubscriptionVisible( subId: Int, lifecycleOwner: LifecycleOwner, action: (Boolean) -> Unit, ) { isSubscriptionVisibleFlow(subId).collectLatestWithLifecycle(lifecycleOwner, action = action) } /** Flow of whether the subscription enabled for the given [subId]. */ fun isSubscriptionEnabledFlow(subId: Int): Flow<Boolean> { if (!SubscriptionManager.isValidSubscriptionId(subId)) return flowOf(false) Loading
tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt +26 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,32 @@ class SubscriptionRepositoryTest { assertThat(subInfos.map { it.subscriptionId }).containsExactly(SUB_ID_3_NOT_IN_SLOT) } @Test fun isSubscriptionVisibleFlow_available_returnTrue() = runBlocking { mockSubscriptionManager.stub { on { getAvailableSubscriptionInfoList() } doReturn listOf(SubscriptionInfo.Builder().apply { setId(SUB_ID_IN_SLOT_0) }.build()) } val isVisible = repository.isSubscriptionVisibleFlow(SUB_ID_IN_SLOT_0).firstWithTimeoutOrNull() assertThat(isVisible).isTrue() } @Test fun isSubscriptionVisibleFlow_unavailable_returnFalse() = runBlocking { mockSubscriptionManager.stub { on { getAvailableSubscriptionInfoList() } doReturn listOf(SubscriptionInfo.Builder().apply { setId(SUB_ID_IN_SLOT_0) }.build()) } val isVisible = repository.isSubscriptionVisibleFlow(SUB_ID_IN_SLOT_1).firstWithTimeoutOrNull() assertThat(isVisible).isFalse() } @Test fun phoneNumberFlow() = runBlocking { mockSubscriptionManager.stub { Loading