Adding alarms and reminders activity

Adding a settings screen to control the permission SCHEDULE_EXACT_ALARM.
Apps can start this by starting a newly introduced API intent
REQUEST_SCHEDULE_EXACT_ALARM.

Test: make -j RunSettingsRoboTests
Manually by UI inspection:
Settings -> Apps -> Special App access -> Alarms and Reminders
or by running:
adb shell am start -a android.settings.REQUEST_SCHEDULE_EXACT_ALARM

Bug: 171306433
Bug: 171305516
Change-Id: I1293d38fc50a22b2af46f80ab24f676ed632f964
This commit is contained in:
Suprabh Shukla
2021-02-17 18:00:35 -08:00
parent beefb25b48
commit c8b9240535
14 changed files with 534 additions and 3 deletions

View File

@@ -25,10 +25,13 @@ import android.app.AppOpsManager;
import android.content.Context;
import android.content.pm.IPackageManager;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import com.android.settingslib.applications.ApplicationsState.AppEntry;
import com.google.common.truth.Truth;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -60,6 +63,58 @@ public final class AppStateAppOpsBridgeTest {
// should not crash
}
@Test
public void permissionState_modeDefault_IsPermissible() {
AppStateAppOpsBridge.PermissionState permissionState =
new AppStateAppOpsBridge.PermissionState("pkg1", UserHandle.of(123));
permissionState.appOpMode = AppOpsManager.MODE_DEFAULT;
permissionState.staticPermissionGranted = true;
Truth.assertThat(permissionState.isPermissible()).isTrue();
permissionState.staticPermissionGranted = false;
Truth.assertThat(permissionState.isPermissible()).isFalse();
}
@Test
public void permissionState_modeErrored_IsPermissible() {
AppStateAppOpsBridge.PermissionState permissionState =
new AppStateAppOpsBridge.PermissionState("pkg1", UserHandle.of(123));
permissionState.appOpMode = AppOpsManager.MODE_ERRORED;
permissionState.staticPermissionGranted = true;
Truth.assertThat(permissionState.isPermissible()).isFalse();
permissionState.staticPermissionGranted = false;
Truth.assertThat(permissionState.isPermissible()).isFalse();
}
@Test
public void permissionState_modeAllowed_IsPermissible() {
AppStateAppOpsBridge.PermissionState permissionState =
new AppStateAppOpsBridge.PermissionState("pkg1", UserHandle.of(123));
permissionState.appOpMode = AppOpsManager.MODE_ALLOWED;
permissionState.staticPermissionGranted = true;
Truth.assertThat(permissionState.isPermissible()).isTrue();
permissionState.staticPermissionGranted = false;
Truth.assertThat(permissionState.isPermissible()).isTrue();
}
@Test
public void permissionState_modeIgnored_IsPermissible() {
AppStateAppOpsBridge.PermissionState permissionState =
new AppStateAppOpsBridge.PermissionState("pkg1", UserHandle.of(123));
permissionState.appOpMode = AppOpsManager.MODE_IGNORED;
permissionState.staticPermissionGranted = true;
Truth.assertThat(permissionState.isPermissible()).isFalse();
permissionState.staticPermissionGranted = false;
Truth.assertThat(permissionState.isPermissible()).isFalse();
}
private class TestAppStateAppOpsBridge extends AppStateAppOpsBridge {
private TestAppStateAppOpsBridge() {
super(mContext, null, null, AppOpsManager.OP_SYSTEM_ALERT_WINDOW,

View File

@@ -0,0 +1,125 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.applications.appinfo;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import com.android.settings.applications.AppStateAlarmsAndRemindersBridge;
import com.android.settings.applications.AppStateAppOpsBridge;
import com.android.settingslib.RestrictedSwitchPreference;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
public class AlarmsAndRemindersDetailsTest {
@Mock
private RestrictedSwitchPreference mSwitchPref;
@Mock
private PackageInfo mPackageInfo;
@Mock
private AppStateAlarmsAndRemindersBridge mAppStateBridge;
@Mock
private AppStateAppOpsBridge.PermissionState mPermissionState;
private AlarmsAndRemindersDetails mFragment = new AlarmsAndRemindersDetails();
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
ReflectionHelpers.setField(mFragment, "mSwitchPref", mSwitchPref);
ReflectionHelpers.setField(mFragment, "mAppBridge", mAppStateBridge);
}
@Test
public void refreshUi_noPackageInfo_shouldReturnFalseAndNoCrash() {
mFragment.refreshUi();
assertThat(mFragment.refreshUi()).isFalse();
// should not crash
}
@Test
public void refreshUi_noApplicationInfo_shouldReturnFalseAndNoCrash() {
ReflectionHelpers.setField(mFragment, "mPackageInfo", mPackageInfo);
mFragment.refreshUi();
assertThat(mFragment.refreshUi()).isFalse();
// should not crash
}
@Test
public void refreshUi_hasApplicationInfo_shouldReturnTrue() {
ReflectionHelpers.setField(mFragment, "mPackageInfo", mPackageInfo);
mPackageInfo.applicationInfo = new ApplicationInfo();
when(mAppStateBridge.createPermissionState(nullable(String.class), anyInt()))
.thenReturn(mPermissionState);
mFragment.refreshUi();
assertThat(mFragment.refreshUi()).isTrue();
}
@Test
public void refreshUi_switchPreferenceEnabled() {
ReflectionHelpers.setField(mFragment, "mPackageInfo", mPackageInfo);
mPackageInfo.applicationInfo = new ApplicationInfo();
when(mAppStateBridge.createPermissionState(nullable(String.class), anyInt()))
.thenReturn(mPermissionState);
mPermissionState.permissionDeclared = false;
mFragment.refreshUi();
verify(mSwitchPref).setEnabled(false);
mPermissionState.permissionDeclared = true;
mFragment.refreshUi();
verify(mSwitchPref).setEnabled(true);
}
@Test
public void refreshUi_switchPreferenceChecked() {
ReflectionHelpers.setField(mFragment, "mPackageInfo", mPackageInfo);
mPackageInfo.applicationInfo = new ApplicationInfo();
when(mAppStateBridge.createPermissionState(nullable(String.class), anyInt()))
.thenReturn(mPermissionState);
when(mPermissionState.isPermissible()).thenReturn(true);
mFragment.refreshUi();
verify(mSwitchPref).setChecked(true);
when(mPermissionState.isPermissible()).thenReturn(false);
mFragment.refreshUi();
verify(mSwitchPref).setChecked(false);
}
}