Refactor SimStatusDialogRepository
- Move data logic into repository for better testing - Check carrier config first, if not shows some items, we don't need to load data - Tests in SimStatusDialogControllerTest will be fixed in later cls Bug: 337417520 Test: manual - on SIM status Test: unit test Change-Id: Ia0c32882f0b35ec9154b3da58ac6a7b98c879efc
This commit is contained in:
@@ -227,7 +227,6 @@ public class SimStatusDialogController implements DefaultLifecycleObserver {
|
||||
updateNetworkType();
|
||||
updateRoamingStatus(serviceState);
|
||||
updateIccidNumber();
|
||||
updateImsRegistrationState();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -257,7 +256,7 @@ public class SimStatusDialogController implements DefaultLifecycleObserver {
|
||||
.registerTelephonyCallback(mContext.getMainExecutor(), mTelephonyCallback);
|
||||
mSubscriptionManager.addOnSubscriptionsChangedListener(
|
||||
mContext.getMainExecutor(), mOnSubscriptionsChangedListener);
|
||||
collectImsRegistered(owner);
|
||||
collectSimStatusDialogInfo(owner);
|
||||
|
||||
if (mShowLatestAreaInfo) {
|
||||
updateAreaInfoText();
|
||||
@@ -581,39 +580,20 @@ public class SimStatusDialogController implements DefaultLifecycleObserver {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isImsRegistrationStateShowUp() {
|
||||
if (mSubscriptionInfo == null) {
|
||||
return false;
|
||||
}
|
||||
final int subscriptionId = mSubscriptionInfo.getSubscriptionId();
|
||||
final PersistableBundle carrierConfig =
|
||||
mCarrierConfigManager.getConfigForSubId(subscriptionId);
|
||||
return carrierConfig == null ? false :
|
||||
carrierConfig.getBoolean(
|
||||
CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL);
|
||||
private void updateImsRegistrationState(@Nullable Boolean imsRegistered) {
|
||||
boolean isVisible = imsRegistered != null;
|
||||
mDialog.setSettingVisibility(IMS_REGISTRATION_STATE_LABEL_ID, isVisible);
|
||||
mDialog.setSettingVisibility(IMS_REGISTRATION_STATE_VALUE_ID, isVisible);
|
||||
int stringId = Boolean.TRUE.equals(imsRegistered)
|
||||
? com.android.settingslib.R.string.ims_reg_status_registered
|
||||
: com.android.settingslib.R.string.ims_reg_status_not_registered;
|
||||
mDialog.setText(IMS_REGISTRATION_STATE_VALUE_ID, mRes.getString(stringId));
|
||||
}
|
||||
|
||||
private void updateImsRegistrationState() {
|
||||
if (isImsRegistrationStateShowUp()) {
|
||||
return;
|
||||
}
|
||||
mDialog.removeSettingFromScreen(IMS_REGISTRATION_STATE_LABEL_ID);
|
||||
mDialog.removeSettingFromScreen(IMS_REGISTRATION_STATE_VALUE_ID);
|
||||
}
|
||||
|
||||
private void collectImsRegistered(@NonNull LifecycleOwner owner) {
|
||||
if (!isImsRegistrationStateShowUp()) {
|
||||
return;
|
||||
}
|
||||
new ImsRegistrationStateController(mContext).collectImsRegistered(
|
||||
owner, mSlotIndex, (Boolean imsRegistered) -> {
|
||||
if (imsRegistered) {
|
||||
mDialog.setText(IMS_REGISTRATION_STATE_VALUE_ID, mRes.getString(
|
||||
com.android.settingslib.R.string.ims_reg_status_registered));
|
||||
} else {
|
||||
mDialog.setText(IMS_REGISTRATION_STATE_VALUE_ID, mRes.getString(
|
||||
com.android.settingslib.R.string.ims_reg_status_not_registered));
|
||||
}
|
||||
private void collectSimStatusDialogInfo(@NonNull LifecycleOwner owner) {
|
||||
new SimStatusDialogRepository(mContext).collectSimStatusDialogInfo(
|
||||
owner, mSlotIndex, (simStatusDialogInfo) -> {
|
||||
updateImsRegistrationState(simStatusDialogInfo.getImsRegistered());
|
||||
return Unit.INSTANCE;
|
||||
}
|
||||
);
|
||||
|
||||
@@ -91,6 +91,13 @@ public class SimStatusDialogFragment extends InstrumentedDialogFragment {
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
public void setSettingVisibility(int viewId, boolean isVisible) {
|
||||
final View view = mRootView.findViewById(viewId);
|
||||
if (view != null) {
|
||||
view.setVisibility(isVisible ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeSettingFromScreen(int viewId) {
|
||||
final View view = mRootView.findViewById(viewId);
|
||||
if (view != null) {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package com.android.settings.deviceinfo.simstatus
|
||||
|
||||
import android.content.Context
|
||||
import android.telephony.CarrierConfigManager
|
||||
import android.telephony.SubscriptionManager
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.LifecycleOwner
|
||||
@@ -25,44 +26,82 @@ import androidx.lifecycle.repeatOnLifecycle
|
||||
import com.android.settings.network.telephony.SimSlotRepository
|
||||
import com.android.settings.network.telephony.ims.ImsMmTelRepository
|
||||
import com.android.settings.network.telephony.ims.ImsMmTelRepositoryImpl
|
||||
import com.android.settings.network.telephony.safeGetConfig
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.combine
|
||||
import kotlinx.coroutines.flow.conflate
|
||||
import kotlinx.coroutines.flow.flatMapLatest
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.flow.flowOf
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
class ImsRegistrationStateController @JvmOverloads constructor(
|
||||
class SimStatusDialogRepository @JvmOverloads constructor(
|
||||
private val context: Context,
|
||||
private val simSlotRepository: SimSlotRepository = SimSlotRepository(context),
|
||||
private val imsMmTelRepositoryFactory: (subId: Int) -> ImsMmTelRepository = { subId ->
|
||||
ImsMmTelRepositoryImpl(context, subId)
|
||||
},
|
||||
) {
|
||||
fun collectImsRegistered(
|
||||
private val carrierConfigManager = context.getSystemService(CarrierConfigManager::class.java)!!
|
||||
|
||||
data class SimStatusDialogInfo(
|
||||
val imsRegistered: Boolean? = null,
|
||||
)
|
||||
|
||||
private data class SimStatusDialogVisibility(
|
||||
val imsRegisteredShowUp: Boolean,
|
||||
)
|
||||
|
||||
fun collectSimStatusDialogInfo(
|
||||
lifecycleOwner: LifecycleOwner,
|
||||
simSlotIndex: Int,
|
||||
action: (imsRegistered: Boolean) -> Unit,
|
||||
action: (info: SimStatusDialogInfo) -> Unit,
|
||||
) {
|
||||
lifecycleOwner.lifecycleScope.launch {
|
||||
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||
imsRegisteredFlow(simSlotIndex).collect(action)
|
||||
simStatusDialogInfoBySlotFlow(simSlotIndex).collect(action)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun imsRegisteredFlow(simSlotIndex: Int): Flow<Boolean> =
|
||||
private fun simStatusDialogInfoBySlotFlow(simSlotIndex: Int): Flow<SimStatusDialogInfo> =
|
||||
simSlotRepository.subIdInSimSlotFlow(simSlotIndex)
|
||||
.flatMapLatest { subId ->
|
||||
if (SubscriptionManager.isValidSubscriptionId(subId)) {
|
||||
imsMmTelRepositoryFactory(subId).imsRegisteredFlow()
|
||||
simStatusDialogInfoFlow(subId)
|
||||
} else {
|
||||
flowOf(false)
|
||||
flowOf(SimStatusDialogInfo())
|
||||
}
|
||||
}
|
||||
.conflate()
|
||||
.flowOn(Dispatchers.Default)
|
||||
|
||||
private fun simStatusDialogInfoFlow(subId: Int): Flow<SimStatusDialogInfo> =
|
||||
showUpFlow(subId).flatMapLatest { visibility ->
|
||||
combine(
|
||||
if (visibility.imsRegisteredShowUp) {
|
||||
imsMmTelRepositoryFactory(subId).imsRegisteredFlow()
|
||||
} else flowOf(null),
|
||||
) { (imsRegistered) ->
|
||||
SimStatusDialogInfo(imsRegistered = imsRegistered)
|
||||
}
|
||||
}
|
||||
|
||||
private fun showUpFlow(subId: Int) = flow {
|
||||
val config = carrierConfigManager.safeGetConfig(
|
||||
keys = listOf(CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL),
|
||||
subId = subId,
|
||||
)
|
||||
emit(
|
||||
SimStatusDialogVisibility(
|
||||
imsRegisteredShowUp = config.getBoolean(
|
||||
CarrierConfigManager.KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL
|
||||
),
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user