From a5c93b11452c94ec6948274e25ae689f043a2bf7 Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Fri, 16 Feb 2024 21:11:35 +0100 Subject: [PATCH 1/3] Fix-up starting style&wallpaper from search Make sure the index entry points to the fragment, rather than the actual target package as that's not supported. StyleSuggestionActivityBase handles starting the activity as configured in the controller by creating an Intent and using startActivity. Test: m, search/start wallpaper in SettingsIntelligence. Bug: 326889654 Change-Id: I3347a0473f269c817c5bd3233bcd69ffa962f716 Signed-off-by: Luca Stefani --- .../settings/wallpaper/WallpaperSuggestionActivity.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/wallpaper/WallpaperSuggestionActivity.java b/src/com/android/settings/wallpaper/WallpaperSuggestionActivity.java index 675e10fc2a0..14ef4833588 100644 --- a/src/com/android/settings/wallpaper/WallpaperSuggestionActivity.java +++ b/src/com/android/settings/wallpaper/WallpaperSuggestionActivity.java @@ -17,7 +17,6 @@ package com.android.settings.wallpaper; import android.app.WallpaperManager; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -81,10 +80,9 @@ public class WallpaperSuggestionActivity extends StyleSuggestionActivityBase imp SearchIndexableRaw data = new SearchIndexableRaw(context); data.title = controller.getTitle(); data.screenTitle = data.title; - ComponentName component = controller.getComponentName(); - data.intentTargetPackage = component.getPackageName(); - data.intentTargetClass = component.getClassName(); - data.intentAction = controller.getComponentActionName(); + data.intentTargetPackage = context.getPackageName(); + data.intentTargetClass = WallpaperSuggestionActivity.class.getName(); + data.intentAction = Intent.ACTION_MAIN; data.key = SUPPORT_SEARCH_INDEX_KEY; data.keywords = controller.getKeywords(); result.add(data); From e1acfb3db1282143ec859ae5e9be0e014cd22300 Mon Sep 17 00:00:00 2001 From: josephpv Date: Mon, 11 Dec 2023 11:34:00 +0000 Subject: [PATCH 2/3] Show customized message for private space while choosing lock The change adds private profile checks in addition to the exisiting managed profile check to show customized message while choosing lock for private profile in Pattern, PIN and Password screens. Bug: 311343571 Test: Verify lock screen message for private space Change-Id: Ic8173ff8c1af23fc593390acaff4c67390f99b9c Merged-In: Ic8173ff8c1af23fc593390acaff4c67390f99b9c --- res/values/strings.xml | 6 ++ .../settings/password/ChooseLockPassword.java | 70 ++++++++++++++----- .../settings/password/ChooseLockPattern.java | 8 +++ .../onelock/PrivateSpaceLockController.java | 2 + 4 files changed, 70 insertions(+), 16 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9f4f8e53a91..bf5643a58c2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1315,6 +1315,12 @@ Choose a lock for your private space You can unlock your private space using your fingerprint. For security, this option requires a backup lock. + + Set a PIN for your private space + + Set a password for your private space + + Set a pattern for your private space diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java index 800adb063cb..97d4d913454 100644 --- a/src/com/android/settings/password/ChooseLockPassword.java +++ b/src/com/android/settings/password/ChooseLockPassword.java @@ -260,7 +260,6 @@ public class ChooseLockPassword extends SettingsActivity { private LockscreenCredential mFirstPassword; private RecyclerView mPasswordRestrictionView; protected boolean mIsAlphaMode; - protected boolean mIsManagedProfile; protected FooterButton mSkipOrClearButton; private FooterButton mNextButton; private TextView mMessage; @@ -272,6 +271,14 @@ public class ChooseLockPassword extends SettingsActivity { private static final int CONFIRM_EXISTING_REQUEST = 58; static final int RESULT_FINISHED = RESULT_FIRST_USER; + /** Used to store the profile type for which pin/password is being set */ + protected enum ProfileType { + None, + Managed, + Private, + Other + }; + protected ProfileType mProfileType; /** * Keep track internally of where the user is in choosing a pattern. @@ -285,12 +292,14 @@ public class ChooseLockPassword extends SettingsActivity { R.string.lockpassword_choose_your_password_header_for_fingerprint, R.string.lockpassword_choose_your_password_header_for_face, R.string.lockpassword_choose_your_password_header_for_biometrics, + R.string.private_space_choose_your_password_header, // private space password R.string.lockpassword_choose_your_pin_header, // pin SET_WORK_PROFILE_PIN_HEADER, R.string.lockpassword_choose_your_profile_pin_header, R.string.lockpassword_choose_your_pin_header_for_fingerprint, R.string.lockpassword_choose_your_pin_header_for_face, R.string.lockpassword_choose_your_pin_header_for_biometrics, + R.string.private_space_choose_your_pin_header, // private space pin R.string.lock_settings_picker_biometrics_added_security_message, R.string.lock_settings_picker_biometrics_added_security_message, R.string.next_label), @@ -302,12 +311,14 @@ public class ChooseLockPassword extends SettingsActivity { R.string.lockpassword_confirm_your_password_header, R.string.lockpassword_confirm_your_password_header, R.string.lockpassword_confirm_your_password_header, + R.string.lockpassword_confirm_your_password_header, R.string.lockpassword_confirm_your_pin_header, REENTER_WORK_PROFILE_PIN_HEADER, R.string.lockpassword_reenter_your_profile_pin_header, R.string.lockpassword_confirm_your_pin_header, R.string.lockpassword_confirm_your_pin_header, R.string.lockpassword_confirm_your_pin_header, + R.string.lockpassword_confirm_your_pin_header, 0, 0, R.string.lockpassword_confirm_label), @@ -319,12 +330,14 @@ public class ChooseLockPassword extends SettingsActivity { R.string.lockpassword_confirm_passwords_dont_match, R.string.lockpassword_confirm_passwords_dont_match, R.string.lockpassword_confirm_passwords_dont_match, + R.string.lockpassword_confirm_passwords_dont_match, R.string.lockpassword_confirm_pins_dont_match, UNDEFINED, R.string.lockpassword_confirm_pins_dont_match, R.string.lockpassword_confirm_pins_dont_match, R.string.lockpassword_confirm_pins_dont_match, R.string.lockpassword_confirm_pins_dont_match, + R.string.lockpassword_confirm_pins_dont_match, 0, 0, R.string.lockpassword_confirm_label); @@ -335,29 +348,33 @@ public class ChooseLockPassword extends SettingsActivity { int hintInAlphaForFingerprint, int hintInAlphaForFace, int hintInAlphaForBiometrics, + int hintInAlphaForPrivateProfile, int hintInNumeric, String hintOverrideInNumericForProfile, int hintInNumericForProfile, int hintInNumericForFingerprint, int hintInNumericForFace, int hintInNumericForBiometrics, + int hintInNumericForPrivateProfile, int messageInAlphaForBiometrics, int messageInNumericForBiometrics, int nextButtonText) { this.alphaHint = hintInAlpha; this.alphaHintOverrideForProfile = hintOverrideInAlphaForProfile; - this.alphaHintForProfile = hintInAlphaForProfile; + this.alphaHintForManagedProfile = hintInAlphaForProfile; this.alphaHintForFingerprint = hintInAlphaForFingerprint; this.alphaHintForFace = hintInAlphaForFace; this.alphaHintForBiometrics = hintInAlphaForBiometrics; + this.alphaHintForPrivateProfile = hintInAlphaForPrivateProfile; this.numericHint = hintInNumeric; this.numericHintOverrideForProfile = hintOverrideInNumericForProfile; - this.numericHintForProfile = hintInNumericForProfile; + this.numericHintForManagedProfile = hintInNumericForProfile; this.numericHintForFingerprint = hintInNumericForFingerprint; this.numericHintForFace = hintInNumericForFace; this.numericHintForBiometrics = hintInNumericForBiometrics; + this.numericHintForPrivateProfile = hintInNumericForPrivateProfile; this.alphaMessageForBiometrics = messageInAlphaForBiometrics; this.numericMessageForBiometrics = messageInNumericForBiometrics; @@ -372,16 +389,18 @@ public class ChooseLockPassword extends SettingsActivity { // Password header public final int alphaHint; + public final int alphaHintForPrivateProfile; public final String alphaHintOverrideForProfile; - public final int alphaHintForProfile; + public final int alphaHintForManagedProfile; public final int alphaHintForFingerprint; public final int alphaHintForFace; public final int alphaHintForBiometrics; // PIN header public final int numericHint; + public final int numericHintForPrivateProfile; public final String numericHintOverrideForProfile; - public final int numericHintForProfile; + public final int numericHintForManagedProfile; public final int numericHintForFingerprint; public final int numericHintForFace; public final int numericHintForBiometrics; @@ -394,34 +413,40 @@ public class ChooseLockPassword extends SettingsActivity { public final int buttonText; - public String getHint(Context context, boolean isAlpha, int type, boolean isProfile) { + public String getHint(Context context, boolean isAlpha, int type, ProfileType profile) { if (isAlpha) { - if (type == TYPE_FINGERPRINT) { + if (android.os.Flags.allowPrivateProfile() + && profile.equals(ProfileType.Private)) { + return context.getString(alphaHintForPrivateProfile); + } else if (type == TYPE_FINGERPRINT) { return context.getString(alphaHintForFingerprint); } else if (type == TYPE_FACE) { return context.getString(alphaHintForFace); } else if (type == TYPE_BIOMETRIC) { return context.getString(alphaHintForBiometrics); - } else if (isProfile) { + } else if (profile.equals(ProfileType.Managed)) { return context.getSystemService(DevicePolicyManager.class).getResources() .getString(alphaHintOverrideForProfile, - () -> context.getString(alphaHintForProfile)); + () -> context.getString(alphaHintForManagedProfile)); } else { return context.getString(alphaHint); } } else { - if (type == TYPE_FINGERPRINT) { + if (android.os.Flags.allowPrivateProfile() + && profile.equals(ProfileType.Private)) { + return context.getString(numericHintForPrivateProfile); + } else if (type == TYPE_FINGERPRINT) { return context.getString(numericHintForFingerprint); } else if (type == TYPE_FACE) { return context.getString(numericHintForFace); } else if (type == TYPE_BIOMETRIC) { return context.getString(numericHintForBiometrics); - } else if (isProfile) { + } else if (profile.equals(ProfileType.Managed)) { return context.getSystemService(DevicePolicyManager.class).getResources() .getString(numericHintOverrideForProfile, - () -> context.getString(numericHintForProfile)); + () -> context.getString(numericHintForManagedProfile)); } else { - return context.getString(numericHint); + return context.getString(numericHint); } } } @@ -455,7 +480,7 @@ public class ChooseLockPassword extends SettingsActivity { } // Only take this argument into account if it belongs to the current profile. mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras()); - mIsManagedProfile = UserManager.get(getActivity()).isManagedProfile(mUserId); + mProfileType = getProfileType(); mForFingerprint = intent.getBooleanExtra( ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false); mForFace = intent.getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, false); @@ -602,7 +627,7 @@ public class ChooseLockPassword extends SettingsActivity { if (activity instanceof SettingsActivity) { final SettingsActivity sa = (SettingsActivity) activity; String title = Stage.Introduction.getHint( - getContext(), mIsAlphaMode, getStageType(), mIsManagedProfile); + getContext(), mIsAlphaMode, getStageType(), mProfileType); sa.setTitle(title); mLayout.setHeaderText(title); } @@ -938,7 +963,7 @@ public class ChooseLockPassword extends SettingsActivity { // Hide password requirement view when we are just asking user to confirm the pw. mPasswordRestrictionView.setVisibility(View.GONE); setHeaderText(mUiStage.getHint(getContext(), mIsAlphaMode, getStageType(), - mIsManagedProfile)); + mProfileType)); setNextEnabled(canInput && length >= LockPatternUtils.MIN_LOCK_PASSWORD_SIZE); mSkipOrClearButton.setVisibility(toVisibility(canInput && length > 0)); @@ -1110,5 +1135,18 @@ public class ChooseLockPassword extends SettingsActivity { } } } + + private ProfileType getProfileType() { + UserManager userManager = getContext().createContextAsUser(UserHandle.of(mUserId), + /*flags=*/0).getSystemService(UserManager.class); + if (userManager.isManagedProfile()) { + return ProfileType.Managed; + } else if (android.os.Flags.allowPrivateProfile() && userManager.isPrivateProfile()) { + return ProfileType.Private; + } else if (userManager.isProfile()) { + return ProfileType.Other; + } + return ProfileType.None; + } } } diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java index 20d1e7d8cd1..e8595af8eb6 100644 --- a/src/com/android/settings/password/ChooseLockPattern.java +++ b/src/com/android/settings/password/ChooseLockPattern.java @@ -478,6 +478,8 @@ public class ChooseLockPattern extends SettingsActivity { .getString(SET_WORK_PROFILE_PATTERN_HEADER, () -> getString( R.string.lockpassword_choose_your_profile_pattern_header)); + } else if (android.os.Flags.allowPrivateProfile() && isPrivateProfile()) { + msg = getString(R.string.private_space_choose_your_pattern_header); } else { msg = getString(R.string.lockpassword_choose_your_pattern_header); } @@ -873,5 +875,11 @@ public class ChooseLockPattern extends SettingsActivity { } getActivity().finish(); } + + private boolean isPrivateProfile() { + UserManager userManager = getContext().createContextAsUser(UserHandle.of(mUserId), + /*flags=*/0).getSystemService(UserManager.class); + return userManager.isPrivateProfile(); + } } } diff --git a/src/com/android/settings/privatespace/onelock/PrivateSpaceLockController.java b/src/com/android/settings/privatespace/onelock/PrivateSpaceLockController.java index 20298a1c003..efbe9f9200d 100644 --- a/src/com/android/settings/privatespace/onelock/PrivateSpaceLockController.java +++ b/src/com/android/settings/privatespace/onelock/PrivateSpaceLockController.java @@ -20,6 +20,7 @@ import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PASSW import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN; import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PIN; import static com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment.HIDE_INSECURE_OPTIONS; +import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CHOOSE_LOCK_SCREEN_TITLE; import android.content.Context; import android.content.Intent; @@ -94,6 +95,7 @@ public class PrivateSpaceLockController extends AbstractPreferenceController { final Bundle extras = new Bundle(); extras.putInt(Intent.EXTRA_USER_ID, mProfileUserId); extras.putBoolean(HIDE_INSECURE_OPTIONS, true); + extras.putInt(EXTRA_KEY_CHOOSE_LOCK_SCREEN_TITLE, R.string.private_space_lock_setup_title); new SubSettingLauncher(mContext) .setDestination(ChooseLockGeneric.ChooseLockGenericFragment.class.getName()) .setSourceMetricsCategory(mHost.getMetricsCategory()) From 363535192ddddadf5036936058ab523e4f037ad2 Mon Sep 17 00:00:00 2001 From: Rafael Higuera Silva Date: Wed, 13 Mar 2024 23:18:47 +0000 Subject: [PATCH 3/3] Add new warning dialogue when user is Resetting mobile network settings. If the user is reseting mobile network settings and have all these conditions: - No Wi-fi - Has check to delete all eSIMs - Has a least one RAC sim carrier Then show the warning dialogue. Test: make, manually test, atest SubSettingLauncherTest, atest ResetNetworkTest, atest SubscriptionUtilTest Bug: 328649510 Merged-In: I47d9b868b649b259d5e4008ec742317d2cb7cf51 Change-Id: I47d9b868b649b259d5e4008ec742317d2cb7cf51 (cherry picked from commit 147cc19b532fd52f918afd644140327d3d3d8904) --- src/com/android/settings/ResetNetwork.java | 26 +++++++++---- .../settings/core/SubSettingLauncher.java | 36 ++++++++++++++++- .../network/EraseEuiccDataController.java | 3 +- .../settings/network/SubscriptionUtil.java | 19 +++++++++ .../EuiccRacConnectivityDialogActivity.java | 37 ++++++++++++++++-- .../android/settings/ResetNetworkTest.java | 19 +++++++++ .../settings/core/SubSettingLauncherTest.java | 39 ++++++++++++++++++- .../network/SubscriptionUtilTest.java | 33 ++++++++++++++++ 8 files changed, 195 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java index c33a4f826a0..05c85986d83 100644 --- a/src/com/android/settings/ResetNetwork.java +++ b/src/com/android/settings/ResetNetwork.java @@ -49,6 +49,7 @@ import com.android.settings.core.InstrumentedFragment; import com.android.settings.core.SubSettingLauncher; import com.android.settings.network.ResetNetworkRestrictionViewBuilder; import com.android.settings.network.SubscriptionUtil; +import com.android.settings.network.telephony.EuiccRacConnectivityDialogActivity; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ConfirmLockPattern; import com.android.settingslib.development.DevelopmentSettingsEnabler; @@ -121,6 +122,8 @@ public class ResetNetwork extends InstrumentedFragment { @VisibleForTesting void showFinalConfirmation() { Bundle args = new Bundle(); + Context context = getContext(); + boolean resetSims = false; // TODO(b/317276437) Simplify the logic once flag is released int resetOptions = ResetNetworkRequest.RESET_CONNECTIVITY_MANAGER @@ -142,18 +145,25 @@ public class ResetNetwork extends InstrumentedFragment { } } if (mEsimContainer.getVisibility() == View.VISIBLE && mEsimCheckbox.isChecked()) { - request.setResetEsim(getContext().getPackageName()) - .writeIntoBundle(args); + resetSims = true; + request.setResetEsim(context.getPackageName()).writeIntoBundle(args); } else { request.writeIntoBundle(args); } - new SubSettingLauncher(getContext()) - .setDestination(ResetNetworkConfirm.class.getName()) - .setArguments(args) - .setTitleRes(R.string.reset_mobile_network_settings_confirm_title) - .setSourceMetricsCategory(getMetricsCategory()) - .launch(); + SubSettingLauncher launcher = + new SubSettingLauncher(context) + .setDestination(ResetNetworkConfirm.class.getName()) + .setArguments(args) + .setTitleRes(R.string.reset_mobile_network_settings_confirm_title) + .setSourceMetricsCategory(getMetricsCategory()); + + if (resetSims && SubscriptionUtil.shouldShowRacDialog(context)) { + context.startActivity( + EuiccRacConnectivityDialogActivity.getIntent(context, launcher.toIntent())); + } else { + launcher.launch(); + } } /** diff --git a/src/com/android/settings/core/SubSettingLauncher.java b/src/com/android/settings/core/SubSettingLauncher.java index e8c42197607..2f1f7d298e6 100644 --- a/src/com/android/settings/core/SubSettingLauncher.java +++ b/src/com/android/settings/core/SubSettingLauncher.java @@ -17,12 +17,14 @@ package com.android.settings.core; import android.annotation.StringRes; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.UserHandle; import android.text.TextUtils; +import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; @@ -129,14 +131,22 @@ public class SubSettingLauncher { } public void launch() { + launchWithIntent(toIntent()); + } + + /** + * Launch sub settings activity with an intent. + * + * @param intent the settings intent we want to launch + */ + public void launchWithIntent(@NonNull Intent intent) { + verifyIntent(intent); if (mLaunched) { throw new IllegalStateException( "This launcher has already been executed. Do not reuse"); } mLaunched = true; - final Intent intent = toIntent(); - boolean launchAsUser = mLaunchRequest.mUserHandle != null && mLaunchRequest.mUserHandle.getIdentifier() != UserHandle.myUserId(); boolean launchForResult = mLaunchRequest.mResultListener != null; @@ -152,6 +162,28 @@ public class SubSettingLauncher { } } + /** + * Verify intent is correctly constructed. + * + * @param intent the intent to verify + */ + @VisibleForTesting + public void verifyIntent(@NonNull Intent intent) { + String className = SubSettings.class.getName(); + ComponentName componentName = intent.getComponent(); + String destinationName = intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT); + int sourceMetricsCategory = + intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, -1); + + if (componentName != null && !TextUtils.equals(className, componentName.getClassName())) { + throw new IllegalArgumentException(String.format("Class must be: %s", className)); + } else if (TextUtils.isEmpty(destinationName)) { + throw new IllegalArgumentException("Destination fragment must be set"); + } else if (sourceMetricsCategory < 0) { + throw new IllegalArgumentException("Source metrics category must be set"); + } + } + public Intent toIntent() { final Intent intent = new Intent(Intent.ACTION_MAIN); copyExtras(intent); diff --git a/src/com/android/settings/network/EraseEuiccDataController.java b/src/com/android/settings/network/EraseEuiccDataController.java index 782ab7d8158..4e89da0a292 100644 --- a/src/com/android/settings/network/EraseEuiccDataController.java +++ b/src/com/android/settings/network/EraseEuiccDataController.java @@ -50,8 +50,7 @@ public class EraseEuiccDataController extends BasePreferenceController { if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) { return false; } - if (SubscriptionUtil.hasSubscriptionWithRacCarrier(mContext) - && !SubscriptionUtil.isConnectedToWifi(mContext)) { + if (SubscriptionUtil.shouldShowRacDialog(mContext)) { EuiccRacConnectivityDialogFragment.show(mHostFragment); } else { EraseEuiccDataDialogFragment.show(mHostFragment); diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java index fbe6c1f649e..3632ca323c9 100644 --- a/src/com/android/settings/network/SubscriptionUtil.java +++ b/src/com/android/settings/network/SubscriptionUtil.java @@ -80,6 +80,7 @@ public class SubscriptionUtil { private static List sAvailableResultsForTesting; private static List sActiveResultsForTesting; + @Nullable private static Boolean sEnableRacDialogForTesting; @VisibleForTesting public static void setAvailableSubscriptionsForTesting(List results) { @@ -91,6 +92,11 @@ public class SubscriptionUtil { sActiveResultsForTesting = results; } + @VisibleForTesting + public static void setEnableRacDialogForTesting(boolean enableRacDialog) { + sEnableRacDialogForTesting = enableRacDialog; + } + public static List getActiveSubscriptions(SubscriptionManager manager) { //TODO (b/315499317) : Refactor the subscription utils. @@ -908,6 +914,19 @@ public class SubscriptionUtil { return Arrays.stream(carriersThatUseRAC).anyMatch(cid -> cid == carrierId); } + /** + * Check if warning dialog should be presented when erasing all eSIMS. + * + * @param context Context to check if any sim carrier use RAC and device Wi-Fi connection. + * @return {@code true} if dialog should be presented to the user. + */ + public static boolean shouldShowRacDialog(@NonNull Context context) { + if (sEnableRacDialogForTesting != null) { + return sEnableRacDialogForTesting; + } + return !isConnectedToWifi(context) && hasSubscriptionWithRacCarrier(context); + } + /** * Retrieves NetworkCapabilities for the active network. * diff --git a/src/com/android/settings/network/telephony/EuiccRacConnectivityDialogActivity.java b/src/com/android/settings/network/telephony/EuiccRacConnectivityDialogActivity.java index cb4ab18dc67..d439d4f6c27 100644 --- a/src/com/android/settings/network/telephony/EuiccRacConnectivityDialogActivity.java +++ b/src/com/android/settings/network/telephony/EuiccRacConnectivityDialogActivity.java @@ -23,21 +23,28 @@ import android.telephony.SubscriptionManager; import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; import com.android.settings.R; +import com.android.settings.core.SubSettingLauncher; /** This dialog activity advise the user to have connectivity if the eSIM uses a RAC. */ -public class EuiccRacConnectivityDialogActivity extends SubscriptionActionDialogActivity +public class EuiccRacConnectivityDialogActivity extends FragmentActivity implements WarningDialogFragment.OnConfirmListener { private static final String TAG = "EuiccRacConnectivityDialogActivity"; // Dialog tags private static final int DIALOG_TAG_ERASE_ANYWAY_CONFIRMATION = 1; + private static final String ARG_SUB_ID = "sub_id"; + private static final String ARG_RESET_MOBILE_NETWORK_ID = "reset_mobile_netword_id"; private int mSubId; + @Nullable + private Intent mResetMobileNetworkIntent; /** - * Returns an intent of EuiccRacConnectivityDialogActivity. + * Returns an intent of EuiccRacConnectivityDialogActivity for Settings: erase eSIM. * * @param context The context used to start the EuiccRacConnectivityDialogActivity. * @param subId The subscription ID of the subscription needs to be deleted. If the subscription @@ -50,12 +57,29 @@ public class EuiccRacConnectivityDialogActivity extends SubscriptionActionDialog return intent; } + /** + * Returns an intent of EuiccRacConnectivityDialogActivity for Reset: Mobile network settings. + * + * @param context The context used to start the EuiccRacConnectivityDialogActivity. + * @param resetMobileNetworkIntent The intent that will continue the reset of mobile network + * settings. + */ + @NonNull + public static Intent getIntent(@NonNull Context context, + @NonNull Intent resetMobileNetworkIntent) { + Intent intent = new Intent(context, EuiccRacConnectivityDialogActivity.class); + intent.putExtra(ARG_RESET_MOBILE_NETWORK_ID, resetMobileNetworkIntent); + return intent; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); mSubId = intent.getIntExtra(ARG_SUB_ID, SubscriptionManager.INVALID_SUBSCRIPTION_ID); + mResetMobileNetworkIntent = + intent.getParcelableExtra(ARG_RESET_MOBILE_NETWORK_ID, Intent.class); if (savedInstanceState == null) { showConnectivityWarningDialog(); @@ -72,8 +96,13 @@ public class EuiccRacConnectivityDialogActivity extends SubscriptionActionDialog switch (tag) { case DIALOG_TAG_ERASE_ANYWAY_CONFIRMATION: finish(); - Log.i(TAG, "Show dialogue activity that handles deleting eSIM profiles"); - startActivity(DeleteEuiccSubscriptionDialogActivity.getIntent(this, mSubId)); + if (mResetMobileNetworkIntent != null) { + Log.i(TAG, "Show fragment activity that handles mobile network settings reset"); + new SubSettingLauncher(this).launchWithIntent(mResetMobileNetworkIntent); + } else { + Log.i(TAG, "Show dialogue activity that handles deleting eSIM profiles"); + startActivity(DeleteEuiccSubscriptionDialogActivity.getIntent(this, mSubId)); + } break; default: Log.e(TAG, "Unrecognized confirmation dialog tag: " + tag); diff --git a/tests/robotests/src/com/android/settings/ResetNetworkTest.java b/tests/robotests/src/com/android/settings/ResetNetworkTest.java index 0c2c7e8a5f7..db724c49ed8 100644 --- a/tests/robotests/src/com/android/settings/ResetNetworkTest.java +++ b/tests/robotests/src/com/android/settings/ResetNetworkTest.java @@ -27,6 +27,9 @@ import android.content.Intent; import android.view.View; import android.widget.CheckBox; +import com.android.settings.network.SubscriptionUtil; +import com.android.settings.network.telephony.EuiccRacConnectivityDialogActivity; + import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -51,6 +54,7 @@ public class ResetNetworkTest { @Test @Ignore public void showFinalConfirmation_checkboxVisible_eraseEsimChecked() { + SubscriptionUtil.setEnableRacDialogForTesting(true); mResetNetwork.mEsimContainer.setVisibility(View.VISIBLE); mResetNetwork.mEsimCheckbox.setChecked(true); @@ -61,6 +65,21 @@ public class ResetNetworkTest { .isNotNull(); } + @Test + public void showFinalConfirmation_checkboxVisible_eraseEsimChecked_showRacWarningDialog() { + SubscriptionUtil.setEnableRacDialogForTesting(true); + mResetNetwork.mEsimContainer.setVisibility(View.VISIBLE); + mResetNetwork.mEsimCheckbox.setChecked(true); + + mResetNetwork.showFinalConfirmation(); + + Intent intent = shadowOf(mActivity).getNextStartedActivity(); + + assertThat(intent).isNotNull(); + assertThat(intent.getComponent().getClassName()).isEqualTo( + EuiccRacConnectivityDialogActivity.class.getName()); + } + @Test public void showFinalConfirmation_checkboxVisible_eraseEsimUnchecked() { mResetNetwork.mEsimContainer.setVisibility(View.VISIBLE); diff --git a/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java index bfc8ea62ad4..e7051d26fc3 100644 --- a/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java +++ b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java @@ -67,7 +67,7 @@ public class SubSettingLauncherTest { } @Test(expected = IllegalStateException.class) - public void cannotReuseLauncher() { + public void cannotReuseLauncher_launchMethod() { final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext)) .setDestination(SubSettingLauncherTest.class.getName()) .setSourceMetricsCategory(123); @@ -76,6 +76,43 @@ public class SubSettingLauncherTest { launcher.launch(); } + @Test(expected = IllegalArgumentException.class) + public void verifyIntent_noDestination() { + final SubSettingLauncher launcher = + spy(new SubSettingLauncher(mContext)) + .setSourceMetricsCategory(123); + doNothing().when(launcher).launch(any(Intent.class)); + launcher.launchWithIntent(launcher.toIntent()); + } + + @Test(expected = IllegalArgumentException.class) + public void verifyIntent_noMetricsCategory() { + final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext)) + .setDestination(SubSettingLauncherTest.class.getName()); + doNothing().when(launcher).launch(any(Intent.class)); + launcher.launchWithIntent(launcher.toIntent()); + } + + @Test(expected = IllegalArgumentException.class) + public void verifyIntent_notTheCorrectClass() { + final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext)) + .setDestination(SubSettingLauncherTest.class.getName()) + .setSourceMetricsCategory(123); + doNothing().when(launcher).launch(any(Intent.class)); + launcher.launchWithIntent(new Intent(Intent.ACTION_MAIN)); + } + + @Test(expected = IllegalStateException.class) + public void cannotReuseLauncher_launchAndLaunchWithIntentMethod() { + final SubSettingLauncher launcher = + spy(new SubSettingLauncher(mContext)) + .setDestination(SubSettingLauncherTest.class.getName()) + .setSourceMetricsCategory(123); + doNothing().when(launcher).launch(any(Intent.class)); + launcher.launchWithIntent(launcher.toIntent()); + launcher.launch(); + } + @Test(expected = IllegalArgumentException.class) public void launch_noSourceMetricsCategory_shouldCrash() { final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext)) diff --git a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java index 6c946e55c1d..6df281a5db2 100644 --- a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java +++ b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java @@ -649,6 +649,39 @@ public class SubscriptionUtilTest { assertFalse(SubscriptionUtil.isConnectedToWifi(mContext)); } + @Test + public void hasSubscriptionWithRacCarrier_hasNoWifi_showRacDialog_returnTrue() { + when(mResources.getIntArray(anyInt())).thenReturn(CARRIERS_THAT_USE_RAC); + final SubscriptionInfo info = mock(SubscriptionInfo.class); + when(info.getCarrierId()).thenReturn(RAC_CARRIER_ID); + when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info)); + addNetworkTransportType(NetworkCapabilities.TRANSPORT_BLUETOOTH); + + assertTrue(SubscriptionUtil.shouldShowRacDialog(mContext)); + } + + @Test + public void hasSubscriptionWithRacCarrier_hasWifi_showRacDialog_returnFalse() { + when(mResources.getIntArray(anyInt())).thenReturn(CARRIERS_THAT_USE_RAC); + final SubscriptionInfo info = mock(SubscriptionInfo.class); + when(info.getCarrierId()).thenReturn(RAC_CARRIER_ID); + when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info)); + addNetworkTransportType(NetworkCapabilities.TRANSPORT_WIFI); + + assertFalse(SubscriptionUtil.shouldShowRacDialog(mContext)); + } + + @Test + public void hasNoSubscriptionWithRacCarrier_hasNoWifi_showRacDialog_returnFalse() { + when(mResources.getIntArray(anyInt())).thenReturn(CARRIERS_THAT_USE_RAC); + final SubscriptionInfo info = mock(SubscriptionInfo.class); + when(info.getCarrierId()).thenReturn(NO_RAC_CARRIER_ID); + when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info)); + addNetworkTransportType(NetworkCapabilities.TRANSPORT_WIFI); + + assertFalse(SubscriptionUtil.shouldShowRacDialog(mContext)); + } + private void addNetworkTransportType(int networkType) { mNetworkCapabilities = new NetworkCapabilities.Builder().addTransportType(networkType).build();