Update ZenModeAddBypassingApps to not binder call for every app

This update already happened for ZenModeAllBypassingApps to use the new single binder call to get all packages bypassing DND. This change uses that method for bypassing apps as well as collecting the set of all apps with a nonzero number of channels.

Bug: 368623163
Bug: 394614704
Test: ZenModeAddBypassingAppsPreferenceControllerTest, manual to confirm correct behavior
Flag: android.app.nm_binder_perf_get_apps_with_channels
Change-Id: I72a1edcb07d18f5707591a5341d7a7338c23f42b
This commit is contained in:
Yuri Lin
2025-02-10 13:25:00 -05:00
parent 883070758b
commit 1500f3ecc0
4 changed files with 97 additions and 15 deletions

View File

@@ -19,6 +19,7 @@ package com.android.settings.notification.modes;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -30,6 +31,8 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.ParceledListSlice;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.UsesFlags;
import android.platform.test.flag.junit.FlagsParameterization;
import android.platform.test.flag.junit.SetFlagsRule;
import androidx.fragment.app.Fragment;
@@ -46,36 +49,50 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.ParameterizedRobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
@RunWith(RobolectricTestRunner.class)
@RunWith(ParameterizedRobolectricTestRunner.class)
@UsesFlags(android.app.Flags.class)
@EnableFlags(Flags.FLAG_MODES_UI)
public class ZenModeAddBypassingAppsPreferenceControllerTest {
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Mock
private NotificationBackend mBackend;
@Mock
private ZenHelperBackend mHelperBackend;
@Mock
private PreferenceCategory mPreferenceCategory;
@Mock
private ApplicationsState mApplicationState;
private ZenModeAddBypassingAppsPreferenceController mController;
private Context mContext;
@ParameterizedRobolectricTestRunner.Parameters(name = "{0}")
public static List<FlagsParameterization> getParams() {
return FlagsParameterization.allCombinationsOf(
Flags.FLAG_NM_BINDER_PERF_GET_APPS_WITH_CHANNELS);
}
public ZenModeAddBypassingAppsPreferenceControllerTest(FlagsParameterization flags) {
mSetFlagsRule.setFlagsParameterization(flags);
}
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mController = new ZenModeAddBypassingAppsPreferenceController(
mContext, null, mock(Fragment.class), mBackend);
mContext, null, mock(Fragment.class), mBackend, mHelperBackend);
mController.mPreferenceCategory = mPreferenceCategory;
mController.mApplicationsState = mApplicationState;
mController.mPrefContext = mContext;
@@ -132,6 +149,12 @@ public class ZenModeAddBypassingAppsPreferenceControllerTest {
appWithChannelsNoneBypassing.info.uid))
.thenReturn(new ParceledListSlice<>(new ArrayList<>()));
// used when NM_BINDER_PERF_GET_APPS_WITH_CHANNELS flag is true
when(mBackend.getPackagesWithAnyChannels(anyInt())).thenReturn(
Set.of("appWithBypassingChannels", "appWithChannelsNoneBypassing"));
when(mHelperBackend.getPackagesBypassingDnd(anyInt())).thenReturn(
Map.of("appWithBypassingChannels", false));
List<ApplicationsState.AppEntry> appEntries = new ArrayList<>();
appEntries.add(appWithBypassingChannels);
appEntries.add(appWithoutChannels);