1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.wm.shell.draganddrop; 18 19 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; 20 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; 21 import static android.content.ClipDescription.EXTRA_PENDING_INTENT; 22 import static android.content.ClipDescription.MIMETYPE_APPLICATION_ACTIVITY; 23 import static android.content.ClipDescription.MIMETYPE_APPLICATION_SHORTCUT; 24 import static android.content.ClipDescription.MIMETYPE_APPLICATION_TASK; 25 import static android.content.Intent.EXTRA_USER; 26 27 import android.app.ActivityManager; 28 import android.app.ActivityTaskManager; 29 import android.app.PendingIntent; 30 import android.app.WindowConfiguration; 31 import android.content.ClipData; 32 import android.content.ClipDescription; 33 import android.content.Context; 34 import android.content.Intent; 35 import android.content.pm.ActivityInfo; 36 import android.net.Uri; 37 import android.os.UserHandle; 38 39 import androidx.annotation.IntDef; 40 import androidx.annotation.Nullable; 41 42 import com.android.wm.shell.common.DisplayLayout; 43 44 import java.lang.annotation.Retention; 45 import java.lang.annotation.RetentionPolicy; 46 import java.util.List; 47 48 /** 49 * Per-drag session data. 50 */ 51 public class DragSession { 52 private final ActivityTaskManager mActivityTaskManager; 53 private final ClipData mInitialDragData; 54 55 final DisplayLayout displayLayout; 56 Intent dragData; 57 ActivityManager.RunningTaskInfo runningTaskInfo; 58 @WindowConfiguration.WindowingMode 59 int runningTaskWinMode = WINDOWING_MODE_UNDEFINED; 60 @WindowConfiguration.ActivityType 61 int runningTaskActType = ACTIVITY_TYPE_STANDARD; 62 boolean dragItemSupportsSplitscreen; 63 DragSession(Context context, ActivityTaskManager activityTaskManager, DisplayLayout dispLayout, ClipData data)64 DragSession(Context context, ActivityTaskManager activityTaskManager, 65 DisplayLayout dispLayout, ClipData data) { 66 mActivityTaskManager = activityTaskManager; 67 mInitialDragData = data; 68 displayLayout = dispLayout; 69 } 70 71 /** 72 * Updates the session data based on the current state of the system. 73 */ update()74 void update() { 75 List<ActivityManager.RunningTaskInfo> tasks = 76 mActivityTaskManager.getTasks(1, false /* filterOnlyVisibleRecents */); 77 if (!tasks.isEmpty()) { 78 final ActivityManager.RunningTaskInfo task = tasks.get(0); 79 runningTaskInfo = task; 80 runningTaskWinMode = task.getWindowingMode(); 81 runningTaskActType = task.getActivityType(); 82 } 83 84 final ActivityInfo info = mInitialDragData.getItemAt(0).getActivityInfo(); 85 dragItemSupportsSplitscreen = info == null 86 || ActivityInfo.isResizeableMode(info.resizeMode); 87 dragData = mInitialDragData.getItemAt(0).getIntent(); 88 } 89 } 90