From 707014b3f950a5468b7f9b405d52ac124bd501b7 Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Wed, 7 Aug 2024 13:52:15 -0400 Subject: [PATCH] Fixes to interstitial activity transitions Return after finish() when mode data is invalid; start intent before finish() so the transition is animated like going forward. Bug: 332730534 Test: manual Flag: android.app.modes_ui Change-Id: I26522fdf468da7f2fdb8f75ac405d5f808f8828f --- .../modes/SetupInterstitialActivity.java | 5 ++- .../modes/SetupInterstitialActivityTest.java | 35 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/notification/modes/SetupInterstitialActivity.java b/src/com/android/settings/notification/modes/SetupInterstitialActivity.java index 028e15ba559..225ded0632b 100644 --- a/src/com/android/settings/notification/modes/SetupInterstitialActivity.java +++ b/src/com/android/settings/notification/modes/SetupInterstitialActivity.java @@ -115,18 +115,21 @@ public class SetupInterstitialActivity extends FragmentActivity { if (intent == null) { Log.w(TAG, "no intent found for modes interstitial"); finish(); + return; } String modeId = intent.getStringExtra(EXTRA_AUTOMATIC_ZEN_RULE_ID); if (modeId == null) { Log.w(TAG, "no mode id included in intent: " + intent); finish(); + return; } ZenMode mode = mBackend.getMode(modeId); if (mode == null) { Log.w(TAG, "mode not found for mode id: " + modeId); finish(); + return; } setTitle(mode.getName()); @@ -237,11 +240,11 @@ public class SetupInterstitialActivity extends FragmentActivity { // Don't come back to this activity after sending the user to the modes page, if // they happen to go back. Forward the activity result in case we got here (indirectly) // from some app that is waiting for the result. - finish(); if (updated) { ZenSubSettingLauncher.forMode(this, modeId) .addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT).launch(); } + finish(); }; } diff --git a/tests/robotests/src/com/android/settings/notification/modes/SetupInterstitialActivityTest.java b/tests/robotests/src/com/android/settings/notification/modes/SetupInterstitialActivityTest.java index e73610bd962..129e56e548c 100644 --- a/tests/robotests/src/com/android/settings/notification/modes/SetupInterstitialActivityTest.java +++ b/tests/robotests/src/com/android/settings/notification/modes/SetupInterstitialActivityTest.java @@ -81,6 +81,41 @@ public class SetupInterstitialActivityTest { when(mImage.getLayoutParams()).thenReturn(new ViewGroup.LayoutParams(0, 0)); } + @Test + public void invalidIntent_doesNotQueryBackend() { + // Mode is set up sensibly + ZenMode mode = new TestModeBuilder().setId(MODE_ID).setEnabled(false).build(); + when(mBackend.getMode(MODE_ID)).thenReturn(mode); + + // but the intent is lacking the zen mode extra + ActivityScenario scenario = + ActivityScenario.launch(new Intent(Intent.ACTION_MAIN) + .setClass(RuntimeEnvironment.getApplication(), + SetupInterstitialActivity.class)); + // creating the scenario takes it through onResume(), which would query the backend if + // it had mode data. + scenario.onActivity(activity -> { + assertThat(activity.isFinishing()).isTrue(); + verify(mBackend, never()).getMode(any()); + }); + scenario.close(); + } + + @Test + public void invalidModeId_doesNotCrash() { + when(mBackend.getMode(MODE_ID)).thenReturn(null); + ActivityScenario scenario = + ActivityScenario.launch(new Intent(Intent.ACTION_MAIN) + .setClass(RuntimeEnvironment.getApplication(), + SetupInterstitialActivity.class) + .putExtra(EXTRA_AUTOMATIC_ZEN_RULE_ID, MODE_ID)); + // do nothing, but it would crash if attempting to work with a null mode at any point + scenario.onActivity(activity -> { + assertThat(activity.isFinishing()).isTrue(); + }); + scenario.close(); + } + @Test public void enableButton_enablesModeAndRedirectsToModePage() { ZenMode mode = new TestModeBuilder().setId(MODE_ID).setEnabled(false).build();