Merge "New isSubscriptionVisibleFlow" into main
This commit is contained in:
@@ -41,6 +41,7 @@ import android.view.View;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.preference.Preference;
|
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.search.SearchIndexable;
|
||||||
import com.android.settingslib.utils.ThreadUtils;
|
import com.android.settingslib.utils.ThreadUtils;
|
||||||
|
|
||||||
|
import kotlin.Unit;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -359,6 +362,16 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings impleme
|
|||||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
collectAirplaneModeAndFinishIfOn(this);
|
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
|
@Override
|
||||||
@@ -532,11 +545,6 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings impleme
|
|||||||
Log.d(LOG_TAG, "Set subInfo to default subInfo.");
|
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();
|
onSubscriptionDetailChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,31 @@ class SubscriptionRepository(private val context: Context) {
|
|||||||
fun getSelectableSubscriptionInfoList(): List<SubscriptionInfo> =
|
fun getSelectableSubscriptionInfoList(): List<SubscriptionInfo> =
|
||||||
context.getSelectableSubscriptionInfoList()
|
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]. */
|
/** Flow of whether the subscription enabled for the given [subId]. */
|
||||||
fun isSubscriptionEnabledFlow(subId: Int): Flow<Boolean> {
|
fun isSubscriptionEnabledFlow(subId: Int): Flow<Boolean> {
|
||||||
if (!SubscriptionManager.isValidSubscriptionId(subId)) return flowOf(false)
|
if (!SubscriptionManager.isValidSubscriptionId(subId)) return flowOf(false)
|
||||||
|
|||||||
@@ -189,6 +189,32 @@ class SubscriptionRepositoryTest {
|
|||||||
assertThat(subInfos.map { it.subscriptionId }).containsExactly(SUB_ID_3_NOT_IN_SLOT)
|
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
|
@Test
|
||||||
fun phoneNumberFlow() = runBlocking {
|
fun phoneNumberFlow() = runBlocking {
|
||||||
mockSubscriptionManager.stub {
|
mockSubscriptionManager.stub {
|
||||||
|
|||||||
Reference in New Issue
Block a user