From 2bdea1d9222c92452777d1fa9a67e7e8bd9e7814 Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Thu, 18 Apr 2019 08:51:17 -0700 Subject: [PATCH] Prevent bad apps from getting Setting Slices SettingsSliceProvider no longer allows apps to request permission from the user for Settings Slices. Instead, the PrimaryAction on the permission slice will be an intent into Settings. This is because the dialog for granting apps Settings Slices would act as a replacement for regular permission dialogs, which we want to avoid. Fixes: 130795282 Test: robolectrico Change-Id: I6848215bab2bf10ee5e53814b765d04f04f53f4e --- .../settings/slices/SettingsSliceProvider.java | 14 ++++++++++++++ .../settings/slices/SettingsSliceProviderTest.java | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java index 3bdcb13141f..9b5fbd86253 100644 --- a/src/com/android/settings/slices/SettingsSliceProvider.java +++ b/src/com/android/settings/slices/SettingsSliceProvider.java @@ -18,9 +18,11 @@ package com.android.settings.slices; import static android.Manifest.permission.READ_SEARCH_INDEXABLES; +import android.app.PendingIntent; import android.app.slice.SliceManager; import android.content.ContentResolver; import android.content.Context; +import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.os.StrictMode; @@ -32,6 +34,8 @@ import android.util.KeyValueListParser; import android.util.Log; import android.util.Pair; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.collection.ArraySet; import androidx.slice.Slice; @@ -295,6 +299,16 @@ public class SettingsSliceProvider extends SliceProvider { return descendants; } + @Nullable + @Override + public PendingIntent onCreatePermissionRequest(@NonNull Uri sliceUri, + @NonNull String callingPackage) { + final Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS); + final PendingIntent noOpIntent = PendingIntent.getActivity(getContext(), + 0 /* requestCode */, settingsIntent, 0 /* flags */); + return noOpIntent; + } + @VisibleForTesting static void grantWhitelistedPackagePermissions(Context context, List descendants) { if (descendants == null) { diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java index 9f121306b8c..96aaf46ef35 100644 --- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java +++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java @@ -31,10 +31,12 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.PendingIntent; import android.app.slice.SliceManager; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; +import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.os.StrictMode; @@ -444,6 +446,16 @@ public class SettingsSliceProviderTest { assertThat(descendants).containsExactlyElementsIn(expectedUris); } + @Test + public void onCreatePermissionRequest_returnsSettingIntent() { + final PendingIntent pendingIntent = mProvider.onCreatePermissionRequest( + CustomSliceRegistry.FLASHLIGHT_SLICE_URI, "com.android.whaaaat"); + PendingIntent settingsPendingIntent = + PendingIntent.getActivity(mContext, 0, new Intent(Settings.ACTION_SETTINGS), 0); + + assertThat(pendingIntent).isEqualTo(settingsPendingIntent); + } + @Test public void bindSlice_wifiSlice_returnsWifiSlice() { final Slice wifiSlice = mProvider.onBindSlice(CustomSliceRegistry.WIFI_SLICE_URI);