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
This commit is contained in:
Matthew Fritze
2019-04-18 08:51:17 -07:00
parent f1cea95f3e
commit 2bdea1d922
2 changed files with 26 additions and 0 deletions

View File

@@ -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<Uri> descendants) {
if (descendants == null) {

View File

@@ -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);