• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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