blob: 2a7dd5aeb3418512c6697cc434a5df0dcd562106 [file] [log] [blame]
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.wm.shell.draganddrop;
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 android.content.ClipData;
import android.content.ClipDescription;
import android.content.pm.ActivityInfo;
import android.view.DragEvent;
import androidx.annotation.Nullable;
import com.android.internal.logging.InstanceId;
import com.android.internal.logging.InstanceIdSequence;
import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
/**
* Helper class that to log Drag & Drop UIEvents for a single session, see also go/uievent
*/
public class DragAndDropEventLogger {
private final UiEventLogger mUiEventLogger;
// Used to generate instance ids for this drag if one is not provided
private final InstanceIdSequence mIdSequence;
// Tracks the current drag session
private ActivityInfo mActivityInfo;
private InstanceId mInstanceId;
public DragAndDropEventLogger(UiEventLogger uiEventLogger) {
mUiEventLogger = uiEventLogger;
mIdSequence = new InstanceIdSequence(Integer.MAX_VALUE);
}
/**
* Logs the start of a drag.
*/
public InstanceId logStart(DragEvent event) {
final ClipDescription description = event.getClipDescription();
final ClipData data = event.getClipData();
final ClipData.Item item = data.getItemAt(0);
mInstanceId = item.getIntent().getParcelableExtra(
ClipDescription.EXTRA_LOGGING_INSTANCE_ID);
if (mInstanceId == null) {
mInstanceId = mIdSequence.newInstanceId();
}
mActivityInfo = item.getActivityInfo();
log(getStartEnum(description), mActivityInfo);
return mInstanceId;
}
/**
* Logs a successful drop.
*/
public void logDrop() {
log(DragAndDropUiEventEnum.GLOBAL_APP_DRAG_DROPPED, mActivityInfo);
}
/**
* Logs the end of a drag.
*/
public void logEnd() {
log(DragAndDropUiEventEnum.GLOBAL_APP_DRAG_END, mActivityInfo);
}
private void log(UiEventLogger.UiEventEnum event, @Nullable ActivityInfo activityInfo) {
mUiEventLogger.logWithInstanceId(event,
activityInfo == null ? 0 : activityInfo.applicationInfo.uid,
activityInfo == null ? null : activityInfo.applicationInfo.packageName,
mInstanceId);
}
/**
* Returns the start logging enum for the given drag description.
*/
private DragAndDropUiEventEnum getStartEnum(ClipDescription description) {
if (description.hasMimeType(MIMETYPE_APPLICATION_ACTIVITY)) {
return DragAndDropUiEventEnum.GLOBAL_APP_DRAG_START_ACTIVITY;
} else if (description.hasMimeType(MIMETYPE_APPLICATION_SHORTCUT)) {
return DragAndDropUiEventEnum.GLOBAL_APP_DRAG_START_SHORTCUT;
} else if (description.hasMimeType(MIMETYPE_APPLICATION_TASK)) {
return DragAndDropUiEventEnum.GLOBAL_APP_DRAG_START_TASK;
}
throw new IllegalArgumentException("Not an app drag");
}
/**
* Enums for logging Drag & Drop UiEvents
*/
public enum DragAndDropUiEventEnum implements UiEventLogger.UiEventEnum {
@UiEvent(doc = "Starting a global drag and drop of an activity")
GLOBAL_APP_DRAG_START_ACTIVITY(884),
@UiEvent(doc = "Starting a global drag and drop of a shortcut")
GLOBAL_APP_DRAG_START_SHORTCUT(885),
@UiEvent(doc = "Starting a global drag and drop of a task")
GLOBAL_APP_DRAG_START_TASK(888),
@UiEvent(doc = "A global app drag was successfully dropped")
GLOBAL_APP_DRAG_DROPPED(887),
@UiEvent(doc = "Ending a global app drag and drop")
GLOBAL_APP_DRAG_END(886);
private final int mId;
DragAndDropUiEventEnum(int id) {
mId = id;
}
@Override
public int getId() {
return mId;
}
}
}