Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9136c78 authored by Chaohui Wang's avatar Chaohui Wang Committed by Android (Google) Code Review
Browse files

Merge "New isSubscriptionVisibleFlow" into main

parents 50ae8d3c 1b3a315d
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -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();
    }
}
+25 −0
Original line number Diff line number Diff line
@@ -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)
+26 −0
Original line number Diff line number Diff line
@@ -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 {