diff --git a/src/com/android/settings/network/telephony/wificalling/WifiCallingRepository.kt b/src/com/android/settings/network/telephony/wificalling/WifiCallingRepository.kt index a5d4ba832ab..b5cdedae96c 100644 --- a/src/com/android/settings/network/telephony/wificalling/WifiCallingRepository.kt +++ b/src/com/android/settings/network/telephony/wificalling/WifiCallingRepository.kt @@ -21,14 +21,16 @@ import android.telephony.AccessNetworkConstants import android.telephony.CarrierConfigManager import android.telephony.CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL import android.telephony.SubscriptionManager -import android.telephony.TelephonyManager import android.telephony.ims.ImsMmTelManager.WiFiCallingMode import android.telephony.ims.feature.MmTelFeature import android.telephony.ims.stub.ImsRegistrationImplBase +import androidx.lifecycle.LifecycleOwner import com.android.settings.network.telephony.ims.ImsMmTelRepository import com.android.settings.network.telephony.ims.ImsMmTelRepositoryImpl import com.android.settings.network.telephony.ims.imsFeatureProvisionedFlow import com.android.settings.network.telephony.subscriptionsChangedFlow +import com.android.settings.network.telephony.telephonyManager +import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow @@ -38,13 +40,19 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext -class WifiCallingRepository( +interface IWifiCallingRepository { + /** TODO: Move this to UI layer, when UI layer migrated to Kotlin. */ + fun collectIsWifiCallingReadyFlow(lifecycleOwner: LifecycleOwner, action: (Boolean) -> Unit) +} + +class WifiCallingRepository +@JvmOverloads +constructor( private val context: Context, private val subId: Int, private val imsMmTelRepository: ImsMmTelRepository = ImsMmTelRepositoryImpl(context, subId) -) { - private val telephonyManager = context.getSystemService(TelephonyManager::class.java)!! - .createForSubscriptionId(subId) +) : IWifiCallingRepository { + private val telephonyManager = context.telephonyManager(subId) private val carrierConfigManager = context.getSystemService(CarrierConfigManager::class.java)!! @@ -59,6 +67,14 @@ class WifiCallingRepository( .getConfigForSubId(subId, KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL) .getBoolean(KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL) + /** TODO: Move this to UI layer, when UI layer migrated to Kotlin. */ + override fun collectIsWifiCallingReadyFlow( + lifecycleOwner: LifecycleOwner, + action: (Boolean) -> Unit, + ) { + wifiCallingReadyFlow().collectLatestWithLifecycle(lifecycleOwner, action = action) + } + @OptIn(ExperimentalCoroutinesApi::class) fun wifiCallingReadyFlow(): Flow { if (!SubscriptionManager.isValidSubscriptionId(subId)) return flowOf(false) diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java index 82537d48392..e5581d34b62 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java @@ -33,7 +33,6 @@ import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; import android.telephony.ims.ImsManager; import android.telephony.ims.ImsMmTelManager; -import android.telephony.ims.ProvisioningManager; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; @@ -42,12 +41,14 @@ import android.view.ViewGroup; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceClickListener; import androidx.preference.PreferenceScreen; -import com.android.ims.ImsConfig; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.Phone; import com.android.internal.telephony.flags.Flags; @@ -57,8 +58,12 @@ import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; import com.android.settings.core.SubSettingLauncher; import com.android.settings.network.ims.WifiCallingQueryImsState; +import com.android.settings.network.telephony.wificalling.IWifiCallingRepository; +import com.android.settings.network.telephony.wificalling.WifiCallingRepository; import com.android.settings.widget.SettingsMainSwitchPreference; +import kotlin.Unit; + import java.util.List; /** @@ -103,7 +108,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private ImsMmTelManager mImsMmTelManager; - private ProvisioningManager mProvisioningManager; private TelephonyManager mTelephonyManager; private PhoneTelephonyCallback mTelephonyCallback; @@ -188,19 +192,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment return true; }; - private final ProvisioningManager.Callback mProvisioningCallback = - new ProvisioningManager.Callback() { - @Override - public void onProvisioningIntChanged(int item, int value) { - if (item == ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED - || item == ImsConfig.ConfigConstants.VLT_SETTING_ENABLED) { - // The provisioning policy might have changed. Update the body to make sure - // this change takes effect if needed. - updateBody(); - } - } - }; - @VisibleForTesting void showAlert(Intent intent) { final Context context = getActivity(); @@ -263,14 +254,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment return new WifiCallingQueryImsState(getContext(), subId); } - @VisibleForTesting - ProvisioningManager getImsProvisioningManager() { - if (!SubscriptionManager.isValidSubscriptionId(mSubId)) { - return null; - } - return ProvisioningManager.createForSubscriptionId(mSubId); - } - @VisibleForTesting ImsMmTelManager getImsMmTelManager() { if (!SubscriptionManager.isValidSubscriptionId(mSubId)) { @@ -294,7 +277,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment FRAGMENT_BUNDLE_SUBID, SubscriptionManager.INVALID_SUBSCRIPTION_ID); } - mProvisioningManager = getImsProvisioningManager(); mImsMmTelManager = getImsMmTelManager(); mSwitchBar = (SettingsMainSwitchPreference) findPreference(SWITCH_BAR); @@ -336,19 +318,33 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment return view; } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + getWifiCallingRepository().collectIsWifiCallingReadyFlow( + getLifecycleOwner(), (isWifiWifiCallingReadyFlow) -> { + if (!isWifiWifiCallingReadyFlow) { + // This screen is not allowed to be shown due to provisioning policy and + // should therefore be closed. + finish(); + } + return Unit.INSTANCE; + }); + } + @VisibleForTesting - boolean isWfcProvisionedOnDevice() { - return queryImsState(mSubId).isWifiCallingProvisioned(); + @NonNull + IWifiCallingRepository getWifiCallingRepository() { + return new WifiCallingRepository(requireContext(), mSubId); + } + + @VisibleForTesting + @NonNull + LifecycleOwner getLifecycleOwner() { + return getViewLifecycleOwner(); } private void updateBody() { - if (!isWfcProvisionedOnDevice()) { - // This screen is not allowed to be shown due to provisioning policy and should - // therefore be closed. - finish(); - return; - } - final CarrierConfigManager configManager = (CarrierConfigManager) getSystemService(Context.CARRIER_CONFIG_SERVICE); boolean isWifiOnlySupported = true; @@ -448,8 +444,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment if (intent.getBooleanExtra(Phone.EXTRA_KEY_ALERT_SHOW, false)) { showAlert(intent); } - // Register callback for provisioning changes. - registerProvisioningChangedCallback(); } @Override @@ -462,8 +456,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment mSwitchBar.removeOnSwitchChangeListener(this); } context.unregisterReceiver(mIntentReceiver); - // Remove callback for provisioning changes. - unregisterProvisioningChangedCallback(); } /** @@ -699,27 +691,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment return SubscriptionManager.getResourcesForSubId(getContext(), mSubId); } - @VisibleForTesting - void registerProvisioningChangedCallback() { - if (mProvisioningManager == null) { - return; - } - try { - mProvisioningManager.registerProvisioningChangedCallback(getContext().getMainExecutor(), - mProvisioningCallback); - } catch (Exception ex) { - Log.w(TAG, "onResume: Unable to register callback for provisioning changes."); - } - } - - @VisibleForTesting - void unregisterProvisioningChangedCallback() { - if (mProvisioningManager == null) { - return; - } - mProvisioningManager.unregisterProvisioningChangedCallback(mProvisioningCallback); - } - /** * Determine whether to override roaming Wi-Fi calling preference when device is connected to * non-terrestrial network. diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java index 4497a0a62b9..4440bc94ca0 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java +++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java @@ -48,6 +48,8 @@ import android.telephony.TelephonyManager; import android.telephony.ims.ImsMmTelManager; import android.view.View; +import androidx.annotation.NonNull; +import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; @@ -56,10 +58,14 @@ import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.network.ims.MockWifiCallingQueryImsState; import com.android.settings.network.ims.WifiCallingQueryImsState; +import com.android.settings.network.telephony.wificalling.IWifiCallingRepository; import com.android.settings.testutils.shadow.ShadowFragment; import com.android.settings.widget.SettingsMainSwitchBar; import com.android.settings.widget.SettingsMainSwitchPreference; +import kotlin.Unit; +import kotlin.jvm.functions.Function1; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -183,35 +189,24 @@ public class WifiCallingSettingsForSubTest { } @Test - public void onResume_provisioningAllowed_shouldNotFinish() { - // Call onResume while provisioning is allowed. - mFragment.onResume(); + public void onViewCreated_provisioningAllowed_shouldNotFinish() { + // Call onViewCreated while provisioning is allowed. + mFragment.onViewCreated(mView, null); // Verify that finish() is not called. verify(mFragment, never()).finish(); } @Test - public void onResume_provisioningDisallowed_shouldFinish() { - // Call onResume while provisioning is disallowed. - mQueryImsState.setIsProvisionedOnDevice(false); - mFragment.onResume(); + public void onViewCreated_provisioningDisallowed_shouldFinish() { + // Call onViewCreated while provisioning is disallowed. + mFragment.mIsWifiCallingReady = false; + mFragment.onViewCreated(mView, null); // Verify that finish() is called verify(mFragment).finish(); } - @Test - public void onResumeOnPause_provisioningCallbackRegistration() throws Exception { - // Verify that provisioning callback is registered after call to onResume(). - mFragment.onResume(); - verify(mFragment).registerProvisioningChangedCallback(); - - // Verify that provisioning callback is unregistered after call to onPause. - mFragment.onPause(); - verify(mFragment).unregisterProvisioningChangedCallback(); - } - @Test public void onResume_useWfcHomeModeConfigFalseAndEditable_shouldShowWfcRoaming() { // Call onResume to update the WFC roaming preference. @@ -377,6 +372,7 @@ public class WifiCallingSettingsForSubTest { protected class TestFragment extends WifiCallingSettingsForSub { private SettingsMainSwitchPreference mSwitchPref; + protected boolean mIsWifiCallingReady = true; protected void setSwitchBar(SettingsMainSwitchPreference switchPref) { mSwitchPref = switchPref; @@ -421,6 +417,25 @@ public class WifiCallingSettingsForSubTest { return mQueryImsState; } + @Override + @NonNull + IWifiCallingRepository getWifiCallingRepository() { + return new IWifiCallingRepository() { + @Override + public void collectIsWifiCallingReadyFlow( + @NonNull LifecycleOwner lifecycleOwner, + @NonNull Function1 action) { + action.invoke(mIsWifiCallingReady); + } + }; + } + + @NonNull + @Override + LifecycleOwner getLifecycleOwner() { + return this; + } + @Override void showAlert(Intent intent) { }