From c5919749ea7a54191a343f9c465bc714c661f916 Mon Sep 17 00:00:00 2001 From: Jon Spivack Date: Wed, 28 Apr 2021 11:43:34 -0700 Subject: [PATCH] Check screen context permissions for NIU Actions This checks for the ASSIST_STRUCTURE_ENABLED and ASSIST_SCREENSHOT_ENABLED permissions before sending NIU Actions Intents. If either permission is absent, the screenshot is not sent, and an error code is added to the Intent. Bug: 182010359 Test: Manual (toggled permissions and clicked NIU Actions buttons on Wembley device) Test: m -j RunLauncherGoGoogleRoboTests Change-Id: Icf0db739f5010862cc2bac496f5410665625f3be --- .../quickstep/TaskOverlayFactoryGo.java | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java b/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java index 350e0d1d97..79e50ef35b 100644 --- a/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java +++ b/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java @@ -21,14 +21,18 @@ import static com.android.quickstep.views.OverviewActionsView.DISABLED_ROTATED; import android.annotation.SuppressLint; import android.app.assist.AssistContent; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.graphics.Matrix; +import android.net.Uri; import android.os.SystemClock; +import android.provider.Settings; import android.text.TextUtils; import androidx.annotation.VisibleForTesting; +import com.android.launcher3.BuildConfig; import com.android.launcher3.R; import com.android.quickstep.util.AssistContentRequester; import com.android.quickstep.views.OverviewActionsView; @@ -45,7 +49,12 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory { public static final String ACTION_SEARCH = "com.android.quickstep.ACTION_SEARCH"; public static final String ELAPSED_NANOS = "niu_actions_elapsed_realtime_nanos"; public static final String ACTIONS_URL = "niu_actions_app_url"; + public static final String ACTIONS_ERROR_CODE = "niu_actions_app_error_code"; + public static final int ERROR_PERMISSIONS = 1; private static final String TAG = "TaskOverlayFactoryGo"; + private static final String URI_AUTHORITY = + BuildConfig.APPLICATION_ID + ".overview.fileprovider"; + private static final String FAKE_FILEPATH = "shared_images/null.png"; // Empty constructor required for ResourceBasedOverride public TaskOverlayFactoryGo(Context context) {} @@ -64,6 +73,7 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory { public static final class TaskOverlayGo extends TaskOverlay { private String mNIUPackageName; private String mWebUrl; + private boolean mAssistPermissionsEnabled; private TaskOverlayGo(TaskThumbnailView taskThumbnailView) { super(taskThumbnailView); @@ -87,6 +97,11 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory { boolean isAllowedByPolicy = mThumbnailView.isRealSnapshot(); getActionsView().setCallbacks(new OverlayUICallbacksGoImpl(isAllowedByPolicy, task)); + checkPermissions(); + if (!mAssistPermissionsEnabled) { + return; + } + int taskId = task.key.id; AssistContentRequester contentRequester = new AssistContentRequester(mApplicationContext); @@ -112,7 +127,22 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory { @VisibleForTesting public void sendNIUIntent(String actionType) { Intent intent = createNIUIntent(actionType); - mImageApi.shareAsDataWithExplicitIntent(/* crop */ null, intent); + // Only add and send the image if the appropriate permissions are held + if (mAssistPermissionsEnabled) { + mImageApi.shareAsDataWithExplicitIntent(/* crop */ null, intent); + } else { + intent.putExtra(ACTIONS_ERROR_CODE, ERROR_PERMISSIONS); + // The Intent recipient expects an image URI, and omitting one or using a + // completely invalid URI will cause the Intent parsing to crash. + // So we construct a URI for a nonexistent image. + Uri uri = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(URI_AUTHORITY) + .path(FAKE_FILEPATH) + .build(); + intent.setData(uri); + mApplicationContext.startActivity(intent); + } } private Intent createNIUIntent(String actionType) { @@ -129,6 +159,19 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory { return intent; } + /** + * Checks whether the Assistant has screen context permissions + */ + @VisibleForTesting + public void checkPermissions() { + ContentResolver contentResolver = mApplicationContext.getContentResolver(); + boolean structureEnabled = Settings.Secure.getInt(contentResolver, + Settings.Secure.ASSIST_STRUCTURE_ENABLED, 0) != 0; + boolean screenshotEnabled = Settings.Secure.getInt(contentResolver, + Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 0) != 0; + mAssistPermissionsEnabled = structureEnabled && screenshotEnabled; + } + protected class OverlayUICallbacksGoImpl extends OverlayUICallbacksImpl implements OverlayUICallbacksGo { public OverlayUICallbacksGoImpl(boolean isAllowedByPolicy, Task task) {