Merge "Use a temporary summary in the "Apps that can interrupt" preference" into main
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 81c8973..572851e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -9340,6 +9340,8 @@
             other {{app_1}, {app_2}, and # more can interrupt}
         }
     </string>
+    <!-- Text displayed (for a brief time) while the list of bypassing apps is being fetched. Will be replaced by a zen_mode_apps_subtext. [CHAR_LIMIT=60] -->
+    <string name="zen_mode_apps_calculating">Calculating\u2026</string>
 
     <!-- [CHAR LIMIT=100] Zen mode settings: Allow apps to bypass DND -->
     <string name="zen_mode_bypassing_apps">Allow apps to override</string>
diff --git a/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java b/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java
index f62dfdd..810b1b5 100644
--- a/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java
+++ b/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java
@@ -21,6 +21,7 @@
 
 import android.content.Context;
 import android.os.Bundle;
+import android.text.TextUtils;
 import android.util.ArraySet;
 
 import androidx.annotation.NonNull;
@@ -29,6 +30,7 @@
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 
+import com.android.settings.R;
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.notification.modes.ZenMode;
@@ -82,6 +84,9 @@
                 .toIntent());
         mZenMode = zenMode;
         mPreference = preference;
+        if (TextUtils.isEmpty(mPreference.getSummary())) {
+            mPreference.setSummary(R.string.zen_mode_apps_calculating);
+        }
         if (mApplicationsState != null && mHost != null) {
             mAppSession = mApplicationsState.newSession(mAppSessionCallbacks, mHost.getLifecycle());
         }
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java
index 83f8de0..f850b1e 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java
@@ -38,7 +38,6 @@
 import android.service.notification.ZenPolicy;
 
 import androidx.fragment.app.Fragment;
-import androidx.preference.Preference;
 
 import com.android.settings.SettingsActivity;
 import com.android.settingslib.applications.ApplicationsState;
@@ -51,7 +50,6 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
@@ -118,15 +116,12 @@
     @Test
     public void testUpdateSetsIntent() {
         // Creates the preference
-        SelectorWithWidgetPreference preference = mock(SelectorWithWidgetPreference.class);
+        SelectorWithWidgetPreference preference = new SelectorWithWidgetPreference(mContext);
         // Create a zen mode that allows priority channels to breakthrough.
         ZenMode zenMode = createPriorityChannelsZenMode();
 
-        // Capture the intent
-        ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
-        mController.updateState((Preference) preference, zenMode);
-        verify(preference).setIntent(captor.capture());
-        Intent launcherIntent = captor.getValue();
+        mController.updateState(preference, zenMode);
+        Intent launcherIntent = preference.getIntent();
 
         assertThat(launcherIntent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
                 .isEqualTo("com.android.settings.notification.modes.ZenModeAppsFragment");
@@ -154,13 +149,12 @@
     @Test
     public void testUpdateTriggersRebuild() {
         // Creates the preference
-        SelectorWithWidgetPreference preference = mock(SelectorWithWidgetPreference.class);
+        SelectorWithWidgetPreference preference = new SelectorWithWidgetPreference(mContext);
         // Create a zen mode that allows priority channels to breakthrough.
         ZenMode zenMode = createPriorityChannelsZenMode();
 
         // Create some applications.
-        ArrayList<ApplicationsState.AppEntry> appEntries =
-                new ArrayList<ApplicationsState.AppEntry>();
+        ArrayList<ApplicationsState.AppEntry> appEntries = new ArrayList<>();
         appEntries.add(createAppEntry("test", "pkgLabel"));
 
         when(mHelperBackend.getPackagesBypassingDnd(
@@ -168,18 +162,19 @@
                 .thenReturn(List.of("test"));
 
         // Updates the preference with the zen mode. We expect that this causes the app session
-        // to trigger a rebuild.
-        mController.updateZenMode((Preference) preference, zenMode);
+        // to trigger a rebuild (and display a temporary text in the meantime).
+        mController.updateZenMode(preference, zenMode);
         verify(mSession).rebuild(any(), any(), eq(false));
+        assertThat(String.valueOf(preference.getSummary())).isEqualTo("Calculating…");
 
         // Manually triggers the callback that will happen on rebuild.
         mController.mAppSessionCallbacks.onRebuildComplete(appEntries);
-        verify(preference).setSummary("pkgLabel can interrupt");
+        assertThat(String.valueOf(preference.getSummary())).isEqualTo("pkgLabel can interrupt");
     }
 
     @Test
     public void testOnPackageListChangedTriggersRebuild() {
-        SelectorWithWidgetPreference preference = mock(SelectorWithWidgetPreference.class);
+        SelectorWithWidgetPreference preference = new SelectorWithWidgetPreference(mContext);
         // Create a zen mode that allows priority channels to breakthrough.
         ZenMode zenMode = createPriorityChannelsZenMode();
         mController.updateState(preference, zenMode);
@@ -191,7 +186,7 @@
 
     @Test
     public void testOnLoadEntriesCompletedTriggersRebuild() {
-        SelectorWithWidgetPreference preference = mock(SelectorWithWidgetPreference.class);
+        SelectorWithWidgetPreference preference = new SelectorWithWidgetPreference(mContext);
         // Create a zen mode that allows priority channels to breakthrough.
         ZenMode zenMode = createPriorityChannelsZenMode();
         mController.updateState(preference, zenMode);