New isSubscriptionVisibleFlow

Use this instead of mSubscriptionInfoEntity, so MobileNetworkSettings
not closed unexpectedly.

Bug: 358238959
Flag: EXEMPT bug fix
Test: force stop settings & settings search - mobile settings
Test: adb shell am start -a android.settings.NETWORK_OPERATOR_SETTINGS
Change-Id: I34286da808600d8b9faa0da85a59665707ecfde3
This commit is contained in:
Chaohui Wang
2024-08-30 15:47:14 +08:00
parent d54d112e17
commit 1b3a315d06
3 changed files with 64 additions and 5 deletions

View File

@@ -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;
@@ -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;
@@ -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
@@ -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();
}
}

View File

@@ -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)

View File

@@ -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 {