summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2019-11-27 11:09:31 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2019-11-27 11:09:31 +0000
commitc050807cdc3837e3875a22ca384334be898f04de (patch)
treeeb492cb33d5c53001585b43af3321a4097af3dcb /src
parent0c247b82a5c4f1b61694d1998a3e0572bb3bf35f (diff)
parent15da32c33f2581463031fcda43bca3cfbde47048 (diff)
downloadpackages_apps_Settings-c050807cdc3837e3875a22ca384334be898f04de.tar.gz
packages_apps_Settings-c050807cdc3837e3875a22ca384334be898f04de.tar.bz2
packages_apps_Settings-c050807cdc3837e3875a22ca384334be898f04de.zip
Merge changes from topic "query_nonpublic_slices"
* changes: Enable Settings Search to query private Slices. Add the impl for the ability to query non-public Slices
Diffstat (limited to 'src')
-rw-r--r--src/com/android/settings/search/SettingsSearchIndexablesProvider.java7
-rw-r--r--src/com/android/settings/slices/SettingsSliceProvider.java44
-rw-r--r--src/com/android/settings/slices/SlicesDatabaseAccessor.java12
3 files changed, 51 insertions, 12 deletions
diff --git a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
index c619deccaa..237e58f526 100644
--- a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
+++ b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
@@ -61,6 +61,7 @@ import android.util.Log;
import androidx.annotation.Nullable;
import androidx.slice.SliceViewManager;
+import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
@@ -216,11 +217,13 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
public Cursor querySliceUriPairs() {
final SliceViewManager manager = SliceViewManager.getInstance(getContext());
final MatrixCursor cursor = new MatrixCursor(SLICE_URI_PAIRS_COLUMNS);
- final Uri baseUri =
- new Uri.Builder()
+ final String queryUri = getContext().getString(R.string.config_non_public_slice_query_uri);
+ final Uri baseUri = !TextUtils.isEmpty(queryUri) ? Uri.parse(queryUri)
+ : new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(SettingsSliceProvider.SLICE_AUTHORITY)
.build();
+
final Uri platformBaseUri =
new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index 8a6496f162..d9088811ff 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -20,10 +20,13 @@ 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.content.pm.PackageManager;
import android.net.Uri;
+import android.os.Binder;
import android.os.StrictMode;
import android.provider.Settings;
import android.provider.SettingsSlicesContract;
@@ -265,16 +268,29 @@ public class SettingsSliceProvider extends SliceProvider {
@Override
public Collection<Uri> onGetSliceDescendants(Uri uri) {
final List<Uri> descendants = new ArrayList<>();
- final Pair<Boolean, String> pathData = SliceBuilderUtils.getPathData(uri);
+ Uri finalUri = uri;
+
+ if (isPrivateSlicesNeeded(finalUri)) {
+ descendants.addAll(
+ mSlicesDatabaseAccessor.getSliceUris(finalUri.getAuthority(),
+ false /* isPublicSlice */));
+ Log.d(TAG, "provide " + descendants.size() + " non-public slices");
+ finalUri = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(finalUri.getAuthority())
+ .build();
+ }
+
+ final Pair<Boolean, String> pathData = SliceBuilderUtils.getPathData(finalUri);
if (pathData != null) {
// Uri has a full path and will not have any descendants.
- descendants.add(uri);
+ descendants.add(finalUri);
return descendants;
}
- final String authority = uri.getAuthority();
- final String path = uri.getPath();
+ final String authority = finalUri.getAuthority();
+ final String path = finalUri.getPath();
final boolean isPathEmpty = path.isEmpty();
// Path is anything but empty, "action", or "intent". Return empty list.
@@ -286,7 +302,7 @@ public class SettingsSliceProvider extends SliceProvider {
}
// Add all descendants from db with matching authority.
- descendants.addAll(mSlicesDatabaseAccessor.getSliceUris(authority));
+ descendants.addAll(mSlicesDatabaseAccessor.getSliceUris(authority, true /*isPublicSlice*/));
if (isPathEmpty && TextUtils.isEmpty(authority)) {
// No path nor authority. Return all possible Uris by adding all special slice uri
@@ -404,6 +420,24 @@ public class SettingsSliceProvider extends SliceProvider {
return set;
}
+ @VisibleForTesting
+ boolean isPrivateSlicesNeeded(Uri uri) {
+ final String queryUri = getContext().getString(R.string.config_non_public_slice_query_uri);
+
+ if (!TextUtils.isEmpty(queryUri) && TextUtils.equals(uri.toString(), queryUri)) {
+ // check if the calling package is eligible for private slices
+ final int callingUid = Binder.getCallingUid();
+ final boolean hasPermission = getContext().checkPermission(
+ android.Manifest.permission.READ_SEARCH_INDEXABLES, Binder.getCallingPid(),
+ callingUid) == PackageManager.PERMISSION_GRANTED;
+ final String callingPackage = getContext().getPackageManager()
+ .getPackagesForUid(callingUid)[0];
+ return hasPermission && TextUtils.equals(callingPackage,
+ getContext().getString(R.string.config_settingsintelligence_package_name));
+ }
+ return false;
+ }
+
private void startBackgroundWorker(Sliceable sliceable, Uri uri) {
final Class workerClass = sliceable.getBackgroundWorkerClass();
if (workerClass == null) {
diff --git a/src/com/android/settings/slices/SlicesDatabaseAccessor.java b/src/com/android/settings/slices/SlicesDatabaseAccessor.java
index 4ae9a4c5e3..e31715d385 100644
--- a/src/com/android/settings/slices/SlicesDatabaseAccessor.java
+++ b/src/com/android/settings/slices/SlicesDatabaseAccessor.java
@@ -88,16 +88,18 @@ public class SlicesDatabaseAccessor {
}
/**
- * @return a list of Slice {@link Uri}s matching {@param authority}.
+ * @return a list of Slice {@link Uri}s based on their visibility {@param isPublicSlice } and
+ * {@param authority}.
*/
- public List<Uri> getSliceUris(String authority) {
+ public List<Uri> getSliceUris(String authority, boolean isPublicSlice) {
verifyIndexing();
final List<Uri> uris = new ArrayList<>();
+ final String whereClause = IndexColumns.PUBLIC_SLICE + (isPublicSlice ? "=1" : "=0");
final SQLiteDatabase database = mHelper.getReadableDatabase();
final String[] columns = new String[]{IndexColumns.SLICE_URI};
- try (final Cursor resultCursor = database.query(TABLE_SLICES_INDEX, columns,
- null /* where */, null /* selection */, null /* groupBy */, null /* having */,
- null /* orderBy */)) {
+ try (Cursor resultCursor = database.query(TABLE_SLICES_INDEX, columns,
+ whereClause /* where */, null /* selection */, null /* groupBy */,
+ null /* having */, null /* orderBy */)) {
if (!resultCursor.moveToFirst()) {
return uris;
}