Pass Assistant web URI in NIU Actions
The Task Overlay for the activity shown in Recents requests the AssistContent for that activity. If the content includes a web URI, this is added to the Intents sent by the NIU Actions buttons. Bug: 180157890 Test: Manual (tested with Chrome as the recent activity on local device) Test: TODO (b/179738220) Change-Id: I33c79e75678605693e0282e4ad82dc6af28957dd
This commit is contained in:
parent
6547d098c6
commit
840b42f66f
|
@ -24,6 +24,8 @@
|
||||||
|
|
||||||
<uses-sdk android:targetSdkVersion="29" android:minSdkVersion="25"/>
|
<uses-sdk android:targetSdkVersion="29" android:minSdkVersion="25"/>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:backupAgent="com.android.launcher3.LauncherBackupAgent"
|
android:backupAgent="com.android.launcher3.LauncherBackupAgent"
|
||||||
android:fullBackupOnly="true"
|
android:fullBackupOnly="true"
|
||||||
|
|
|
@ -20,11 +20,21 @@ import static com.android.quickstep.views.OverviewActionsView.DISABLED_NO_THUMBN
|
||||||
import static com.android.quickstep.views.OverviewActionsView.DISABLED_ROTATED;
|
import static com.android.quickstep.views.OverviewActionsView.DISABLED_ROTATED;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.app.ActivityTaskManager;
|
||||||
|
import android.app.IAssistDataReceiver;
|
||||||
|
import android.app.assist.AssistContent;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.os.RemoteException;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import com.android.launcher3.R;
|
import com.android.launcher3.R;
|
||||||
import com.android.quickstep.views.OverviewActionsView;
|
import com.android.quickstep.views.OverviewActionsView;
|
||||||
|
@ -40,6 +50,8 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory {
|
||||||
public static final String ACTION_TRANSLATE = "com.android.quickstep.ACTION_TRANSLATE";
|
public static final String ACTION_TRANSLATE = "com.android.quickstep.ACTION_TRANSLATE";
|
||||||
public static final String ACTION_SEARCH = "com.android.quickstep.ACTION_SEARCH";
|
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 ELAPSED_NANOS = "niu_actions_elapsed_realtime_nanos";
|
||||||
|
public static final String ACTIONS_URL = "niu_actions_app_url";
|
||||||
|
private static final String TAG = "TaskOverlayFactoryGo";
|
||||||
|
|
||||||
// Empty constructor required for ResourceBasedOverride
|
// Empty constructor required for ResourceBasedOverride
|
||||||
public TaskOverlayFactoryGo(Context context) {}
|
public TaskOverlayFactoryGo(Context context) {}
|
||||||
|
@ -56,11 +68,16 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory {
|
||||||
* @param <T> The type of View in which the overlay will be placed
|
* @param <T> The type of View in which the overlay will be placed
|
||||||
*/
|
*/
|
||||||
public static final class TaskOverlayGo<T extends OverviewActionsView> extends TaskOverlay {
|
public static final class TaskOverlayGo<T extends OverviewActionsView> extends TaskOverlay {
|
||||||
|
private static final String ASSIST_KEY_CONTENT = "content";
|
||||||
|
|
||||||
private String mPackageName;
|
private String mNIUPackageName;
|
||||||
|
private int mTaskId;
|
||||||
|
private Bundle mAssistData;
|
||||||
|
private final Handler mMainThreadHandler;
|
||||||
|
|
||||||
private TaskOverlayGo(TaskThumbnailView taskThumbnailView) {
|
private TaskOverlayGo(TaskThumbnailView taskThumbnailView) {
|
||||||
super(taskThumbnailView);
|
super(taskThumbnailView);
|
||||||
|
mMainThreadHandler = new Handler(Looper.getMainLooper());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -70,16 +87,39 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory {
|
||||||
public void initOverlay(Task task, ThumbnailData thumbnail, Matrix matrix,
|
public void initOverlay(Task task, ThumbnailData thumbnail, Matrix matrix,
|
||||||
boolean rotated) {
|
boolean rotated) {
|
||||||
getActionsView().updateDisabledFlags(DISABLED_NO_THUMBNAIL, thumbnail == null);
|
getActionsView().updateDisabledFlags(DISABLED_NO_THUMBNAIL, thumbnail == null);
|
||||||
mPackageName =
|
mNIUPackageName =
|
||||||
mApplicationContext.getResources().getString(R.string.niu_actions_package);
|
mApplicationContext.getResources().getString(R.string.niu_actions_package);
|
||||||
|
|
||||||
if (thumbnail == null || TextUtils.isEmpty(mPackageName)) {
|
if (thumbnail == null || TextUtils.isEmpty(mNIUPackageName)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
getActionsView().updateDisabledFlags(DISABLED_ROTATED, rotated);
|
getActionsView().updateDisabledFlags(DISABLED_ROTATED, rotated);
|
||||||
boolean isAllowedByPolicy = thumbnail.isRealSnapshot;
|
boolean isAllowedByPolicy = thumbnail.isRealSnapshot;
|
||||||
getActionsView().setCallbacks(new OverlayUICallbacksGoImpl(isAllowedByPolicy, task));
|
getActionsView().setCallbacks(new OverlayUICallbacksGoImpl(isAllowedByPolicy, task));
|
||||||
|
|
||||||
|
mTaskId = task.key.id;
|
||||||
|
AssistDataReceiverImpl receiver = new AssistDataReceiverImpl();
|
||||||
|
receiver.setOverlay(this);
|
||||||
|
|
||||||
|
try {
|
||||||
|
ActivityTaskManager.getService().requestAssistDataForTask(receiver, mTaskId,
|
||||||
|
mApplicationContext.getPackageName());
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
Log.e(TAG, "Unable to request AssistData");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when AssistDataReceiverImpl receives data from ActivityTaskManagerService's
|
||||||
|
* AssistDataRequester
|
||||||
|
*/
|
||||||
|
public void onAssistDataReceived(Bundle data) {
|
||||||
|
mMainThreadHandler.post(() -> {
|
||||||
|
if (data != null) {
|
||||||
|
mAssistData = data;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendNIUIntent(String actionType) {
|
private void sendNIUIntent(String actionType) {
|
||||||
|
@ -88,11 +128,21 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Intent createNIUIntent(String actionType) {
|
private Intent createNIUIntent(String actionType) {
|
||||||
return new Intent(actionType)
|
Intent intent = new Intent(actionType)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
|
.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
|
||||||
.setPackage(mPackageName)
|
.setPackage(mNIUPackageName)
|
||||||
.putExtra(ELAPSED_NANOS, SystemClock.elapsedRealtimeNanos());
|
.putExtra(ELAPSED_NANOS, SystemClock.elapsedRealtimeNanos());
|
||||||
|
|
||||||
|
if (mAssistData != null) {
|
||||||
|
final AssistContent content = mAssistData.getParcelable(ASSIST_KEY_CONTENT);
|
||||||
|
Uri webUri = (content == null) ? null : content.getWebUri();
|
||||||
|
if (webUri != null) {
|
||||||
|
intent.putExtra(ACTIONS_URL, webUri.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return intent;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected class OverlayUICallbacksGoImpl extends OverlayUICallbacksImpl
|
protected class OverlayUICallbacksGoImpl extends OverlayUICallbacksImpl
|
||||||
|
@ -130,6 +180,26 @@ public final class TaskOverlayFactoryGo extends TaskOverlayFactory {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Basic AssistDataReceiver. This is passed to ActivityTaskManagerService, which then requests
|
||||||
|
* the data.
|
||||||
|
*/
|
||||||
|
private static final class AssistDataReceiverImpl extends IAssistDataReceiver.Stub {
|
||||||
|
private TaskOverlayGo mOverlay;
|
||||||
|
|
||||||
|
public void setOverlay(TaskOverlayGo overlay) {
|
||||||
|
mOverlay = overlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onHandleAssistData(Bundle data) {
|
||||||
|
mOverlay.onAssistDataReceived(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onHandleAssistScreenshot(Bitmap screenshot) {}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callbacks the Ui can generate. This is the only way for a Ui to call methods on the
|
* Callbacks the Ui can generate. This is the only way for a Ui to call methods on the
|
||||||
* controller.
|
* controller.
|
||||||
|
|
Loading…
Reference in New Issue