Skip to content
Snippets Groups Projects
Commit e00ceb38 authored by Winson Chung's avatar Winson Chung Committed by Android (Google) Code Review
Browse files

Merge "Adding some trace tags around system drag and drop" into main

parents f26fe171 76cab65c
No related branches found
No related tags found
No related merge requests found
......@@ -18,6 +18,7 @@ package android.view;
 
import static android.content.res.Resources.ID_NULL;
import static android.os.Trace.TRACE_TAG_APP;
import static android.os.Trace.TRACE_TAG_VIEW;
import static android.service.autofill.Flags.FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION;
import static android.view.ContentInfo.SOURCE_DRAG_AND_DROP;
import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH;
......@@ -16356,20 +16357,20 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED) {
try {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "View.onTouchListener#onTouch");
Trace.traceBegin(TRACE_TAG_VIEW, "View.onTouchListener#onTouch");
handled = li.mOnTouchListener.onTouch(this, event);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
Trace.traceEnd(TRACE_TAG_VIEW);
}
}
if (handled) {
return true;
}
try {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "View#onTouchEvent");
Trace.traceBegin(TRACE_TAG_VIEW, "View#onTouchEvent");
return onTouchEvent(event);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
Trace.traceEnd(TRACE_TAG_VIEW);
}
}
 
......@@ -23846,14 +23847,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public void buildDrawingCache(boolean autoScale) {
if ((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0 || (autoScale ?
mDrawingCache == null : mUnscaledDrawingCache == null)) {
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW,
if (Trace.isTagEnabled(TRACE_TAG_VIEW)) {
Trace.traceBegin(TRACE_TAG_VIEW,
"buildDrawingCache/SW Layer for " + getClass().getSimpleName());
}
try {
buildDrawingCacheImpl(autoScale);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
Trace.traceEnd(TRACE_TAG_VIEW);
}
}
}
......@@ -28980,6 +28981,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
surface.copyFrom(surfaceControl);
IBinder token = null;
try {
Trace.traceBegin(TRACE_TAG_VIEW, "startDragAndDrop#drawDragShadow");
final Canvas canvas = isHardwareAccelerated()
? surface.lockHardwareCanvas()
: surface.lockCanvas(null);
......@@ -28988,33 +28990,40 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
shadowBuilder.onDrawShadow(canvas);
} finally {
surface.unlockCanvasAndPost(canvas);
Trace.traceEnd(TRACE_TAG_VIEW);
}
 
token = mAttachInfo.mSession.performDrag(mAttachInfo.mWindow, flags, surfaceControl,
root.getLastTouchSource(), root.getLastTouchDeviceId(),
root.getLastTouchPointerId(), lastTouchPoint.x, lastTouchPoint.y,
shadowTouchPoint.x, shadowTouchPoint.y, data);
if (ViewDebug.DEBUG_DRAG) {
Log.d(VIEW_LOG_TAG, "performDrag returned " + token);
}
if (token != null) {
if (mAttachInfo.mDragSurface != null) {
mAttachInfo.mDragSurface.release();
}
if (mAttachInfo.mDragData != null) {
View.cleanUpPendingIntents(mAttachInfo.mDragData);
Trace.traceBegin(TRACE_TAG_VIEW, "startDragAndDrop#performDrag");
try {
token = mAttachInfo.mSession.performDrag(mAttachInfo.mWindow, flags, surfaceControl,
root.getLastTouchSource(), root.getLastTouchDeviceId(),
root.getLastTouchPointerId(), lastTouchPoint.x, lastTouchPoint.y,
shadowTouchPoint.x, shadowTouchPoint.y, data);
if (ViewDebug.DEBUG_DRAG) {
Log.d(VIEW_LOG_TAG, "performDrag returned " + token);
}
mAttachInfo.mDragSurface = surface;
mAttachInfo.mDragToken = token;
mAttachInfo.mDragData = data;
// Cache the local state object for delivery with DragEvents
root.setLocalDragState(myLocalState);
if (a11yEnabled) {
// Set for AccessibilityEvents
mAttachInfo.mViewRootImpl.setDragStartedViewForAccessibility(this);
if (token != null) {
if (mAttachInfo.mDragSurface != null) {
mAttachInfo.mDragSurface.release();
}
if (mAttachInfo.mDragData != null) {
// Clean up previous drag data intents
View.cleanUpPendingIntents(mAttachInfo.mDragData);
}
mAttachInfo.mDragSurface = surface;
mAttachInfo.mDragToken = token;
mAttachInfo.mDragData = data;
// Cache the local state object for delivery with DragEvents
root.setLocalDragState(myLocalState);
if (a11yEnabled) {
// Set for AccessibilityEvents
mAttachInfo.mViewRootImpl.setDragStartedViewForAccessibility(this);
}
}
return token != null;
} finally {
Trace.traceEnd(TRACE_TAG_VIEW);
}
return token != null;
} catch (Exception e) {
Log.e(VIEW_LOG_TAG, "Unable to initiate drag", e);
return false;
......@@ -21,8 +21,10 @@ import static android.content.pm.ActivityInfo.OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS;
import static android.graphics.HardwareRenderer.SYNC_CONTEXT_IS_STOPPED;
import static android.graphics.HardwareRenderer.SYNC_LOST_SURFACE_REWARD_IF_FOUND;
import static android.os.IInputConstants.INVALID_INPUT_EVENT_ID;
import static android.os.Trace.TRACE_TAG_VIEW;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.DragEvent.ACTION_DRAG_LOCATION;
import static android.view.InputDevice.SOURCE_CLASS_NONE;
import static android.view.InsetsSource.ID_IME;
import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH;
......@@ -6473,7 +6475,18 @@ public final class ViewRootImpl implements ViewParent,
DragEvent event = (DragEvent) msg.obj;
// only present when this app called startDrag()
event.mLocalState = mLocalDragState;
handleDragEvent(event);
final boolean traceDragEvent = event.mAction != ACTION_DRAG_LOCATION;
try {
if (traceDragEvent) {
Trace.traceBegin(TRACE_TAG_VIEW,
"c#" + DragEvent.actionToString(event.mAction));
}
handleDragEvent(event);
} finally {
if (traceDragEvent) {
Trace.traceEnd(TRACE_TAG_VIEW);
}
}
} break;
case MSG_DISPATCH_SYSTEM_UI_VISIBILITY: {
handleDispatchSystemUiVisibilityChanged();
......
......@@ -17,6 +17,8 @@ package com.android.wm.shell.draganddrop
import android.app.ActivityManager
import android.os.RemoteException
import android.os.Trace
import android.os.Trace.TRACE_TAG_WINDOW_MANAGER
import android.util.Log
import android.view.DragEvent
import android.view.IWindowManager
......@@ -27,6 +29,7 @@ import com.android.internal.protolog.common.ProtoLog
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.protolog.ShellProtoLogGroup
import java.util.function.Consumer
import kotlin.random.Random
/**
* Manages the listener and callbacks for unhandled global drags.
......@@ -101,10 +104,15 @@ class GlobalDragListener(
@VisibleForTesting
fun onUnhandledDrop(dragEvent: DragEvent, wmCallback: IUnhandledDragCallback) {
val traceCookie = Random.nextInt()
Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, "GlobalDragListener.onUnhandledDrop",
traceCookie);
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DRAG_AND_DROP,
"onUnhandledDrop: %s", dragEvent)
if (callback == null) {
wmCallback.notifyUnhandledDropComplete(false)
Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER, "GlobalDragListener.onUnhandledDrop",
traceCookie);
return
}
......@@ -112,6 +120,8 @@ class GlobalDragListener(
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DRAG_AND_DROP,
"Notifying onUnhandledDrop complete: %b", it)
wmCallback.notifyUnhandledDropComplete(it)
Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER, "GlobalDragListener.onUnhandledDrop",
traceCookie);
}
}
......
......@@ -16,6 +16,7 @@
package com.android.server.wm;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.View.DRAG_FLAG_GLOBAL;
import static android.view.View.DRAG_FLAG_GLOBAL_SAME_APPLICATION;
import static android.view.View.DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG;
......@@ -36,6 +37,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.os.Trace;
import android.util.Slog;
import android.view.Display;
import android.view.DragEvent;
......@@ -52,6 +54,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.wm.WindowManagerInternal.IDragDropCallback;
import java.util.Objects;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
......@@ -386,6 +389,9 @@ class DragDropController {
+ "(listener=" + mGlobalDragListener + ", flags=" + mDragState.mFlags + ")");
return false;
}
final int traceCookie = new Random().nextInt();
Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, "DragDropController#notifyUnhandledDrop",
traceCookie);
if (DEBUG_DRAG) Slog.d(TAG_WM, "Sending DROP to unhandled listener (" + reason + ")");
try {
// Schedule timeout for the unhandled drag listener to call back
......@@ -396,6 +402,8 @@ class DragDropController {
if (DEBUG_DRAG) Slog.d(TAG_WM, "Unhandled listener finished handling DROP");
synchronized (mService.mGlobalLock) {
onUnhandledDropCallback(consumedByListener);
Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER,
"DragDropController#notifyUnhandledDrop", traceCookie);
}
}
});
......
......@@ -20,6 +20,7 @@ import static android.content.ClipDescription.MIMETYPE_APPLICATION_ACTIVITY;
import static android.content.ClipDescription.MIMETYPE_APPLICATION_SHORTCUT;
import static android.content.ClipDescription.MIMETYPE_APPLICATION_TASK;
import static android.os.InputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INTERCEPT_GLOBAL_DRAG_AND_DROP;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
......@@ -49,6 +50,7 @@ import android.os.Binder;
import android.os.Build;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Slog;
......@@ -258,6 +260,7 @@ class DragState {
}
mNotifiedWindows.clear();
mDragInProgress = false;
Trace.instant(TRACE_TAG_WINDOW_MANAGER, "DragDropController#DRAG_ENDED");
}
// Take the cursor back if it has been changed.
......@@ -343,6 +346,18 @@ class DragState {
if (mAnimator != null) {
return false;
}
try {
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "DragDropController#DROP");
return reportDropWindowLockInner(token, x, y);
} finally {
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}
}
private boolean reportDropWindowLockInner(IBinder token, float x, float y) {
if (mAnimator != null) {
return false;
}
final WindowState touchedWin = mService.mInputToWindowMap.get(token);
final DragEvent unhandledDropEvent = createDropEvent(x, y, null /* touchedWin */,
......@@ -355,10 +370,12 @@ class DragState {
return true;
}
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "DragDropController#noWindow");
// "drop" outside a valid window -- no recipient to apply a timeout to, and we can send
// the drag-ended message immediately.
endDragLocked(false /* consumed */, false /* relinquishDragSurfaceToDropTarget */);
if (DEBUG_DRAG) Slog.d(TAG_WM, "Drop outside a valid window " + touchedWin);
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
return false;
}
......@@ -367,6 +384,7 @@ class DragState {
final IBinder clientToken = touchedWin.mClient.asBinder();
final DragEvent event = createDropEvent(x, y, touchedWin, false /* includePrivateInfo */);
try {
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "DragDropController#dispatchDrop");
touchedWin.mClient.dispatchDragEvent(event);
// 5 second timeout for this window to respond to the drop
......@@ -380,6 +398,7 @@ class DragState {
if (MY_PID != touchedWin.mSession.mPid) {
event.recycle();
}
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}
mToken = clientToken;
mUnhandledDropEvent = unhandledDropEvent;
......@@ -471,6 +490,7 @@ class DragState {
/* call out to each visible window/session informing it about the drag
*/
void broadcastDragStartedLocked(final float touchX, final float touchY) {
Trace.instant(TRACE_TAG_WINDOW_MANAGER, "DragDropController#DRAG_STARTED");
mOriginalX = mCurrentX = touchX;
mOriginalY = mCurrentY = touchY;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment