Merge "Dismiss the open dialog if preference is disabled" into main

This commit is contained in:
Chaohui Wang
2023-10-19 07:51:03 +00:00
committed by Android (Google) Code Review
3 changed files with 33 additions and 13 deletions

View File

@@ -29,9 +29,12 @@ import android.telephony.TelephonyManager;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent; import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.ListPreference; import androidx.preference.ListPreference;
import androidx.preference.ListPreferenceDialogFragmentCompat;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -67,6 +70,7 @@ public class EnabledNetworkModePreferenceController extends
private SubscriptionsChangeListener mSubscriptionsListener; private SubscriptionsChangeListener mSubscriptionsListener;
private int mCallState = TelephonyManager.CALL_STATE_IDLE; private int mCallState = TelephonyManager.CALL_STATE_IDLE;
private PhoneCallStateTelephonyCallback mTelephonyCallback; private PhoneCallStateTelephonyCallback mTelephonyCallback;
private FragmentManager mFragmentManager;
public EnabledNetworkModePreferenceController(Context context, String key) { public EnabledNetworkModePreferenceController(Context context, String key) {
super(context, key); super(context, key);
@@ -151,7 +155,16 @@ public class EnabledNetworkModePreferenceController extends
listPreference.setEntryValues(mBuilder.getEntryValues()); listPreference.setEntryValues(mBuilder.getEntryValues());
listPreference.setValue(Integer.toString(mBuilder.getSelectedEntryValue())); listPreference.setValue(Integer.toString(mBuilder.getSelectedEntryValue()));
listPreference.setSummary(mBuilder.getSummary()); listPreference.setSummary(mBuilder.getSummary());
listPreference.setEnabled(isCallStateIdle()); boolean listPreferenceEnabled = isCallStateIdle();
listPreference.setEnabled(listPreferenceEnabled);
if (!listPreferenceEnabled) {
// If dialog is already opened when ListPreference disabled, dismiss them.
for (Fragment fragment : mFragmentManager.getFragments()) {
if (fragment instanceof ListPreferenceDialogFragmentCompat) {
((ListPreferenceDialogFragmentCompat) fragment).dismiss();
}
}
}
} }
@Override @Override
@@ -169,8 +182,9 @@ public class EnabledNetworkModePreferenceController extends
return false; return false;
} }
void init(int subId) { void init(int subId, FragmentManager fragmentManager) {
mSubId = subId; mSubId = subId;
mFragmentManager = fragmentManager;
mTelephonyManager = mContext.getSystemService(TelephonyManager.class) mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
.createForSubscriptionId(mSubId); .createForSubscriptionId(mSubId);
mBuilder = new PreferenceEntriesBuilder(mContext, mSubId); mBuilder = new PreferenceEntriesBuilder(mContext, mSubId);

View File

@@ -260,7 +260,7 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings impleme
use(CarrierPreferenceController.class).init(mSubId); use(CarrierPreferenceController.class).init(mSubId);
use(DataUsagePreferenceController.class).init(mSubId); use(DataUsagePreferenceController.class).init(mSubId);
use(PreferredNetworkModePreferenceController.class).init(mSubId); use(PreferredNetworkModePreferenceController.class).init(mSubId);
use(EnabledNetworkModePreferenceController.class).init(mSubId); use(EnabledNetworkModePreferenceController.class).init(mSubId, getParentFragmentManager());
use(DataServiceSetupPreferenceController.class).init(mSubId); use(DataServiceSetupPreferenceController.class).init(mSubId);
use(Enable2gPreferenceController.class).init(mSubId); use(Enable2gPreferenceController.class).init(mSubId);
use(CarrierWifiTogglePreferenceController.class).init(getLifecycle(), mSubId); use(CarrierWifiTogglePreferenceController.class).init(getLifecycle(), mSubId);

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2021 The Android Open Source Project * Copyright (C) 2023 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -46,6 +46,7 @@ import android.telephony.ServiceState;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleOwner;
import androidx.preference.ListPreference; import androidx.preference.ListPreference;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
@@ -64,6 +65,8 @@ import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.util.Collections;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class EnabledNetworkModePreferenceControllerTest { public class EnabledNetworkModePreferenceControllerTest {
private static final int SUB_ID = 2; private static final int SUB_ID = 2;
@@ -80,6 +83,8 @@ public class EnabledNetworkModePreferenceControllerTest {
private CarrierConfigCache mCarrierConfigCache; private CarrierConfigCache mCarrierConfigCache;
@Mock @Mock
private ServiceState mServiceState; private ServiceState mServiceState;
@Mock
private FragmentManager mFragmentManager;
private PersistableBundle mPersistableBundle; private PersistableBundle mPersistableBundle;
private EnabledNetworkModePreferenceController mController; private EnabledNetworkModePreferenceController mController;
@@ -111,7 +116,8 @@ public class EnabledNetworkModePreferenceControllerTest {
mController = new EnabledNetworkModePreferenceController(mContext, KEY); mController = new EnabledNetworkModePreferenceController(mContext, KEY);
mockAllowedNetworkTypes(ALLOWED_ALL_NETWORK_TYPE); mockAllowedNetworkTypes(ALLOWED_ALL_NETWORK_TYPE);
mockAccessFamily(TelephonyManager.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA); mockAccessFamily(TelephonyManager.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA);
mController.init(SUB_ID); when(mFragmentManager.getFragments()).thenReturn(Collections.emptyList());
mController.init(SUB_ID, mFragmentManager);
mPreference.setKey(mController.getPreferenceKey()); mPreference.setKey(mController.getPreferenceKey());
} }
@@ -205,7 +211,7 @@ public class EnabledNetworkModePreferenceControllerTest {
public void updateState_5gWorldPhone_GlobalHasNr() { public void updateState_5gWorldPhone_GlobalHasNr() {
mockAllowedNetworkTypes(ALLOWED_ALL_NETWORK_TYPE); mockAllowedNetworkTypes(ALLOWED_ALL_NETWORK_TYPE);
mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA); mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA);
mController.init(SUB_ID); mController.init(SUB_ID, mFragmentManager);
mPersistableBundle.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true); mPersistableBundle.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
mController.updateState(mPreference); mController.updateState(mPreference);
@@ -221,7 +227,7 @@ public class EnabledNetworkModePreferenceControllerTest {
mockAllowedNetworkTypes(ALLOWED_ALL_NETWORK_TYPE); mockAllowedNetworkTypes(ALLOWED_ALL_NETWORK_TYPE);
mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA); mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA); mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
mController.init(SUB_ID); mController.init(SUB_ID, mFragmentManager);
// NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA = NR | LTE | RAF_TD_SCDMA | GSM | WCDMA // NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA = NR | LTE | RAF_TD_SCDMA | GSM | WCDMA
when(mTelephonyManager.getAllowedNetworkTypesForReason( when(mTelephonyManager.getAllowedNetworkTypesForReason(
@@ -241,7 +247,7 @@ public class EnabledNetworkModePreferenceControllerTest {
mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA); mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA); mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE); mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE);
mController.init(SUB_ID); mController.init(SUB_ID, mFragmentManager);
// NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA = NR | LTE | RAF_TD_SCDMA | GSM | WCDMA // NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA = NR | LTE | RAF_TD_SCDMA | GSM | WCDMA
when(mTelephonyManager.getAllowedNetworkTypesForReason( when(mTelephonyManager.getAllowedNetworkTypesForReason(
@@ -261,7 +267,7 @@ public class EnabledNetworkModePreferenceControllerTest {
mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA); mockEnabledNetworkMode(TelephonyManagerConstants.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA); mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA);
mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE); mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE);
mController.init(SUB_ID); mController.init(SUB_ID, mFragmentManager);
// NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA = NR | LTE | RAF_TD_SCDMA | GSM | WCDMA // NETWORK_MODE_NR_LTE_TDSCDMA_GSM_WCDMA = NR | LTE | RAF_TD_SCDMA | GSM | WCDMA
when(mTelephonyManager.getAllowedNetworkTypesForReason( when(mTelephonyManager.getAllowedNetworkTypesForReason(
@@ -281,7 +287,7 @@ public class EnabledNetworkModePreferenceControllerTest {
mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA); mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA);
mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE); mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE);
mController.init(SUB_ID); mController.init(SUB_ID, mFragmentManager);
// NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA = LTE | CDMA | EVDO | GSM | WCDMA // NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA = LTE | CDMA | EVDO | GSM | WCDMA
when(mTelephonyManager.getAllowedNetworkTypesForReason( when(mTelephonyManager.getAllowedNetworkTypesForReason(
@@ -304,7 +310,7 @@ public class EnabledNetworkModePreferenceControllerTest {
public void updateState_GlobalDisAllowed5g_GlobalWithoutNR() { public void updateState_GlobalDisAllowed5g_GlobalWithoutNR() {
mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA); mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA);
mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE); mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE);
mController.init(SUB_ID); mController.init(SUB_ID, mFragmentManager);
mPersistableBundle.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true); mPersistableBundle.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
// NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA = NR | LTE | CDMA | EVDO | GSM | WCDMA // NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA = NR | LTE | CDMA | EVDO | GSM | WCDMA
@@ -324,7 +330,7 @@ public class EnabledNetworkModePreferenceControllerTest {
public void updateState_GlobalDisAllowed5g_SelectOnGlobal() { public void updateState_GlobalDisAllowed5g_SelectOnGlobal() {
mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA); mockAccessFamily(TelephonyManager.NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA);
mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE); mockAllowedNetworkTypes(DISABLED_5G_NETWORK_TYPE);
mController.init(SUB_ID); mController.init(SUB_ID, mFragmentManager);
mPersistableBundle.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true); mPersistableBundle.putBoolean(CarrierConfigManager.KEY_WORLD_MODE_ENABLED_BOOL, true);
// NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA = NR | LTE | CDMA | EVDO | GSM | WCDMA // NETWORK_MODE_NR_LTE_CDMA_EVDO_GSM_WCDMA = NR | LTE | CDMA | EVDO | GSM | WCDMA
@@ -497,7 +503,7 @@ public class EnabledNetworkModePreferenceControllerTest {
mPersistableBundle.putBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL, true); mPersistableBundle.putBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL, true);
mPersistableBundle.putBoolean(CarrierConfigManager.KEY_LTE_ENABLED_BOOL, true); mPersistableBundle.putBoolean(CarrierConfigManager.KEY_LTE_ENABLED_BOOL, true);
} }
mController.init(SUB_ID); mController.init(SUB_ID, mFragmentManager);
} }
private void mockAllowedNetworkTypes(long allowedNetworkType) { private void mockAllowedNetworkTypes(long allowedNetworkType) {