Merge "Check screen context permissions for NIU Actions" into sc-dev
diff --git a/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java b/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
index 350e0d1..79e50ef 100644
--- a/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
+++ b/go/quickstep/src/com/android/quickstep/TaskOverlayFactoryGo.java
@@ -21,14 +21,18 @@
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 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 static final class TaskOverlayGo<T extends OverviewActionsView> extends TaskOverlay {
private String mNIUPackageName;
private String mWebUrl;
+ private boolean mAssistPermissionsEnabled;
private TaskOverlayGo(TaskThumbnailView taskThumbnailView) {
super(taskThumbnailView);
@@ -87,6 +97,11 @@
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 @@
@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 @@
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) {