From ec376bcfcedb4fe390d073dc2575f135a84654ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Hern=C3=A1ndez?= Date: Fri, 5 Jul 2024 17:35:06 +0200 Subject: [PATCH] Use a temporary summary in the "Apps that can interrupt" preference We load the list of apps in a background thread, so getting that string later was causing the preference to increase in height, with an annoyingly noticeable animation. Having a placeholder test ensures this doesn't happen (and actually loading is pretty fast, so this text lkely won't even be visible). Fixes: 347744856 Test: atest ZenModeAppsLinkPreferenceControllerTest Flag: android.app.modes_ui Change-Id: I4f9f60104fb8b0abbc7c4279b87daafac481e98a --- res/values/strings.xml | 2 ++ .../ZenModeAppsLinkPreferenceController.java | 5 ++++ ...nModeAppsLinkPreferenceControllerTest.java | 27 ++++++++----------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 40b160a3915..d0d5be9d2ab 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -9341,6 +9341,8 @@ other {{app_1}, {app_2}, and # more can interrupt} } + + Calculating\u2026 Allow apps to override diff --git a/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java b/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java index f62dfdd601b..810b1b5efcb 100644 --- a/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java +++ b/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceController.java @@ -21,6 +21,7 @@ import static android.provider.Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID; 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.core.text.BidiFormatter; 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 @@ class ZenModeAppsLinkPreferenceController extends AbstractZenModePreferenceContr .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 83f8de0e70c..f850b1e5519 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.platform.test.flag.junit.SetFlagsRule; 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.Before; 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 @@ public final class ZenModeAppsLinkPreferenceControllerTest { @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 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 @@ public final class ZenModeAppsLinkPreferenceControllerTest { @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 appEntries = - new ArrayList(); + ArrayList appEntries = new ArrayList<>(); appEntries.add(createAppEntry("test", "pkgLabel")); when(mHelperBackend.getPackagesBypassingDnd( @@ -168,18 +162,19 @@ public final class ZenModeAppsLinkPreferenceControllerTest { .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 @@ public final class ZenModeAppsLinkPreferenceControllerTest { @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);