Loading res/xml/notification_access_permission_details.xml +1 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ android:layout="@layout/settings_entity_header" settings:controller="com.android.settings.applications.specialaccess.notificationaccess.HeaderPreferenceController"/> <com.android.settings.widget.FilterTouchesSwitchPreference <com.android.settingslib.RestrictedSwitchPreference android:key="notification_access_switch" android:title="@string/notification_access_detail_switch" settings:controller="com.android.settings.applications.specialaccess.notificationaccess.ApprovalPreferenceController"/> Loading src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java +6 −3 Original line number Diff line number Diff line Loading @@ -27,10 +27,10 @@ import android.os.AsyncTask; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.SwitchPreference; import com.android.settings.core.BasePreferenceController; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.RestrictedSwitchPreference; public class ApprovalPreferenceController extends BasePreferenceController { Loading Loading @@ -78,9 +78,11 @@ public class ApprovalPreferenceController extends BasePreferenceController { @Override public void updateState(Preference pref) { final SwitchPreference preference = (SwitchPreference) pref; final RestrictedSwitchPreference preference = (RestrictedSwitchPreference) pref; final CharSequence label = mPkgInfo.applicationInfo.loadLabel(mPm); preference.setChecked(isServiceEnabled(mCn)); final boolean isEnabled = isServiceEnabled(mCn); preference.setChecked(isEnabled); preference.setOnPreferenceChangeListener((p, newValue) -> { final boolean access = (Boolean) newValue; if (!access) { Loading @@ -103,6 +105,7 @@ public class ApprovalPreferenceController extends BasePreferenceController { return false; } }); preference.updateState(mCn.getPackageName(), mPkgInfo.applicationInfo.uid, isEnabled); } public void disable(final ComponentName cn) { Loading tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java +8 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.atLeast; Loading @@ -31,6 +33,7 @@ import static java.util.Collections.singletonList; import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.AccessibilityShortcutInfo; import android.app.AppOpsManager; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; Loading Loading @@ -110,6 +113,8 @@ public class AccessibilitySettingsTest { @Mock private PreferenceManager mPreferenceManager; private ShadowAccessibilityManager mShadowAccessibilityManager; @Mock private AppOpsManager mAppOpsManager; @Before public void setup() { Loading @@ -121,6 +126,9 @@ public class AccessibilitySettingsTest { when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager); when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext); mContext.setTheme(R.style.Theme_AppCompat); when(mContext.getSystemService(AppOpsManager.class)).thenReturn(mAppOpsManager); when(mAppOpsManager.noteOpNoThrow(eq(AppOpsManager.OP_ACCESS_RESTRICTED_SETTINGS), anyInt(), anyString())).thenReturn(AppOpsManager.MODE_ALLOWED); } @Test Loading tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java +39 −2 Original line number Diff line number Diff line Loading @@ -18,12 +18,15 @@ package com.android.settings.applications.specialaccess.notificationaccess; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; import android.app.NotificationManager; import android.content.ComponentName; import android.content.Context; Loading @@ -31,12 +34,12 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import androidx.preference.SwitchPreference; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.RestrictedSwitchPreference; import org.junit.Before; import org.junit.Test; Loading @@ -55,6 +58,8 @@ public class ApprovalPreferenceControllerTest { @Mock NotificationManager mNm; @Mock AppOpsManager mAppOpsManager; @Mock PackageManager mPm; PackageInfo mPkgInfo; ComponentName mCn = new ComponentName("a", "b"); Loading @@ -75,15 +80,47 @@ public class ApprovalPreferenceControllerTest { mController.setNm(mNm); mController.setParent(mFragment); mController.setPkgInfo(mPkgInfo); } @Test public void updateState_checked() { when(mAppOpsManager.noteOpNoThrow(anyInt(), anyInt(), anyString())).thenReturn( AppOpsManager.MODE_ALLOWED); when(mNm.isNotificationListenerAccessGranted(mCn)).thenReturn(true); SwitchPreference pref = new SwitchPreference(mContext); RestrictedSwitchPreference pref = new RestrictedSwitchPreference( mContext); pref.setAppOps(mAppOpsManager); mController.updateState(pref); assertThat(pref.isChecked()).isTrue(); assertThat(pref.isEnabled()).isTrue(); } @Test public void restrictedSettings_appOpsDisabled() { when(mAppOpsManager.noteOpNoThrow(anyInt(), anyInt(), anyString())).thenReturn( AppOpsManager.MODE_ERRORED); when(mNm.isNotificationListenerAccessGranted(mCn)).thenReturn(false); RestrictedSwitchPreference pref = new RestrictedSwitchPreference( mContext); pref.setAppOps(mAppOpsManager); mController.updateState(pref); assertThat(pref.isEnabled()).isFalse(); } @Test public void restrictedSettings_serviceAlreadyEnabled() { when(mAppOpsManager.noteOpNoThrow(anyInt(), anyInt(), anyString())).thenReturn( AppOpsManager.MODE_ERRORED); when(mNm.isNotificationListenerAccessGranted(mCn)).thenReturn(true); RestrictedSwitchPreference pref = new RestrictedSwitchPreference( mContext); pref.setAppOps(mAppOpsManager); mController.updateState(pref); assertThat(pref.isEnabled()).isTrue(); } @Test Loading Loading
res/xml/notification_access_permission_details.xml +1 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ android:layout="@layout/settings_entity_header" settings:controller="com.android.settings.applications.specialaccess.notificationaccess.HeaderPreferenceController"/> <com.android.settings.widget.FilterTouchesSwitchPreference <com.android.settingslib.RestrictedSwitchPreference android:key="notification_access_switch" android:title="@string/notification_access_detail_switch" settings:controller="com.android.settings.applications.specialaccess.notificationaccess.ApprovalPreferenceController"/> Loading
src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java +6 −3 Original line number Diff line number Diff line Loading @@ -27,10 +27,10 @@ import android.os.AsyncTask; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.SwitchPreference; import com.android.settings.core.BasePreferenceController; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.RestrictedSwitchPreference; public class ApprovalPreferenceController extends BasePreferenceController { Loading Loading @@ -78,9 +78,11 @@ public class ApprovalPreferenceController extends BasePreferenceController { @Override public void updateState(Preference pref) { final SwitchPreference preference = (SwitchPreference) pref; final RestrictedSwitchPreference preference = (RestrictedSwitchPreference) pref; final CharSequence label = mPkgInfo.applicationInfo.loadLabel(mPm); preference.setChecked(isServiceEnabled(mCn)); final boolean isEnabled = isServiceEnabled(mCn); preference.setChecked(isEnabled); preference.setOnPreferenceChangeListener((p, newValue) -> { final boolean access = (Boolean) newValue; if (!access) { Loading @@ -103,6 +105,7 @@ public class ApprovalPreferenceController extends BasePreferenceController { return false; } }); preference.updateState(mCn.getPackageName(), mPkgInfo.applicationInfo.uid, isEnabled); } public void disable(final ComponentName cn) { Loading
tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java +8 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.atLeast; Loading @@ -31,6 +33,7 @@ import static java.util.Collections.singletonList; import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.AccessibilityShortcutInfo; import android.app.AppOpsManager; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; Loading Loading @@ -110,6 +113,8 @@ public class AccessibilitySettingsTest { @Mock private PreferenceManager mPreferenceManager; private ShadowAccessibilityManager mShadowAccessibilityManager; @Mock private AppOpsManager mAppOpsManager; @Before public void setup() { Loading @@ -121,6 +126,9 @@ public class AccessibilitySettingsTest { when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager); when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext); mContext.setTheme(R.style.Theme_AppCompat); when(mContext.getSystemService(AppOpsManager.class)).thenReturn(mAppOpsManager); when(mAppOpsManager.noteOpNoThrow(eq(AppOpsManager.OP_ACCESS_RESTRICTED_SETTINGS), anyInt(), anyString())).thenReturn(AppOpsManager.MODE_ALLOWED); } @Test Loading
tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java +39 −2 Original line number Diff line number Diff line Loading @@ -18,12 +18,15 @@ package com.android.settings.applications.specialaccess.notificationaccess; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; import android.app.NotificationManager; import android.content.ComponentName; import android.content.Context; Loading @@ -31,12 +34,12 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import androidx.preference.SwitchPreference; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.RestrictedSwitchPreference; import org.junit.Before; import org.junit.Test; Loading @@ -55,6 +58,8 @@ public class ApprovalPreferenceControllerTest { @Mock NotificationManager mNm; @Mock AppOpsManager mAppOpsManager; @Mock PackageManager mPm; PackageInfo mPkgInfo; ComponentName mCn = new ComponentName("a", "b"); Loading @@ -75,15 +80,47 @@ public class ApprovalPreferenceControllerTest { mController.setNm(mNm); mController.setParent(mFragment); mController.setPkgInfo(mPkgInfo); } @Test public void updateState_checked() { when(mAppOpsManager.noteOpNoThrow(anyInt(), anyInt(), anyString())).thenReturn( AppOpsManager.MODE_ALLOWED); when(mNm.isNotificationListenerAccessGranted(mCn)).thenReturn(true); SwitchPreference pref = new SwitchPreference(mContext); RestrictedSwitchPreference pref = new RestrictedSwitchPreference( mContext); pref.setAppOps(mAppOpsManager); mController.updateState(pref); assertThat(pref.isChecked()).isTrue(); assertThat(pref.isEnabled()).isTrue(); } @Test public void restrictedSettings_appOpsDisabled() { when(mAppOpsManager.noteOpNoThrow(anyInt(), anyInt(), anyString())).thenReturn( AppOpsManager.MODE_ERRORED); when(mNm.isNotificationListenerAccessGranted(mCn)).thenReturn(false); RestrictedSwitchPreference pref = new RestrictedSwitchPreference( mContext); pref.setAppOps(mAppOpsManager); mController.updateState(pref); assertThat(pref.isEnabled()).isFalse(); } @Test public void restrictedSettings_serviceAlreadyEnabled() { when(mAppOpsManager.noteOpNoThrow(anyInt(), anyInt(), anyString())).thenReturn( AppOpsManager.MODE_ERRORED); when(mNm.isNotificationListenerAccessGranted(mCn)).thenReturn(true); RestrictedSwitchPreference pref = new RestrictedSwitchPreference( mContext); pref.setAppOps(mAppOpsManager); mController.updateState(pref); assertThat(pref.isEnabled()).isTrue(); } @Test Loading