Link to app-provided configuration intent for app-owned rules.

If there is no valid intent, the automatic trigger preference is disabled.

Flag: android.app.modes_ui
Bug: 341961712
Test: manual (for Bedtime & Driving modes), ZenModeSetTriggerLinkPreferenceControllerTest

Change-Id: I673792effb3cfdcaaa7cf85adfb55a93b44dcc86
This commit is contained in:
Yuri Lin
2024-06-11 18:36:50 -04:00
parent 978cba142a
commit 21539cd2be
8 changed files with 316 additions and 35 deletions

View File

@@ -18,6 +18,7 @@ package com.android.settings.notification.modes;
import android.app.AutomaticZenRule;
import android.app.NotificationManager;
import android.content.ComponentName;
import android.net.Uri;
import android.service.notification.Condition;
import android.service.notification.ZenDeviceEffects;
@@ -149,6 +150,18 @@ class TestModeBuilder {
return this;
}
TestModeBuilder setConfigurationActivity(ComponentName configActivity) {
mRule.setConfigurationActivity(configActivity);
mConfigZenRule.configurationActivity = configActivity;
return this;
}
TestModeBuilder setOwner(ComponentName owner) {
mRule.setOwner(owner);
mConfigZenRule.component = owner;
return this;
}
ZenMode build() {
return new ZenMode(mId, mRule, mConfigZenRule);
}

View File

@@ -19,8 +19,10 @@ package com.android.settings.notification.modes;
import static android.app.AutomaticZenRule.TYPE_OTHER;
import static android.app.AutomaticZenRule.TYPE_SCHEDULE_CALENDAR;
import static android.app.AutomaticZenRule.TYPE_SCHEDULE_TIME;
import static android.app.NotificationManager.EXTRA_AUTOMATIC_RULE_ID;
import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY;
import static android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
import static android.service.notification.ConditionProviderService.EXTRA_RULE_ID;
import static com.android.settings.notification.modes.ZenModeSetTriggerLinkPreferenceController.AUTOMATIC_TRIGGER_PREF_KEY;
@@ -31,10 +33,16 @@ import static org.mockito.Mockito.when;
import android.app.AutomaticZenRule;
import android.app.Flags;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.service.notification.ConditionProviderService;
import android.service.notification.SystemZenRules;
import android.service.notification.ZenModeConfig;
@@ -44,6 +52,7 @@ import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.utils.ZenServiceListing;
import com.android.settingslib.PrimarySwitchPreference;
import com.android.settingslib.notification.modes.ZenMode;
import com.android.settingslib.notification.modes.ZenModesBackend;
@@ -71,6 +80,11 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest {
private PrimarySwitchPreference mPreference;
@Mock
private ZenServiceListing mServiceListing;
@Mock
private PackageManager mPm;
@Mock
private PreferenceCategory mPrefCategory;
@Mock
@@ -84,8 +98,10 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest {
mContext = ApplicationProvider.getApplicationContext();
mPrefController = new ZenModeSetTriggerLinkPreferenceController(mContext,
"zen_automatic_trigger_category", mFragment, mBackend);
"zen_automatic_trigger_category", mFragment, mBackend, mPm);
mPrefController.setServiceListing(mServiceListing);
mPreference = new PrimarySwitchPreference(mContext);
when(mPrefCategory.findPreference(AUTOMATIC_TRIGGER_PREF_KEY)).thenReturn(mPreference);
}
@@ -93,9 +109,9 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest {
public void testIsAvailable() {
// should not be available for manual DND
ZenMode manualMode = ZenMode.manualDndMode(new AutomaticZenRule.Builder("Do Not Disturb",
Uri.parse("manual"))
.setInterruptionFilter(INTERRUPTION_FILTER_PRIORITY)
.build(), true);
Uri.parse("manual"))
.setInterruptionFilter(INTERRUPTION_FILTER_PRIORITY)
.build(), true);
mPrefController.updateZenMode(mPrefCategory, manualMode);
assertThat(mPrefController.isAvailable()).isFalse();
@@ -164,7 +180,7 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest {
@Test
public void testRuleLink_schedule() {
ZenModeConfig.ScheduleInfo scheduleInfo = new ZenModeConfig.ScheduleInfo();
scheduleInfo.days = new int[] { Calendar.MONDAY, Calendar.TUESDAY, Calendar.THURSDAY };
scheduleInfo.days = new int[]{Calendar.MONDAY, Calendar.TUESDAY, Calendar.THURSDAY};
scheduleInfo.startHour = 1;
scheduleInfo.endHour = 15;
ZenMode mode = new TestModeBuilder()
@@ -237,4 +253,109 @@ public class ZenModeSetTriggerLinkPreferenceControllerTest {
assertThat(updatedMode.getRule().getOwner()).isEqualTo(
ZenModeConfig.getScheduleConditionProvider());
}
@Test
public void testGetAppRuleIntent_configActivity() throws Exception {
ZenMode mode = new TestModeBuilder()
.setId("id")
.setPackage(mContext.getPackageName())
.setConfigurationActivity(new ComponentName(mContext.getPackageName(), "test"))
.setType(TYPE_OTHER)
.setTriggerDescription("some rule")
.build();
when(mPm.getPackageUid(null, 0)).thenReturn(-1);
when(mPm.getPackageUid(mContext.getPackageName(), 0)).thenReturn(1);
Intent res = mPrefController.getAppRuleIntent(mode);
assertThat(res).isNotNull();
assertThat(res.getStringExtra(EXTRA_RULE_ID)).isEqualTo("id");
assertThat(res.getStringExtra(EXTRA_AUTOMATIC_RULE_ID)).isEqualTo("id");
assertThat(res.getComponent()).isEqualTo(
new ComponentName(mContext.getPackageName(), "test"));
}
@Test
public void testGetAppRuleIntent_configActivity_wrongPackage() throws Exception {
ZenMode mode = new TestModeBuilder()
.setPackage(mContext.getPackageName())
.setConfigurationActivity(new ComponentName("another", "test"))
.setType(TYPE_OTHER)
.build();
when(mPm.getPackageUid(null, 0)).thenReturn(-1);
when(mPm.getPackageUid(mContext.getPackageName(), 0)).thenReturn(1);
Intent res = mPrefController.getAppRuleIntent(mode);
assertThat(res).isNull();
}
@Test
public void testGetAppRuleIntent_configActivity_unspecifiedOwner() throws Exception {
ZenMode mode = new TestModeBuilder()
.setId("id")
.setPackage(null)
.setConfigurationActivity(new ComponentName("another", "test"))
.setType(TYPE_OTHER)
.build();
when(mPm.getPackageUid(null, 0)).thenReturn(-1);
when(mPm.getPackageUid(mContext.getPackageName(), 0)).thenReturn(1);
Intent res = mPrefController.getAppRuleIntent(mode);
assertThat(res).isNotNull();
assertThat(res.getStringExtra(EXTRA_RULE_ID)).isEqualTo("id");
assertThat(res.getStringExtra(EXTRA_AUTOMATIC_RULE_ID)).isEqualTo("id");
assertThat(res.getComponent()).isEqualTo(new ComponentName("another", "test"));
}
@Test
public void testGetAppRuleIntent_cps() throws Exception {
ZenMode mode = new TestModeBuilder()
.setId("id")
.setPackage(mContext.getPackageName())
.setOwner(new ComponentName(mContext.getPackageName(), "service"))
.build();
ComponentInfo ci = new ComponentInfo();
ci.packageName = mContext.getPackageName();
ci.metaData = new Bundle();
ci.metaData.putString(ConditionProviderService.META_DATA_CONFIGURATION_ACTIVITY,
ComponentName.flattenToShortString(
new ComponentName(mContext.getPackageName(), "activity")));
when(mServiceListing.findService(new ComponentName(mContext.getPackageName(), "service")))
.thenReturn(ci);
when(mPm.getPackageUid(null, 0)).thenReturn(-1);
when(mPm.getPackageUid(mContext.getPackageName(), 0)).thenReturn(1);
Intent res = mPrefController.getAppRuleIntent(mode);
assertThat(res).isNotNull();
assertThat(res.getStringExtra(EXTRA_RULE_ID)).isEqualTo("id");
assertThat(res.getStringExtra(EXTRA_AUTOMATIC_RULE_ID)).isEqualTo("id");
assertThat(res.getComponent()).isEqualTo(
new ComponentName(mContext.getPackageName(), "activity"));
}
@Test
public void testGetAppRuleIntent_cps_wrongPackage() throws Exception {
ZenMode mode = new TestModeBuilder()
.setPackage("other")
.setOwner(new ComponentName(mContext.getPackageName(), "service"))
.setType(TYPE_OTHER)
.build();
ComponentInfo ci = new ComponentInfo();
ci.packageName = mContext.getPackageName();
ci.metaData = new Bundle();
ci.metaData.putString(ConditionProviderService.META_DATA_CONFIGURATION_ACTIVITY,
ComponentName.flattenToShortString(
new ComponentName(mContext.getPackageName(), "activity")));
when(mPm.getPackageUid(null, 0)).thenReturn(-1);
when(mPm.getPackageUid(mContext.getPackageName(), 0)).thenReturn(1);
Intent res = mPrefController.getAppRuleIntent(mode);
assertThat(res).isNull();
}
}