Good riddance UserEventDispatcher
Bug: 165675920 Bug: 161381246 TL;DR;; - nano -> lite proto - add all the missing logs to WW - pin item related logging fix - Removed logging for assistant sgrep "com.android.launcher3.userevent.nano." | cut -f1 -d: | xargs sed -i -e 's/userevent\.nano\./userevent\./g' Change-Id: Ie2a49fdd891cacbd7ef40a1dc9e41ff0574c7517
This commit is contained in:
@@ -37,8 +37,6 @@ import androidx.annotation.IntDef;
|
||||
|
||||
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
|
||||
import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.logging.UserEventDispatcher;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||
import com.android.launcher3.util.SystemUiController;
|
||||
import com.android.launcher3.util.ViewCache;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
@@ -82,7 +80,6 @@ public abstract class BaseActivity extends Activity implements ActivityContext {
|
||||
new ArrayList<>();
|
||||
|
||||
protected DeviceProfile mDeviceProfile;
|
||||
protected UserEventDispatcher mUserEventDispatcher;
|
||||
protected StatsLogManager mStatsLogManager;
|
||||
protected SystemUiController mSystemUiController;
|
||||
|
||||
@@ -144,8 +141,6 @@ public abstract class BaseActivity extends Activity implements ActivityContext {
|
||||
return mDeviceProfile;
|
||||
}
|
||||
|
||||
public void modifyUserEvent(LauncherLogProto.LauncherEvent event) {}
|
||||
|
||||
public final StatsLogManager getStatsLogManager() {
|
||||
if (mStatsLogManager == null) {
|
||||
mStatsLogManager = StatsLogManager.newInstance(this);
|
||||
@@ -153,13 +148,6 @@ public abstract class BaseActivity extends Activity implements ActivityContext {
|
||||
return mStatsLogManager;
|
||||
}
|
||||
|
||||
public final UserEventDispatcher getUserEventDispatcher() {
|
||||
if (mUserEventDispatcher == null) {
|
||||
mUserEventDispatcher = UserEventDispatcher.newInstance(this);
|
||||
}
|
||||
return mUserEventDispatcher;
|
||||
}
|
||||
|
||||
public SystemUiController getSystemUiController() {
|
||||
if (mSystemUiController == null) {
|
||||
mSystemUiController = new SystemUiController(getWindow());
|
||||
|
||||
@@ -47,7 +47,6 @@ import com.android.launcher3.dragndrop.DragLayer;
|
||||
import com.android.launcher3.dragndrop.DragOptions;
|
||||
import com.android.launcher3.dragndrop.DragView;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
|
||||
import com.android.launcher3.util.Themes;
|
||||
import com.android.launcher3.util.Thunk;
|
||||
|
||||
@@ -395,6 +394,4 @@ public abstract class ButtonDropTarget extends TextView
|
||||
TextUtils.TruncateAt.END);
|
||||
return !mText.equals(displayedText);
|
||||
}
|
||||
|
||||
public abstract Target getDropTargetForLogging();
|
||||
}
|
||||
|
||||
@@ -18,8 +18,7 @@ package com.android.launcher3;
|
||||
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_DROPPED_ON_CANCEL;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_DROPPED_ON_REMOVE;
|
||||
import static com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch.TAP;
|
||||
import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType.UNDO;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_UNDO;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
@@ -28,22 +27,19 @@ import android.view.View;
|
||||
|
||||
import com.android.launcher3.accessibility.LauncherAccessibilityDelegate;
|
||||
import com.android.launcher3.dragndrop.DragOptions;
|
||||
import com.android.launcher3.logging.LoggerUtils;
|
||||
import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.model.ModelWriter;
|
||||
import com.android.launcher3.model.data.FolderInfo;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
|
||||
import com.android.launcher3.model.data.WorkspaceItemInfo;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
|
||||
import com.android.launcher3.views.Snackbar;
|
||||
|
||||
public class DeleteDropTarget extends ButtonDropTarget {
|
||||
|
||||
private final StatsLogManager mStatsLogManager;
|
||||
|
||||
private int mControlType = ControlType.DEFAULT_CONTROLTYPE;
|
||||
private StatsLogManager.LauncherEvent mLauncherEvent;
|
||||
|
||||
public DeleteDropTarget(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
@@ -115,8 +111,8 @@ public class DeleteDropTarget extends ButtonDropTarget {
|
||||
* Set mControlType depending on the drag item.
|
||||
*/
|
||||
private void setControlTypeBasedOnDragSource(ItemInfo item) {
|
||||
mControlType = item.id != ItemInfo.NO_ID ? ControlType.REMOVE_TARGET
|
||||
: ControlType.CANCEL_TARGET;
|
||||
mLauncherEvent = item.id != ItemInfo.NO_ID ? LAUNCHER_ITEM_DROPPED_ON_REMOVE
|
||||
: LAUNCHER_ITEM_DROPPED_ON_CANCEL;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -127,8 +123,7 @@ public class DeleteDropTarget extends ButtonDropTarget {
|
||||
}
|
||||
super.onDrop(d, options);
|
||||
mStatsLogManager.logger().withInstanceId(d.logInstanceId)
|
||||
.log(mControlType == ControlType.REMOVE_TARGET ? LAUNCHER_ITEM_DROPPED_ON_REMOVE
|
||||
: LAUNCHER_ITEM_DROPPED_ON_CANCEL);
|
||||
.log(mLauncherEvent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -141,7 +136,7 @@ public class DeleteDropTarget extends ButtonDropTarget {
|
||||
Runnable onUndoClicked = () -> {
|
||||
mLauncher.setPageToBindSynchronously(itemPage);
|
||||
modelWriter.abortDelete();
|
||||
mLauncher.getUserEventDispatcher().logActionOnControl(TAP, UNDO);
|
||||
mLauncher.getStatsLogManager().logger().log(LAUNCHER_UNDO);
|
||||
};
|
||||
Snackbar.show(mLauncher, R.string.item_removed, R.string.undo,
|
||||
modelWriter::commitDelete, onUndoClicked);
|
||||
@@ -161,11 +156,4 @@ public class DeleteDropTarget extends ButtonDropTarget {
|
||||
mLauncher.getDragLayer()
|
||||
.announceForAccessibility(getContext().getString(R.string.item_removed));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Target getDropTargetForLogging() {
|
||||
Target t = LoggerUtils.newTarget(Target.Type.CONTROL);
|
||||
t.controlType = mControlType;
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
|
||||
package com.android.launcher3;
|
||||
|
||||
import static com.android.launcher3.logging.LoggerUtils.newContainerTarget;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.util.AttributeSet;
|
||||
@@ -27,14 +25,10 @@ import android.view.ViewDebug;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class Hotseat extends CellLayout implements LogContainerProvider, Insettable {
|
||||
/**
|
||||
* View class that represents the bottom row of the home screen.
|
||||
*/
|
||||
public class Hotseat extends CellLayout implements Insettable {
|
||||
|
||||
@ViewDebug.ExportedProperty(category = "launcher")
|
||||
private boolean mHasVerticalHotseat;
|
||||
@@ -78,15 +72,6 @@ public class Hotseat extends CellLayout implements LogContainerProvider, Insetta
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fillInLogContainerData(ItemInfo childInfo, Target child,
|
||||
ArrayList<Target> parents) {
|
||||
child.rank = childInfo.rank;
|
||||
child.gridX = childInfo.cellX;
|
||||
child.gridY = childInfo.cellY;
|
||||
parents.add(newContainerTarget(LauncherLogProto.ContainerType.HOTSEAT));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInsets(Rect insets) {
|
||||
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
|
||||
|
||||
@@ -37,11 +37,10 @@ import static com.android.launcher3.LauncherState.OVERVIEW;
|
||||
import static com.android.launcher3.LauncherState.SPRING_LOADED;
|
||||
import static com.android.launcher3.Utilities.postAsyncCallback;
|
||||
import static com.android.launcher3.dragndrop.DragLayer.ALPHA_INDEX_LAUNCHER_LOAD;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newContainerTarget;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_BACKGROUND;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ONRESUME;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ONSTOP;
|
||||
import static com.android.launcher3.logging.StatsLogManager.containerTypeToAtomState;
|
||||
import static com.android.launcher3.model.ItemInstallQueue.FLAG_ACTIVITY_PAUSED;
|
||||
import static com.android.launcher3.model.ItemInstallQueue.FLAG_DRAG_AND_DROP;
|
||||
import static com.android.launcher3.model.ItemInstallQueue.FLAG_LOADER_RUNNING;
|
||||
@@ -127,7 +126,6 @@ import com.android.launcher3.keyboard.ViewGroupFocusHelper;
|
||||
import com.android.launcher3.logger.LauncherAtom;
|
||||
import com.android.launcher3.logging.FileLog;
|
||||
import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.logging.UserEventDispatcher;
|
||||
import com.android.launcher3.model.BgDataModel.Callbacks;
|
||||
import com.android.launcher3.model.ItemInstallQueue;
|
||||
import com.android.launcher3.model.ModelUtils;
|
||||
@@ -155,9 +153,6 @@ import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.touch.AllAppsSwipeController;
|
||||
import com.android.launcher3.touch.ItemClickHandler;
|
||||
import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
|
||||
import com.android.launcher3.util.ActivityResultInfo;
|
||||
import com.android.launcher3.util.ActivityTracker;
|
||||
import com.android.launcher3.util.ComponentKey;
|
||||
@@ -561,7 +556,6 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
|
||||
}
|
||||
|
||||
private void onIdpChanged(InvariantDeviceProfile idp) {
|
||||
mUserEventDispatcher = null;
|
||||
|
||||
initDeviceProfile(idp);
|
||||
dispatchDeviceProfileChanged();
|
||||
@@ -917,7 +911,7 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
|
||||
mOverlayManager.onActivityStopped(this);
|
||||
}
|
||||
|
||||
logStopAndResume(Action.Command.STOP);
|
||||
logStopAndResume(false /* isResume */);
|
||||
mAppWidgetHost.setListenIfResumed(false);
|
||||
NotificationListener.removeNotificationsChangedListener();
|
||||
}
|
||||
@@ -939,7 +933,7 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
|
||||
@Override
|
||||
@CallSuper
|
||||
protected void onDeferredResumed() {
|
||||
logStopAndResume(Action.Command.RESUME);
|
||||
logStopAndResume(true /* isResume */);
|
||||
|
||||
// Process any items that were added while Launcher was away.
|
||||
ItemInstallQueue.INSTANCE.get(this)
|
||||
@@ -956,32 +950,28 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
|
||||
|
||||
protected void handlePendingActivityRequest() { }
|
||||
|
||||
private void logStopAndResume(int command) {
|
||||
private void logStopAndResume(boolean isResume) {
|
||||
if (mPendingExecutor != null) return;
|
||||
int pageIndex = mWorkspace.isOverlayShown() ? -1 : mWorkspace.getCurrentPage();
|
||||
int containerType = mStateManager.getState().containerType;
|
||||
int statsLogOrdinal = mStateManager.getState().statsLogOrdinal;
|
||||
|
||||
StatsLogManager.EventEnum event;
|
||||
StatsLogManager.StatsLogger logger = getStatsLogManager().logger();
|
||||
if (command == Action.Command.RESUME) {
|
||||
if (isResume) {
|
||||
logger.withSrcState(LAUNCHER_STATE_BACKGROUND)
|
||||
.withDstState(containerTypeToAtomState(mStateManager.getState().containerType));
|
||||
.withDstState(mStateManager.getState().statsLogOrdinal);
|
||||
event = LAUNCHER_ONRESUME;
|
||||
} else { /* command == Action.Command.STOP */
|
||||
logger.withSrcState(containerTypeToAtomState(mStateManager.getState().containerType))
|
||||
logger.withSrcState(mStateManager.getState().statsLogOrdinal)
|
||||
.withDstState(LAUNCHER_STATE_BACKGROUND);
|
||||
event = LAUNCHER_ONSTOP;
|
||||
}
|
||||
|
||||
if (containerType == ContainerType.WORKSPACE && mWorkspace != null) {
|
||||
getUserEventDispatcher().logActionCommand(command,
|
||||
containerType, -1, pageIndex);
|
||||
if (statsLogOrdinal == LAUNCHER_STATE_HOME && mWorkspace != null) {
|
||||
logger.withContainerInfo(LauncherAtom.ContainerInfo.newBuilder()
|
||||
.setWorkspace(
|
||||
LauncherAtom.WorkspaceContainer.newBuilder()
|
||||
.setPageIndex(pageIndex)).build());
|
||||
} else {
|
||||
getUserEventDispatcher().logActionCommand(command, containerType, -1);
|
||||
}
|
||||
logger.log(event);
|
||||
}
|
||||
@@ -1483,11 +1473,6 @@ public class Launcher extends StatefulActivity<LauncherState> implements Launche
|
||||
}
|
||||
|
||||
// Handle HOME_INTENT
|
||||
UserEventDispatcher ued = getUserEventDispatcher();
|
||||
Target target = newContainerTarget(mStateManager.getState().containerType);
|
||||
target.pageIndex = mWorkspace.getCurrentPage();
|
||||
ued.logActionCommand(Action.Command.HOME_INTENT, target,
|
||||
newContainerTarget(ContainerType.WORKSPACE));
|
||||
hideKeyboard();
|
||||
|
||||
if (mLauncherCallbacks != null) {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
package com.android.launcher3;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.ACCEL_2;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME;
|
||||
import static com.android.launcher3.testing.TestProtocol.ALL_APPS_STATE_ORDINAL;
|
||||
import static com.android.launcher3.testing.TestProtocol.BACKGROUND_APP_STATE_ORDINAL;
|
||||
import static com.android.launcher3.testing.TestProtocol.HINT_STATE_ORDINAL;
|
||||
@@ -35,7 +36,6 @@ import com.android.launcher3.states.SpringLoadedState;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.uioverrides.states.AllAppsState;
|
||||
import com.android.launcher3.uioverrides.states.OverviewState;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@@ -97,7 +97,7 @@ public abstract class LauncherState implements BaseState<LauncherState> {
|
||||
* TODO: Create a separate class for NORMAL state.
|
||||
*/
|
||||
public static final LauncherState NORMAL = new LauncherState(NORMAL_STATE_ORDINAL,
|
||||
ContainerType.WORKSPACE,
|
||||
LAUNCHER_STATE_HOME,
|
||||
FLAG_DISABLE_RESTORE | FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED | FLAG_HIDE_BACK_BUTTON |
|
||||
FLAG_HAS_SYS_UI_SCRIM) {
|
||||
@Override
|
||||
@@ -126,9 +126,9 @@ public abstract class LauncherState implements BaseState<LauncherState> {
|
||||
public final int ordinal;
|
||||
|
||||
/**
|
||||
* Used for containerType in {@link com.android.launcher3.logging.UserEventDispatcher}
|
||||
* Used for {@link com.android.launcher3.logging.StatsLogManager}
|
||||
*/
|
||||
public final int containerType;
|
||||
public final int statsLogOrdinal;
|
||||
|
||||
/**
|
||||
* True if the state has overview panel visible.
|
||||
@@ -137,8 +137,8 @@ public abstract class LauncherState implements BaseState<LauncherState> {
|
||||
|
||||
private final int mFlags;
|
||||
|
||||
public LauncherState(int id, int containerType, int flags) {
|
||||
this.containerType = containerType;
|
||||
public LauncherState(int id, int statsLogOrdinal, int flags) {
|
||||
this.statsLogOrdinal = statsLogOrdinal;
|
||||
this.mFlags = flags;
|
||||
this.overviewUi = (flags & FLAG_OVERVIEW_UI) != 0;
|
||||
this.ordinal = id;
|
||||
|
||||
@@ -37,14 +37,11 @@ import com.android.launcher3.Launcher.OnResumeCallback;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.dragndrop.DragOptions;
|
||||
import com.android.launcher3.logging.FileLog;
|
||||
import com.android.launcher3.logging.LoggerUtils;
|
||||
import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.logging.StatsLogManager.StatsLogger;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.model.data.ItemInfoWithIcon;
|
||||
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
|
||||
import com.android.launcher3.util.PackageManagerHelper;
|
||||
import com.android.launcher3.util.Themes;
|
||||
|
||||
@@ -134,19 +131,6 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList
|
||||
return mCurrentAccessibilityAction;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Target getDropTargetForLogging() {
|
||||
Target t = LoggerUtils.newTarget(Target.Type.CONTROL);
|
||||
if (mCurrentAccessibilityAction == UNINSTALL) {
|
||||
t.controlType = ControlType.UNINSTALL_TARGET;
|
||||
} else if (mCurrentAccessibilityAction == DISMISS_PREDICTION) {
|
||||
t.controlType = ControlType.DISMISS_PREDICTION;
|
||||
} else {
|
||||
t.controlType = ControlType.SETTINGS_BUTTON;
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean supportsDrop(ItemInfo info) {
|
||||
return supportsAccessibilityDrop(info, getViewUnderDrag(info));
|
||||
|
||||
@@ -85,7 +85,6 @@ import com.android.launcher3.icons.BitmapRenderer;
|
||||
import com.android.launcher3.logger.LauncherAtom;
|
||||
import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.logging.StatsLogManager.LauncherEvent;
|
||||
import com.android.launcher3.logging.UserEventDispatcher;
|
||||
import com.android.launcher3.model.data.AppInfo;
|
||||
import com.android.launcher3.model.data.FolderInfo;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
@@ -97,8 +96,6 @@ import com.android.launcher3.statemanager.StateManager;
|
||||
import com.android.launcher3.statemanager.StateManager.StateHandler;
|
||||
import com.android.launcher3.states.StateAnimationConfig;
|
||||
import com.android.launcher3.touch.WorkspaceTouchListener;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
import com.android.launcher3.util.Executors;
|
||||
import com.android.launcher3.util.IntArray;
|
||||
import com.android.launcher3.util.IntSparseArrayMap;
|
||||
@@ -1004,8 +1001,6 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
public void onOverlayScrollChanged(float scroll) {
|
||||
if (Float.compare(scroll, 1f) == 0) {
|
||||
if (!mOverlayShown) {
|
||||
mLauncher.getUserEventDispatcher().logActionOnContainer(Action.Touch.SWIPE,
|
||||
Action.Direction.LEFT, ContainerType.WORKSPACE, 0);
|
||||
mLauncher.getStatsLogManager().logger()
|
||||
.withSrcState(LAUNCHER_STATE_HOME)
|
||||
.withDstState(LAUNCHER_STATE_HOME)
|
||||
@@ -1020,20 +1015,16 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
// Not announcing the overlay page for accessibility since it announces itself.
|
||||
} else if (Float.compare(scroll, 0f) == 0) {
|
||||
if (mOverlayShown) {
|
||||
UserEventDispatcher ued = mLauncher.getUserEventDispatcher();
|
||||
if (!ued.isPreviousHomeGesture()) {
|
||||
mLauncher.getUserEventDispatcher().logActionOnContainer(Action.Touch.SWIPE,
|
||||
Action.Direction.RIGHT, ContainerType.WORKSPACE, -1);
|
||||
mLauncher.getStatsLogManager().logger()
|
||||
.withSrcState(LAUNCHER_STATE_HOME)
|
||||
.withDstState(LAUNCHER_STATE_HOME)
|
||||
.withContainerInfo(LauncherAtom.ContainerInfo.newBuilder()
|
||||
.setWorkspace(
|
||||
LauncherAtom.WorkspaceContainer.newBuilder()
|
||||
.setPageIndex(-1))
|
||||
.build())
|
||||
.log(LAUNCHER_SWIPERIGHT);
|
||||
}
|
||||
// TODO: this is logged unnecessarily on home gesture.
|
||||
mLauncher.getStatsLogManager().logger()
|
||||
.withSrcState(LAUNCHER_STATE_HOME)
|
||||
.withDstState(LAUNCHER_STATE_HOME)
|
||||
.withContainerInfo(LauncherAtom.ContainerInfo.newBuilder()
|
||||
.setWorkspace(
|
||||
LauncherAtom.WorkspaceContainer.newBuilder()
|
||||
.setPageIndex(-1))
|
||||
.build())
|
||||
.log(LAUNCHER_SWIPERIGHT);
|
||||
} else if (Float.compare(mOverlayTranslation, 0f) != 0) {
|
||||
// When arriving to 0 overscroll from non-zero overscroll, announce page for
|
||||
// accessibility since default announcements were disabled while in overscroll
|
||||
@@ -1124,12 +1115,8 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
||||
protected void notifyPageSwitchListener(int prevPage) {
|
||||
super.notifyPageSwitchListener(prevPage);
|
||||
if (prevPage != mCurrentPage) {
|
||||
int swipeDirection = (prevPage < mCurrentPage)
|
||||
? Action.Direction.RIGHT : Action.Direction.LEFT;
|
||||
StatsLogManager.EventEnum event = (prevPage < mCurrentPage)
|
||||
? LAUNCHER_SWIPERIGHT : LAUNCHER_SWIPELEFT;
|
||||
mLauncher.getUserEventDispatcher().logActionOnContainer(Action.Touch.SWIPE,
|
||||
swipeDirection, ContainerType.WORKSPACE, prevPage);
|
||||
mLauncher.getStatsLogManager().logger()
|
||||
.withSrcState(LAUNCHER_STATE_HOME)
|
||||
.withDstState(LAUNCHER_STATE_HOME)
|
||||
|
||||
@@ -19,8 +19,6 @@ import static android.view.View.MeasureSpec.EXACTLY;
|
||||
import static android.view.View.MeasureSpec.UNSPECIFIED;
|
||||
import static android.view.View.MeasureSpec.makeMeasureSpec;
|
||||
|
||||
import static com.android.launcher3.logging.LoggerUtils.newContainerTarget;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Canvas;
|
||||
@@ -38,10 +36,6 @@ import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.LauncherAppState;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.allapps.AllAppsGridAdapter.AppsGridLayoutManager;
|
||||
import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
|
||||
import com.android.launcher3.views.RecyclerViewFastScroller;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -50,7 +44,7 @@ import java.util.List;
|
||||
/**
|
||||
* A RecyclerView with custom fast scroll support for the all apps view.
|
||||
*/
|
||||
public class AllAppsRecyclerView extends BaseRecyclerView implements LogContainerProvider {
|
||||
public class AllAppsRecyclerView extends BaseRecyclerView {
|
||||
|
||||
private AlphabeticalAppsList mApps;
|
||||
private final int mNumAppsPerRow;
|
||||
@@ -176,13 +170,6 @@ public class AllAppsRecyclerView extends BaseRecyclerView implements LogContaine
|
||||
mAutoSizedOverlays.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fillInLogContainerData(ItemInfo childInfo, Target child,
|
||||
ArrayList<Target> parents) {
|
||||
parents.add(newContainerTarget(
|
||||
getApps().hasFilter() ? ContainerType.SEARCHRESULT : ContainerType.ALLAPPS));
|
||||
}
|
||||
|
||||
public void onSearchResultsChanged() {
|
||||
// Always scroll the view to the top so the user can see the changed results
|
||||
scrollToTop();
|
||||
|
||||
@@ -18,8 +18,6 @@ package com.android.launcher3.allapps;
|
||||
|
||||
import static com.android.launcher3.LauncherState.NORMAL;
|
||||
import static com.android.launcher3.LauncherState.OVERVIEW;
|
||||
import static com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType.HOTSEAT;
|
||||
import static com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType.PREDICTION;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorInflater;
|
||||
@@ -120,10 +118,10 @@ public class DiscoveryBounce extends AbstractFloatingView {
|
||||
return (type & TYPE_DISCOVERY_BOUNCE) != 0;
|
||||
}
|
||||
|
||||
private void show(int containerType) {
|
||||
private void show() {
|
||||
mIsOpen = true;
|
||||
mLauncher.getDragLayer().addView(this);
|
||||
mLauncher.getUserEventDispatcher().logActionBounceTip(containerType);
|
||||
// TODO: add WW log for discovery bounce tip show event.
|
||||
}
|
||||
|
||||
public static void showForHomeIfNeeded(Launcher launcher) {
|
||||
@@ -146,7 +144,7 @@ public class DiscoveryBounce extends AbstractFloatingView {
|
||||
}
|
||||
onboardingPrefs.incrementEventCount(OnboardingPrefs.HOME_BOUNCE_COUNT);
|
||||
|
||||
new DiscoveryBounce(launcher, 0).show(HOTSEAT);
|
||||
new DiscoveryBounce(launcher, 0).show();
|
||||
}
|
||||
|
||||
public static void showForOverviewIfNeeded(Launcher launcher,
|
||||
@@ -179,7 +177,7 @@ public class DiscoveryBounce extends AbstractFloatingView {
|
||||
onboardingPrefs.incrementEventCount(OnboardingPrefs.SHELF_BOUNCE_COUNT);
|
||||
|
||||
new DiscoveryBounce(launcher, (1 - OVERVIEW.getVerticalProgress(launcher)))
|
||||
.show(PREDICTION);
|
||||
.show();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -73,9 +73,9 @@ public class PendingAnimation implements PropertySetter {
|
||||
addAnimationHoldersRecur(a, mDuration, springProperty, mAnimHolders);
|
||||
}
|
||||
|
||||
public void finish(boolean isSuccess, int logAction) {
|
||||
public void finish(boolean isSuccess) {
|
||||
for (Consumer<EndState> listeners : mEndListeners) {
|
||||
listeners.accept(new EndState(isSuccess, logAction));
|
||||
listeners.accept(new EndState(isSuccess));
|
||||
}
|
||||
mEndListeners.clear();
|
||||
}
|
||||
@@ -164,7 +164,7 @@ public class PendingAnimation implements PropertySetter {
|
||||
|
||||
/**
|
||||
* Add a listener of receiving the end state.
|
||||
* Note that the listeners are called as a result of calling {@link #finish(boolean, int)}
|
||||
* Note that the listeners are called as a result of calling {@link #finish(boolean)}
|
||||
* and not automatically
|
||||
*/
|
||||
public void addEndListener(Consumer<EndState> listener) {
|
||||
@@ -173,11 +173,9 @@ public class PendingAnimation implements PropertySetter {
|
||||
|
||||
public static class EndState {
|
||||
public boolean isSuccess;
|
||||
public int logAction;
|
||||
|
||||
public EndState(boolean isSuccess, int logAction) {
|
||||
public EndState(boolean isSuccess) {
|
||||
this.isSuccess = isSuccess;
|
||||
this.logAction = logAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,10 +16,11 @@
|
||||
|
||||
package com.android.launcher3.dragndrop;
|
||||
|
||||
import static com.android.launcher3.logging.LoggerUtils.newCommandAction;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newContainerTarget;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newItemTarget;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newLauncherEvent;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ADD_EXTERNAL_ITEM_BACK;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ADD_EXTERNAL_ITEM_CANCELLED;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ADD_EXTERNAL_ITEM_DRAGGED;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ADD_EXTERNAL_ITEM_PLACED_AUTOMATICALLY;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ADD_EXTERNAL_ITEM_START;
|
||||
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
@@ -49,11 +50,10 @@ import com.android.launcher3.LauncherAppState;
|
||||
import com.android.launcher3.LauncherAppWidgetHost;
|
||||
import com.android.launcher3.LauncherAppWidgetProviderInfo;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.model.ItemInstallQueue;
|
||||
import com.android.launcher3.model.WidgetItem;
|
||||
import com.android.launcher3.pm.PinRequestHelper;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
import com.android.launcher3.util.InstantAppResolver;
|
||||
import com.android.launcher3.views.BaseDragLayer;
|
||||
import com.android.launcher3.widget.PendingAddShortcutInfo;
|
||||
@@ -125,7 +125,7 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener
|
||||
// savedInstanceState is null when the activity is created the first time (i.e., avoids
|
||||
// duplicate logging during rotation)
|
||||
if (savedInstanceState == null) {
|
||||
logCommand(Action.Command.ENTRY);
|
||||
logCommand(LAUNCHER_ADD_EXTERNAL_ITEM_START);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,6 +178,7 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener
|
||||
startActivity(homeIntent,
|
||||
ActivityOptions.makeCustomAnimation(this, 0, android.R.anim.fade_out)
|
||||
.toBundle());
|
||||
logCommand(LAUNCHER_ADD_EXTERNAL_ITEM_DRAGGED);
|
||||
mFinishOnPause = true;
|
||||
return false;
|
||||
}
|
||||
@@ -240,7 +241,7 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener
|
||||
* Called when the cancel button is clicked.
|
||||
*/
|
||||
public void onCancelClick(View v) {
|
||||
logCommand(Action.Command.CANCEL);
|
||||
logCommand(LAUNCHER_ADD_EXTERNAL_ITEM_CANCELLED);
|
||||
finish();
|
||||
}
|
||||
|
||||
@@ -250,7 +251,7 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener
|
||||
public void onPlaceAutomaticallyClick(View v) {
|
||||
if (mRequest.getRequestType() == PinItemRequest.REQUEST_TYPE_SHORTCUT) {
|
||||
ItemInstallQueue.INSTANCE.get(this).queueItem(mRequest.getShortcutInfo());
|
||||
logCommand(Action.Command.CONFIRM);
|
||||
logCommand(LAUNCHER_ADD_EXTERNAL_ITEM_PLACED_AUTOMATICALLY);
|
||||
mRequest.accept();
|
||||
finish();
|
||||
return;
|
||||
@@ -274,13 +275,13 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener
|
||||
.queueItem(mRequest.getAppWidgetProviderInfo(this), widgetId);
|
||||
mWidgetOptions.putInt(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
|
||||
mRequest.accept(mWidgetOptions);
|
||||
logCommand(Action.Command.CONFIRM);
|
||||
logCommand(LAUNCHER_ADD_EXTERNAL_ITEM_PLACED_AUTOMATICALLY);
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
logCommand(Action.Command.BACK);
|
||||
logCommand(LAUNCHER_ADD_EXTERNAL_ITEM_BACK);
|
||||
super.onBackPressed();
|
||||
}
|
||||
|
||||
@@ -320,10 +321,7 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
private void logCommand(int command) {
|
||||
getUserEventDispatcher().dispatchUserEvent(newLauncherEvent(
|
||||
newCommandAction(command),
|
||||
newItemTarget(mWidgetCell.getWidgetView(), mInstantAppResolver),
|
||||
newContainerTarget(ContainerType.PINITEM)), null);
|
||||
private void logCommand(StatsLogManager.EventEnum command) {
|
||||
getStatsLogManager().logger().log(command);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -206,7 +206,6 @@ public class DragController implements DragDriver.EventListener, TouchController
|
||||
}
|
||||
|
||||
handleMoveEvent(mLastTouch.x, mLastTouch.y);
|
||||
mLauncher.getUserEventDispatcher().resetActionDurationMillis();
|
||||
|
||||
if (!mLauncher.isTouchInProgress() && options.simulatedDndStartPoint == null) {
|
||||
// If it is an internal drag and the touch is already complete, cancel immediately
|
||||
@@ -544,7 +543,6 @@ public class DragController implements DragDriver.EventListener, TouchController
|
||||
}
|
||||
}
|
||||
final View dropTargetAsView = dropTarget instanceof View ? (View) dropTarget : null;
|
||||
mLauncher.getUserEventDispatcher().logDragNDrop(mDragObject, dropTargetAsView);
|
||||
dispatchDropComplete(dropTargetAsView, accepted);
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY;
|
||||
import static com.android.launcher3.LauncherState.NORMAL;
|
||||
import static com.android.launcher3.compat.AccessibilityManagerCompat.sendCustomAccessibilityEvent;
|
||||
import static com.android.launcher3.config.FeatureFlags.ALWAYS_USE_HARDWARE_OPTIMIZATION_FOR_FOLDER_ANIMATIONS;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newContainerTarget;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_FOLDER_CONVERTED_TO_ICON;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_FOLDER_LABEL_UPDATED;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_DROP_COMPLETED;
|
||||
@@ -95,7 +94,6 @@ import com.android.launcher3.model.data.FolderInfo.FolderListener;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.model.data.WorkspaceItemInfo;
|
||||
import com.android.launcher3.pageindicators.PageIndicatorDots;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||
import com.android.launcher3.util.Executors;
|
||||
import com.android.launcher3.util.Thunk;
|
||||
import com.android.launcher3.views.ClipPathView;
|
||||
@@ -599,15 +597,6 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
|
||||
* is played.
|
||||
*/
|
||||
private void animateOpen(List<WorkspaceItemInfo> items, int pageNo) {
|
||||
animateOpen(items, pageNo, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens the user folder described by the specified tag. The opening of the folder
|
||||
* is animated relative to the specified View. If the View is null, no animation
|
||||
* is played.
|
||||
*/
|
||||
private void animateOpen(List<WorkspaceItemInfo> items, int pageNo, boolean skipUserEventLog) {
|
||||
Folder openFolder = getOpen(mLauncher);
|
||||
if (openFolder != null && openFolder != this) {
|
||||
// Close any open folder before opening a folder.
|
||||
@@ -657,14 +646,6 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
|
||||
mState = STATE_OPEN;
|
||||
announceAccessibilityChanges();
|
||||
|
||||
if (!skipUserEventLog) {
|
||||
mLauncher.getUserEventDispatcher().logActionOnItem(
|
||||
LauncherLogProto.Action.Touch.TAP,
|
||||
LauncherLogProto.Action.Direction.NONE,
|
||||
LauncherLogProto.ItemType.FOLDER_ICON, mInfo.cellX, mInfo.cellY);
|
||||
}
|
||||
|
||||
|
||||
mContent.setFocusOnFirstChild();
|
||||
}
|
||||
});
|
||||
@@ -1513,7 +1494,6 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
|
||||
}
|
||||
|
||||
statsLogger.log(LAUNCHER_FOLDER_LABEL_UPDATED);
|
||||
logFolderLabelState(mFromLabelState, toLabelState);
|
||||
mFolderName.dispatchBackKey();
|
||||
}
|
||||
}
|
||||
@@ -1644,8 +1624,7 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
mLauncher.getUserEventDispatcher().logActionTapOutside(
|
||||
newContainerTarget(LauncherLogProto.ContainerType.FOLDER));
|
||||
// TODO: add ww log if need to gather tap outside to close folder
|
||||
close(true);
|
||||
return true;
|
||||
}
|
||||
@@ -1680,17 +1659,6 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
|
||||
return mContent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs current folder label info.
|
||||
*
|
||||
* @deprecated This method is only used for log validation and soon will be removed.
|
||||
*/
|
||||
@Deprecated
|
||||
public void logFolderLabelState(FromState fromState, ToState toState) {
|
||||
mLauncher.getUserEventDispatcher()
|
||||
.logLauncherEvent(mInfo.getFolderLabelStateLauncherEvent(fromState, toState));
|
||||
}
|
||||
|
||||
/** Returns the height of the current folder's bottom edge from the bottom of the screen. */
|
||||
private int getHeightFromBottom() {
|
||||
DragLayer.LayoutParams layoutParams = (DragLayer.LayoutParams) getLayoutParams();
|
||||
|
||||
@@ -478,7 +478,6 @@ public class FolderIcon extends FrameLayout implements FolderListener, IconLabel
|
||||
// event is assumed to be folder creation on the server side.
|
||||
.withEditText(newTitle.toString())
|
||||
.log(LAUNCHER_FOLDER_AUTO_LABELED);
|
||||
mFolder.logFolderLabelState(fromState, ToState.TO_SUGGESTION0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,190 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016 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.launcher3.logging;
|
||||
|
||||
import android.util.ArrayMap;
|
||||
import android.util.SparseArray;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.launcher3.ButtonDropTarget;
|
||||
import com.android.launcher3.LauncherSettings;
|
||||
import com.android.launcher3.model.data.AppInfo;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogExtensions.TargetExtension;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ItemType;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
|
||||
import com.android.launcher3.util.InstantAppResolver;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Helper methods for logging.
|
||||
*/
|
||||
public class LoggerUtils {
|
||||
private static final ArrayMap<Class, SparseArray<String>> sNameCache = new ArrayMap<>();
|
||||
private static final String UNKNOWN = "UNKNOWN";
|
||||
private static final int DEFAULT_PREDICTED_RANK = 10000;
|
||||
private static final String DELIMITER_DOT = "\\.";
|
||||
|
||||
public static String getFieldName(int value, Class c) {
|
||||
SparseArray<String> cache;
|
||||
synchronized (sNameCache) {
|
||||
cache = sNameCache.get(c);
|
||||
if (cache == null) {
|
||||
cache = new SparseArray<>();
|
||||
for (Field f : c.getDeclaredFields()) {
|
||||
if (f.getType() == int.class && Modifier.isStatic(f.getModifiers())) {
|
||||
try {
|
||||
f.setAccessible(true);
|
||||
cache.put(f.getInt(null), f.getName());
|
||||
} catch (IllegalAccessException e) {
|
||||
// Ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
sNameCache.put(c, cache);
|
||||
}
|
||||
}
|
||||
String result = cache.get(value);
|
||||
return result != null ? result : UNKNOWN;
|
||||
}
|
||||
|
||||
public static Target newItemTarget(int itemType) {
|
||||
Target t = newTarget(Target.Type.ITEM);
|
||||
t.itemType = itemType;
|
||||
return t;
|
||||
}
|
||||
|
||||
public static Target newItemTarget(View v, InstantAppResolver instantAppResolver) {
|
||||
return (v != null) && (v.getTag() instanceof ItemInfo)
|
||||
? newItemTarget((ItemInfo) v.getTag(), instantAppResolver)
|
||||
: newTarget(Target.Type.ITEM);
|
||||
}
|
||||
|
||||
public static Target newItemTarget(ItemInfo info, InstantAppResolver instantAppResolver) {
|
||||
Target t = newTarget(Target.Type.ITEM);
|
||||
switch (info.itemType) {
|
||||
case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
|
||||
t.itemType = (instantAppResolver != null && info instanceof AppInfo
|
||||
&& instantAppResolver.isInstantApp(((AppInfo) info)))
|
||||
? ItemType.WEB_APP
|
||||
: ItemType.APP_ICON;
|
||||
t.predictedRank = DEFAULT_PREDICTED_RANK;
|
||||
break;
|
||||
case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
|
||||
t.itemType = ItemType.SHORTCUT;
|
||||
t.predictedRank = DEFAULT_PREDICTED_RANK;
|
||||
break;
|
||||
case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
|
||||
t.itemType = ItemType.FOLDER_ICON;
|
||||
break;
|
||||
case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
|
||||
t.itemType = ItemType.WIDGET;
|
||||
break;
|
||||
case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT:
|
||||
t.itemType = ItemType.DEEPSHORTCUT;
|
||||
t.predictedRank = DEFAULT_PREDICTED_RANK;
|
||||
break;
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
public static Target newDropTarget(View v) {
|
||||
if (!(v instanceof ButtonDropTarget)) {
|
||||
return newTarget(Target.Type.CONTAINER);
|
||||
}
|
||||
if (v instanceof ButtonDropTarget) {
|
||||
return ((ButtonDropTarget) v).getDropTargetForLogging();
|
||||
}
|
||||
return newTarget(Target.Type.CONTROL);
|
||||
}
|
||||
|
||||
public static Target newTarget(int targetType, TargetExtension extension) {
|
||||
Target t = new Target();
|
||||
t.type = targetType;
|
||||
t.extension = extension;
|
||||
return t;
|
||||
}
|
||||
|
||||
public static Target newTarget(int targetType) {
|
||||
Target t = new Target();
|
||||
t.type = targetType;
|
||||
return t;
|
||||
}
|
||||
|
||||
public static Target newControlTarget(int controlType) {
|
||||
Target t = newTarget(Target.Type.CONTROL);
|
||||
t.controlType = controlType;
|
||||
return t;
|
||||
}
|
||||
|
||||
public static Target newContainerTarget(int containerType) {
|
||||
Target t = newTarget(Target.Type.CONTAINER);
|
||||
t.containerType = containerType;
|
||||
return t;
|
||||
}
|
||||
|
||||
public static Action newAction(int type) {
|
||||
Action a = new Action();
|
||||
a.type = type;
|
||||
return a;
|
||||
}
|
||||
|
||||
public static Action newCommandAction(int command) {
|
||||
Action a = newAction(Action.Type.COMMAND);
|
||||
a.command = command;
|
||||
return a;
|
||||
}
|
||||
|
||||
public static Action newTouchAction(int touch) {
|
||||
Action a = newAction(Action.Type.TOUCH);
|
||||
a.touch = touch;
|
||||
return a;
|
||||
}
|
||||
|
||||
public static LauncherEvent newLauncherEvent(Action action, Target... srcTargets) {
|
||||
LauncherEvent event = new LauncherEvent();
|
||||
event.srcTarget = srcTargets;
|
||||
event.action = action;
|
||||
return event;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates LauncherEvent using Action and ArrayList of Targets
|
||||
*/
|
||||
public static LauncherEvent newLauncherEvent(Action action, ArrayList<Target> targets) {
|
||||
Target[] targetsArray = new Target[targets.size()];
|
||||
targets.toArray(targetsArray);
|
||||
return newLauncherEvent(action, targetsArray);
|
||||
}
|
||||
|
||||
/**
|
||||
* String conversion for only the helpful parts of {@link Object#toString()} method
|
||||
* @param stringToExtract "foo.bar.baz.MyObject@1234"
|
||||
* @return "MyObject@1234"
|
||||
*/
|
||||
public static String extractObjectNameAndAddress(String stringToExtract) {
|
||||
String[] superStringParts = stringToExtract.split(DELIMITER_DOT);
|
||||
if (superStringParts.length == 0) {
|
||||
return "";
|
||||
}
|
||||
return superStringParts[superStringParts.length - 1];
|
||||
}
|
||||
}
|
||||
@@ -27,7 +27,6 @@ import com.android.launcher3.logger.LauncherAtom.ContainerInfo;
|
||||
import com.android.launcher3.logger.LauncherAtom.FromState;
|
||||
import com.android.launcher3.logger.LauncherAtom.ToState;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.userevent.LauncherLogProto;
|
||||
import com.android.launcher3.util.ResourceBasedOverride;
|
||||
|
||||
import java.util.List;
|
||||
@@ -51,40 +50,22 @@ public class StatsLogManager implements ResourceBasedOverride {
|
||||
public static final int LAUNCHER_STATE_UNCHANGED = 5;
|
||||
|
||||
/**
|
||||
* Returns proper launcher state enum for {@link StatsLogManager}(to be removed during
|
||||
* UserEventDispatcher cleanup)
|
||||
*/
|
||||
public static int containerTypeToAtomState(int containerType) {
|
||||
switch (containerType) {
|
||||
case LauncherLogProto.ContainerType.ALLAPPS_VALUE:
|
||||
return LAUNCHER_STATE_ALLAPPS;
|
||||
case LauncherLogProto.ContainerType.OVERVIEW_VALUE:
|
||||
return LAUNCHER_STATE_OVERVIEW;
|
||||
case LauncherLogProto.ContainerType.WORKSPACE_VALUE:
|
||||
return LAUNCHER_STATE_HOME;
|
||||
case LauncherLogProto.ContainerType.APP_VALUE:
|
||||
return LAUNCHER_STATE_BACKGROUND;
|
||||
}
|
||||
return LAUNCHER_STATE_UNSPECIFIED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns event enum based on the two {@link ContainerType} transition information when swipe
|
||||
* Returns event enum based on the two state transition information when swipe
|
||||
* gesture happens(to be removed during UserEventDispatcher cleanup).
|
||||
*/
|
||||
public static EventEnum getLauncherAtomEvent(int startContainerType,
|
||||
int targetContainerType, EventEnum fallbackEvent) {
|
||||
if (startContainerType == LauncherLogProto.ContainerType.WORKSPACE.getNumber()
|
||||
&& targetContainerType == LauncherLogProto.ContainerType.WORKSPACE.getNumber()) {
|
||||
public static EventEnum getLauncherAtomEvent(int startState,
|
||||
int targetState, EventEnum fallbackEvent) {
|
||||
if (startState == LAUNCHER_STATE_HOME
|
||||
&& targetState == LAUNCHER_STATE_HOME) {
|
||||
return LAUNCHER_HOME_GESTURE;
|
||||
} else if (startContainerType != LauncherLogProto.ContainerType.TASKSWITCHER.getNumber()
|
||||
&& targetContainerType == LauncherLogProto.ContainerType.TASKSWITCHER.getNumber()) {
|
||||
} else if (startState != LAUNCHER_STATE_OVERVIEW
|
||||
&& targetState == LAUNCHER_STATE_OVERVIEW) {
|
||||
return LAUNCHER_OVERVIEW_GESTURE;
|
||||
} else if (startContainerType != LauncherLogProto.ContainerType.ALLAPPS.getNumber()
|
||||
&& targetContainerType == LauncherLogProto.ContainerType.ALLAPPS.getNumber()) {
|
||||
} else if (startState != LAUNCHER_STATE_ALLAPPS
|
||||
&& targetState == LAUNCHER_STATE_ALLAPPS) {
|
||||
return LAUNCHER_ALLAPPS_OPEN_UP;
|
||||
} else if (startContainerType == LauncherLogProto.ContainerType.ALLAPPS.getNumber()
|
||||
&& targetContainerType != LauncherLogProto.ContainerType.ALLAPPS.getNumber()) {
|
||||
} else if (startState == LAUNCHER_STATE_ALLAPPS
|
||||
&& targetState != LAUNCHER_STATE_ALLAPPS) {
|
||||
return LAUNCHER_ALLAPPS_CLOSE_DOWN;
|
||||
}
|
||||
return fallbackEvent; // TODO fix
|
||||
@@ -322,7 +303,38 @@ public class StatsLogManager implements ResourceBasedOverride {
|
||||
LAUNCHER_FOLDER_CONVERTED_TO_ICON(628),
|
||||
|
||||
@UiEvent(doc = "A hotseat prediction item was pinned")
|
||||
LAUNCHER_HOTSEAT_PREDICTION_PINNED(629);
|
||||
LAUNCHER_HOTSEAT_PREDICTION_PINNED(629),
|
||||
|
||||
@UiEvent(doc = "Activity to add external item was started")
|
||||
LAUNCHER_ADD_EXTERNAL_ITEM_START(641),
|
||||
|
||||
@UiEvent(doc = "Activity to add external item was cancelled")
|
||||
LAUNCHER_ADD_EXTERNAL_ITEM_CANCELLED(642),
|
||||
|
||||
@UiEvent(doc = "Activity to add external item was backed out")
|
||||
LAUNCHER_ADD_EXTERNAL_ITEM_BACK(643),
|
||||
|
||||
@UiEvent(doc = "Item was placed automatically in external item addition flow")
|
||||
LAUNCHER_ADD_EXTERNAL_ITEM_PLACED_AUTOMATICALLY(644),
|
||||
|
||||
@UiEvent(doc = "Item was dragged in external item addition flow")
|
||||
LAUNCHER_ADD_EXTERNAL_ITEM_DRAGGED(645),
|
||||
|
||||
@UiEvent(doc = "Undo event was tapped.")
|
||||
LAUNCHER_UNDO(648),
|
||||
|
||||
@UiEvent(doc = "Task switcher clear all target was tapped.")
|
||||
LAUNCHER_TASK_CLEAR_ALL(649),
|
||||
|
||||
@UiEvent(doc = "Task preview was long pressed.")
|
||||
LAUNCHER_TASK_PREVIEW_LONGPRESS(650),
|
||||
|
||||
@UiEvent(doc = "User swiped down on workspace (triggering noti shade to open).")
|
||||
LAUNCHER_SWIPE_DOWN_WORKSPACE_NOTISHADE_OPEN(651),
|
||||
|
||||
@UiEvent(doc = "Notification dismissed by swiping right.")
|
||||
LAUNCHER_NOTIFICATION_DISMISSED(652),
|
||||
;
|
||||
|
||||
// ADD MORE
|
||||
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
package com.android.launcher3.logging;
|
||||
|
||||
import android.view.View;
|
||||
import android.view.ViewParent;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class StatsLogUtils {
|
||||
private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5;
|
||||
|
||||
/**
|
||||
* Implemented by containers to provide a container source for a given child.
|
||||
*/
|
||||
public interface LogContainerProvider {
|
||||
|
||||
/**
|
||||
* Populates parent container targets for an item
|
||||
*/
|
||||
void fillInLogContainerData(ItemInfo childInfo, Target child, ArrayList<Target> parents);
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively finds the parent of the given child which implements IconLogInfoProvider
|
||||
*/
|
||||
public static LogContainerProvider getLaunchProviderRecursive(@Nullable View v) {
|
||||
ViewParent parent;
|
||||
if (v != null) {
|
||||
parent = v.getParent();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Optimization to only check up to 5 parents.
|
||||
int count = MAXIMUM_VIEW_HIERARCHY_LEVEL;
|
||||
while (parent != null && count-- > 0) {
|
||||
if (parent instanceof LogContainerProvider) {
|
||||
return (LogContainerProvider) parent;
|
||||
} else {
|
||||
parent = parent.getParent();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,373 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 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.launcher3.logging;
|
||||
|
||||
import static com.android.launcher3.logging.LoggerUtils.newAction;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newCommandAction;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newContainerTarget;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newDropTarget;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newItemTarget;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newLauncherEvent;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newTarget;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newTouchAction;
|
||||
import static com.android.launcher3.userevent.nano.LauncherLogProto.ItemType;
|
||||
import static com.android.launcher3.userevent.nano.LauncherLogProto.TipType;
|
||||
|
||||
import static java.util.Optional.ofNullable;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.SystemClock;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.DropTarget;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.logging.StatsLogUtils.LogContainerProvider;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.userevent.LauncherLogProto;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
|
||||
import com.android.launcher3.util.InstantAppResolver;
|
||||
import com.android.launcher3.util.LogConfig;
|
||||
import com.android.launcher3.util.ResourceBasedOverride;
|
||||
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
|
||||
import com.google.protobuf.nano.MessageNano;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Manages the creation of {@link LauncherEvent}.
|
||||
* To debug this class, execute following command before side loading a new apk.
|
||||
* <p>
|
||||
* $ adb shell setprop log.tag.UserEvent VERBOSE
|
||||
*/
|
||||
public class UserEventDispatcher implements ResourceBasedOverride {
|
||||
|
||||
private static final String TAG = "UserEvent";
|
||||
private static final boolean IS_VERBOSE = Utilities.isPropertyEnabled(LogConfig.USEREVENT);
|
||||
private static final String UUID_STORAGE = "uuid";
|
||||
|
||||
/**
|
||||
* A factory method for UserEventDispatcher
|
||||
*/
|
||||
public static UserEventDispatcher newInstance(Context context) {
|
||||
SharedPreferences sharedPrefs = Utilities.getDevicePrefs(context);
|
||||
String uuidStr = sharedPrefs.getString(UUID_STORAGE, null);
|
||||
if (uuidStr == null) {
|
||||
uuidStr = UUID.randomUUID().toString();
|
||||
sharedPrefs.edit().putString(UUID_STORAGE, uuidStr).apply();
|
||||
}
|
||||
UserEventDispatcher ued = Overrides.getObject(UserEventDispatcher.class,
|
||||
context.getApplicationContext(), R.string.user_event_dispatcher_class);
|
||||
ued.mUuidStr = uuidStr;
|
||||
ued.mInstantAppResolver = InstantAppResolver.newInstance(context);
|
||||
return ued;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fills in the container data on the given event if the given view is not null.
|
||||
*
|
||||
* @return whether container data was added.
|
||||
*/
|
||||
private boolean fillLogContainer(@Nullable View v, Target child,
|
||||
@Nullable ArrayList<Target> targets) {
|
||||
LogContainerProvider firstParent = StatsLogUtils.getLaunchProviderRecursive(v);
|
||||
if (v == null || !(v.getTag() instanceof ItemInfo) || firstParent == null) {
|
||||
return false;
|
||||
}
|
||||
final ItemInfo itemInfo = (ItemInfo) v.getTag();
|
||||
firstParent.fillInLogContainerData(itemInfo, child, targets);
|
||||
return true;
|
||||
}
|
||||
|
||||
protected void onFillInLogContainerData(@NonNull ItemInfo itemInfo, @NonNull Target target,
|
||||
@NonNull ArrayList<Target> targets) {
|
||||
}
|
||||
|
||||
private boolean mSessionStarted;
|
||||
private long mElapsedContainerMillis;
|
||||
private long mElapsedSessionMillis;
|
||||
private long mActionDurationMillis;
|
||||
private String mUuidStr;
|
||||
protected InstantAppResolver mInstantAppResolver;
|
||||
private boolean mAppOrTaskLaunch;
|
||||
private boolean mPreviousHomeGesture;
|
||||
|
||||
private void fillComponentInfo(Target target, ComponentName cn) {
|
||||
if (cn != null) {
|
||||
target.packageNameHash = (mUuidStr + cn.getPackageName()).hashCode();
|
||||
target.componentHash = (mUuidStr + cn.flattenToString()).hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
public void logActionCommand(int command, int srcContainerType, int dstContainerType) {
|
||||
logActionCommand(command, newContainerTarget(srcContainerType),
|
||||
dstContainerType >= 0 ? newContainerTarget(dstContainerType) : null);
|
||||
}
|
||||
|
||||
public void logActionCommand(int command, int srcContainerType, int dstContainerType,
|
||||
int pageIndex) {
|
||||
Target srcTarget = newContainerTarget(srcContainerType);
|
||||
srcTarget.pageIndex = pageIndex;
|
||||
logActionCommand(command, srcTarget,
|
||||
dstContainerType >= 0 ? newContainerTarget(dstContainerType) : null);
|
||||
}
|
||||
|
||||
public void logActionCommand(int command, Target srcTarget, Target dstTarget) {
|
||||
LauncherEvent event = newLauncherEvent(newCommandAction(command), srcTarget);
|
||||
if (command == Action.Command.STOP) {
|
||||
if (mAppOrTaskLaunch || !mSessionStarted) {
|
||||
mSessionStarted = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (dstTarget != null) {
|
||||
event.destTarget = new Target[1];
|
||||
event.destTarget[0] = dstTarget;
|
||||
event.action.isStateChange = true;
|
||||
}
|
||||
dispatchUserEvent(event, null);
|
||||
}
|
||||
|
||||
public void logActionOnControl(int action, int controlType) {
|
||||
logActionOnControl(action, controlType, null);
|
||||
}
|
||||
|
||||
public void logActionOnControl(int action, int controlType, int parentContainerType) {
|
||||
logActionOnControl(action, controlType, null, parentContainerType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs control action with proper parent hierarchy
|
||||
*/
|
||||
public void logActionOnControl(int actionType, int controlType,
|
||||
@Nullable View controlInContainer, int... parentTypes) {
|
||||
Target control = newTarget(Target.Type.CONTROL);
|
||||
control.controlType = controlType;
|
||||
Action action = newAction(actionType);
|
||||
|
||||
ArrayList<Target> targets = makeTargetsList(control);
|
||||
if (controlInContainer != null) {
|
||||
fillLogContainer(controlInContainer, control, targets);
|
||||
}
|
||||
for (int parentContainerType : parentTypes) {
|
||||
if (parentContainerType < 0) continue;
|
||||
targets.add(newContainerTarget(parentContainerType));
|
||||
}
|
||||
LauncherEvent event = newLauncherEvent(action, targets);
|
||||
if (actionType == Action.Touch.DRAGDROP) {
|
||||
event.actionDurationMillis = SystemClock.uptimeMillis() - mActionDurationMillis;
|
||||
}
|
||||
dispatchUserEvent(event, null);
|
||||
}
|
||||
|
||||
public void logActionTapOutside(Target target) {
|
||||
LauncherEvent event = newLauncherEvent(newTouchAction(Action.Type.TOUCH),
|
||||
target);
|
||||
event.action.isOutside = true;
|
||||
dispatchUserEvent(event, null);
|
||||
}
|
||||
|
||||
public void logActionBounceTip(int containerType) {
|
||||
LauncherEvent event = newLauncherEvent(newAction(Action.Type.TIP),
|
||||
newContainerTarget(containerType));
|
||||
event.srcTarget[0].tipType = TipType.BOUNCE;
|
||||
dispatchUserEvent(event, null);
|
||||
}
|
||||
|
||||
public void logActionOnContainer(int action, int dir, int containerType) {
|
||||
logActionOnContainer(action, dir, containerType, 0);
|
||||
}
|
||||
|
||||
public void logActionOnContainer(int action, int dir, int containerType, int pageIndex) {
|
||||
LauncherEvent event = newLauncherEvent(newTouchAction(action),
|
||||
newContainerTarget(containerType));
|
||||
event.action.dir = dir;
|
||||
event.srcTarget[0].pageIndex = pageIndex;
|
||||
dispatchUserEvent(event, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Used primarily for swipe up and down when state changes when swipe up happens from the
|
||||
* navbar bezel, the {@param srcChildContainerType} is NAVBAR and
|
||||
* {@param srcParentContainerType} is either one of the two
|
||||
* (1) WORKSPACE: if the launcher is the foreground activity
|
||||
* (2) APP: if another app was the foreground activity
|
||||
*/
|
||||
public void logStateChangeAction(int action, int dir, int downX, int downY,
|
||||
int srcChildTargetType, int srcParentContainerType, int dstContainerType,
|
||||
int pageIndex) {
|
||||
LauncherEvent event;
|
||||
if (srcChildTargetType == ItemType.TASK) {
|
||||
event = newLauncherEvent(newTouchAction(action),
|
||||
newItemTarget(srcChildTargetType),
|
||||
newContainerTarget(srcParentContainerType));
|
||||
} else {
|
||||
event = newLauncherEvent(newTouchAction(action),
|
||||
newContainerTarget(srcChildTargetType),
|
||||
newContainerTarget(srcParentContainerType));
|
||||
}
|
||||
event.destTarget = new Target[1];
|
||||
event.destTarget[0] = newContainerTarget(dstContainerType);
|
||||
event.action.dir = dir;
|
||||
event.action.isStateChange = true;
|
||||
event.srcTarget[0].pageIndex = pageIndex;
|
||||
event.srcTarget[0].spanX = downX;
|
||||
event.srcTarget[0].spanY = downY;
|
||||
dispatchUserEvent(event, null);
|
||||
}
|
||||
|
||||
public void logActionOnItem(int action, int dir, int itemType) {
|
||||
logActionOnItem(action, dir, itemType, null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new {@link LauncherEvent} of ITEM target type with input arguments and dispatches it.
|
||||
*
|
||||
* @param touchAction ENUM value of {@link LauncherLogProto.Action.Touch} Action
|
||||
* @param dir ENUM value of {@link LauncherLogProto.Action.Direction} Action
|
||||
* @param itemType ENUM value of {@link LauncherLogProto.ItemType}
|
||||
* @param gridX Nullable X coordinate of item's position on the workspace grid
|
||||
* @param gridY Nullable Y coordinate of item's position on the workspace grid
|
||||
*/
|
||||
public void logActionOnItem(int touchAction, int dir, int itemType,
|
||||
@Nullable Integer gridX, @Nullable Integer gridY) {
|
||||
Target itemTarget = newTarget(Target.Type.ITEM);
|
||||
itemTarget.itemType = itemType;
|
||||
ofNullable(gridX).ifPresent(value -> itemTarget.gridX = value);
|
||||
ofNullable(gridY).ifPresent(value -> itemTarget.gridY = value);
|
||||
LauncherEvent event = newLauncherEvent(newTouchAction(touchAction), itemTarget);
|
||||
event.action.dir = dir;
|
||||
dispatchUserEvent(event, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs proto lite version of LauncherEvent object to clearcut.
|
||||
*/
|
||||
public void logLauncherEvent(
|
||||
com.android.launcher3.userevent.LauncherLogProto.LauncherEvent launcherEvent) {
|
||||
|
||||
if (mPreviousHomeGesture) {
|
||||
mPreviousHomeGesture = false;
|
||||
}
|
||||
mAppOrTaskLaunch = false;
|
||||
launcherEvent.toBuilder()
|
||||
.setElapsedContainerMillis(SystemClock.uptimeMillis() - mElapsedContainerMillis)
|
||||
.setElapsedSessionMillis(
|
||||
SystemClock.uptimeMillis() - mElapsedSessionMillis).build();
|
||||
try {
|
||||
dispatchUserEvent(LauncherEvent.parseFrom(launcherEvent.toByteArray()), null);
|
||||
} catch (InvalidProtocolBufferNanoException e) {
|
||||
throw new RuntimeException("Cannot convert LauncherEvent from Lite to Nano version.");
|
||||
}
|
||||
}
|
||||
|
||||
public void logDeepShortcutsOpen(View icon) {
|
||||
ItemInfo info = (ItemInfo) icon.getTag();
|
||||
Target child = newItemTarget(info, mInstantAppResolver);
|
||||
ArrayList<Target> targets = makeTargetsList(child);
|
||||
fillLogContainer(icon, child, targets);
|
||||
dispatchUserEvent(newLauncherEvent(newTouchAction(Action.Touch.TAP), targets), null);
|
||||
}
|
||||
|
||||
public void logDragNDrop(DropTarget.DragObject dragObj, View dropTargetAsView) {
|
||||
Target srcChild = newItemTarget(dragObj.originalDragInfo, mInstantAppResolver);
|
||||
ArrayList<Target> srcTargets = makeTargetsList(srcChild);
|
||||
|
||||
|
||||
Target destChild = newItemTarget(dragObj.originalDragInfo, mInstantAppResolver);
|
||||
ArrayList<Target> destTargets = makeTargetsList(destChild);
|
||||
|
||||
//dragObj.dragSource.fillInLogContainerData(dragObj.originalDragInfo, srcChild, srcTargets);
|
||||
if (dropTargetAsView instanceof LogContainerProvider) {
|
||||
((LogContainerProvider) dropTargetAsView).fillInLogContainerData(dragObj.dragInfo,
|
||||
destChild, destTargets);
|
||||
}
|
||||
else {
|
||||
destTargets.add(newDropTarget(dropTargetAsView));
|
||||
}
|
||||
LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.DRAGDROP), srcTargets);
|
||||
Target[] destTargetsArray = new Target[destTargets.size()];
|
||||
destTargets.toArray(destTargetsArray);
|
||||
event.destTarget = destTargetsArray;
|
||||
|
||||
event.actionDurationMillis = SystemClock.uptimeMillis() - mActionDurationMillis;
|
||||
dispatchUserEvent(event, null);
|
||||
}
|
||||
|
||||
public final void startSession() {
|
||||
mSessionStarted = true;
|
||||
mElapsedSessionMillis = SystemClock.uptimeMillis();
|
||||
mElapsedContainerMillis = SystemClock.uptimeMillis();
|
||||
}
|
||||
|
||||
public final void setPreviousHomeGesture(boolean homeGesture) {
|
||||
mPreviousHomeGesture = homeGesture;
|
||||
}
|
||||
|
||||
public final boolean isPreviousHomeGesture() {
|
||||
return mPreviousHomeGesture;
|
||||
}
|
||||
|
||||
public final void resetActionDurationMillis() {
|
||||
mActionDurationMillis = SystemClock.uptimeMillis();
|
||||
}
|
||||
|
||||
public void dispatchUserEvent(LauncherEvent ev, Intent intent) {
|
||||
if (mPreviousHomeGesture) {
|
||||
mPreviousHomeGesture = false;
|
||||
}
|
||||
mAppOrTaskLaunch = false;
|
||||
ev.elapsedContainerMillis = SystemClock.uptimeMillis() - mElapsedContainerMillis;
|
||||
ev.elapsedSessionMillis = SystemClock.uptimeMillis() - mElapsedSessionMillis;
|
||||
if (!IS_VERBOSE) {
|
||||
return;
|
||||
}
|
||||
LauncherLogProto.LauncherEvent liteLauncherEvent;
|
||||
try {
|
||||
liteLauncherEvent =
|
||||
LauncherLogProto.LauncherEvent.parseFrom(MessageNano.toByteArray(ev));
|
||||
} catch (InvalidProtocolBufferException e) {
|
||||
throw new RuntimeException("Cannot parse LauncherEvent from Nano to Lite version");
|
||||
}
|
||||
Log.d(TAG, liteLauncherEvent.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an ArrayList with targets
|
||||
*/
|
||||
public static ArrayList<Target> makeTargetsList(Target... targets) {
|
||||
ArrayList<Target> result = new ArrayList<>();
|
||||
for (Target target : targets) {
|
||||
result.add(target);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -20,15 +20,9 @@ import static android.text.TextUtils.isEmpty;
|
||||
|
||||
import static androidx.core.util.Preconditions.checkNotNull;
|
||||
|
||||
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP;
|
||||
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT;
|
||||
import static com.android.launcher3.logger.LauncherAtom.Attribute.EMPTY_LABEL;
|
||||
import static com.android.launcher3.logger.LauncherAtom.Attribute.MANUAL_LABEL;
|
||||
import static com.android.launcher3.logger.LauncherAtom.Attribute.SUGGESTED_LABEL;
|
||||
import static com.android.launcher3.userevent.LauncherLogProto.Target.FromFolderLabelState.FROM_CUSTOM;
|
||||
import static com.android.launcher3.userevent.LauncherLogProto.Target.FromFolderLabelState.FROM_EMPTY;
|
||||
import static com.android.launcher3.userevent.LauncherLogProto.Target.FromFolderLabelState.FROM_FOLDER_LABEL_STATE_UNSPECIFIED;
|
||||
import static com.android.launcher3.userevent.LauncherLogProto.Target.FromFolderLabelState.FROM_SUGGESTED;
|
||||
|
||||
import android.os.Process;
|
||||
|
||||
@@ -43,10 +37,6 @@ import com.android.launcher3.logger.LauncherAtom.Attribute;
|
||||
import com.android.launcher3.logger.LauncherAtom.FromState;
|
||||
import com.android.launcher3.logger.LauncherAtom.ToState;
|
||||
import com.android.launcher3.model.ModelWriter;
|
||||
import com.android.launcher3.userevent.LauncherLogProto;
|
||||
import com.android.launcher3.userevent.LauncherLogProto.Target;
|
||||
import com.android.launcher3.userevent.LauncherLogProto.Target.FromFolderLabelState;
|
||||
import com.android.launcher3.userevent.LauncherLogProto.Target.ToFolderLabelState;
|
||||
import com.android.launcher3.util.ContentWriter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -359,113 +349,4 @@ public class FolderInfo extends ItemInfo {
|
||||
}
|
||||
return LauncherAtom.ToState.TO_STATE_UNSPECIFIED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@link LauncherLogProto.LauncherEvent} to log current folder label info.
|
||||
*
|
||||
* @deprecated This method is used only for validation purpose and soon will be removed.
|
||||
*/
|
||||
@Deprecated
|
||||
public LauncherLogProto.LauncherEvent getFolderLabelStateLauncherEvent(FromState fromState,
|
||||
ToState toState) {
|
||||
return LauncherLogProto.LauncherEvent.newBuilder()
|
||||
.setAction(LauncherLogProto.Action
|
||||
.newBuilder()
|
||||
.setType(LauncherLogProto.Action.Type.SOFT_KEYBOARD))
|
||||
.addSrcTarget(Target
|
||||
.newBuilder()
|
||||
.setType(Target.Type.ITEM)
|
||||
.setItemType(LauncherLogProto.ItemType.EDITTEXT)
|
||||
.setFromFolderLabelState(convertFolderLabelState(fromState))
|
||||
.setToFolderLabelState(convertFolderLabelState(toState)))
|
||||
.addSrcTarget(Target.newBuilder()
|
||||
.setType(Target.Type.CONTAINER)
|
||||
.setContainerType(LauncherLogProto.ContainerType.FOLDER)
|
||||
.setPageIndex(screenId)
|
||||
.setGridX(cellX)
|
||||
.setGridY(cellY)
|
||||
.setCardinality(contents.size()))
|
||||
.addSrcTarget(newParentContainerTarget())
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated This method is used only for validation purpose and soon will be removed.
|
||||
*/
|
||||
@Deprecated
|
||||
private Target.Builder newParentContainerTarget() {
|
||||
Target.Builder builder = Target.newBuilder().setType(Target.Type.CONTAINER);
|
||||
switch (container) {
|
||||
case CONTAINER_HOTSEAT:
|
||||
return builder.setContainerType(LauncherLogProto.ContainerType.HOTSEAT);
|
||||
case CONTAINER_DESKTOP:
|
||||
return builder.setContainerType(LauncherLogProto.ContainerType.WORKSPACE);
|
||||
default:
|
||||
throw new AssertionError(String
|
||||
.format("Expected container to be either %s or %s but found %s.",
|
||||
CONTAINER_HOTSEAT,
|
||||
CONTAINER_DESKTOP,
|
||||
container));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated This method is used only for validation purpose and soon will be removed.
|
||||
*/
|
||||
@Deprecated
|
||||
private static FromFolderLabelState convertFolderLabelState(FromState fromState) {
|
||||
switch (fromState) {
|
||||
case FROM_EMPTY:
|
||||
return FROM_EMPTY;
|
||||
case FROM_SUGGESTED:
|
||||
return FROM_SUGGESTED;
|
||||
case FROM_CUSTOM:
|
||||
return FROM_CUSTOM;
|
||||
default:
|
||||
return FROM_FOLDER_LABEL_STATE_UNSPECIFIED;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated This method is used only for validation purpose and soon will be removed.
|
||||
*/
|
||||
@Deprecated
|
||||
private static ToFolderLabelState convertFolderLabelState(ToState toState) {
|
||||
switch (toState) {
|
||||
case UNCHANGED:
|
||||
return ToFolderLabelState.UNCHANGED;
|
||||
case TO_SUGGESTION0:
|
||||
return ToFolderLabelState.TO_SUGGESTION0_WITH_VALID_PRIMARY;
|
||||
case TO_SUGGESTION1_WITH_VALID_PRIMARY:
|
||||
return ToFolderLabelState.TO_SUGGESTION1_WITH_VALID_PRIMARY;
|
||||
case TO_SUGGESTION1_WITH_EMPTY_PRIMARY:
|
||||
return ToFolderLabelState.TO_SUGGESTION1_WITH_EMPTY_PRIMARY;
|
||||
case TO_SUGGESTION2_WITH_VALID_PRIMARY:
|
||||
return ToFolderLabelState.TO_SUGGESTION2_WITH_VALID_PRIMARY;
|
||||
case TO_SUGGESTION2_WITH_EMPTY_PRIMARY:
|
||||
return ToFolderLabelState.TO_SUGGESTION2_WITH_EMPTY_PRIMARY;
|
||||
case TO_SUGGESTION3_WITH_VALID_PRIMARY:
|
||||
return ToFolderLabelState.TO_SUGGESTION3_WITH_VALID_PRIMARY;
|
||||
case TO_SUGGESTION3_WITH_EMPTY_PRIMARY:
|
||||
return ToFolderLabelState.TO_SUGGESTION3_WITH_EMPTY_PRIMARY;
|
||||
case TO_EMPTY_WITH_VALID_PRIMARY:
|
||||
return ToFolderLabelState.TO_EMPTY_WITH_VALID_PRIMARY;
|
||||
case TO_EMPTY_WITH_VALID_SUGGESTIONS_AND_EMPTY_PRIMARY:
|
||||
return ToFolderLabelState.TO_EMPTY_WITH_VALID_SUGGESTIONS_AND_EMPTY_PRIMARY;
|
||||
case TO_EMPTY_WITH_EMPTY_SUGGESTIONS:
|
||||
return ToFolderLabelState.TO_EMPTY_WITH_EMPTY_SUGGESTIONS;
|
||||
case TO_EMPTY_WITH_SUGGESTIONS_DISABLED:
|
||||
return ToFolderLabelState.TO_EMPTY_WITH_SUGGESTIONS_DISABLED;
|
||||
case TO_CUSTOM_WITH_VALID_PRIMARY:
|
||||
return ToFolderLabelState.TO_CUSTOM_WITH_VALID_PRIMARY;
|
||||
case TO_CUSTOM_WITH_VALID_SUGGESTIONS_AND_EMPTY_PRIMARY:
|
||||
return ToFolderLabelState.TO_CUSTOM_WITH_VALID_SUGGESTIONS_AND_EMPTY_PRIMARY;
|
||||
case TO_CUSTOM_WITH_EMPTY_SUGGESTIONS:
|
||||
return ToFolderLabelState.TO_CUSTOM_WITH_EMPTY_SUGGESTIONS;
|
||||
case TO_CUSTOM_WITH_SUGGESTIONS_DISABLED:
|
||||
return ToFolderLabelState.TO_CUSTOM_WITH_SUGGESTIONS_DISABLED;
|
||||
default:
|
||||
return ToFolderLabelState.TO_FOLDER_LABEL_STATE_UNSPECIFIED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package com.android.launcher3.notification;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelocity;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NOTIFICATION_DISMISSED;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.ObjectAnimator;
|
||||
@@ -41,7 +42,6 @@ import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.touch.BaseSwipeDetector;
|
||||
import com.android.launcher3.touch.OverScroll;
|
||||
import com.android.launcher3.touch.SingleAxisSwipeDetector;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||
import com.android.launcher3.util.Themes;
|
||||
|
||||
/**
|
||||
@@ -168,10 +168,7 @@ public class NotificationMainView extends FrameLayout implements SingleAxisSwipe
|
||||
Launcher launcher = Launcher.getLauncher(getContext());
|
||||
launcher.getPopupDataProvider().cancelNotification(
|
||||
mNotificationInfo.notificationKey);
|
||||
launcher.getUserEventDispatcher().logActionOnItem(
|
||||
LauncherLogProto.Action.Touch.SWIPE,
|
||||
LauncherLogProto.Action.Direction.RIGHT, // Assume all swipes are right for logging.
|
||||
LauncherLogProto.ItemType.NOTIFICATION);
|
||||
launcher.getStatsLogManager().logger().log(LAUNCHER_NOTIFICATION_DISMISSED);
|
||||
}
|
||||
|
||||
// SingleAxisSwipeDetector.Listener's
|
||||
|
||||
@@ -19,10 +19,8 @@ package com.android.launcher3.popup;
|
||||
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_SHORTCUTS;
|
||||
import static com.android.launcher3.Utilities.squaredHypot;
|
||||
import static com.android.launcher3.Utilities.squaredTouchSlop;
|
||||
import static com.android.launcher3.logging.LoggerUtils.newContainerTarget;
|
||||
import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS;
|
||||
import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS_IF_NOTIFICATIONS;
|
||||
import static com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
|
||||
|
||||
import android.animation.AnimatorSet;
|
||||
@@ -160,8 +158,7 @@ public class PopupContainerWithArrow<T extends BaseDraggingActivity> extends Arr
|
||||
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
BaseDragLayer dl = getPopupContainer();
|
||||
if (!dl.isEventOverView(this, ev)) {
|
||||
mLauncher.getUserEventDispatcher().logActionTapOutside(
|
||||
newContainerTarget(ContainerType.DEEPSHORTCUTS));
|
||||
// TODO: add WW log if want to log if tap closed deep shortcut container.
|
||||
close(true);
|
||||
|
||||
// We let touches on the original icon go through so that users can launch
|
||||
@@ -435,7 +432,9 @@ public class PopupContainerWithArrow<T extends BaseDraggingActivity> extends Arr
|
||||
// Make sure we keep the original icon hidden while it is being dragged.
|
||||
mOriginalIcon.setVisibility(INVISIBLE);
|
||||
} else {
|
||||
mLauncher.getUserEventDispatcher().logDeepShortcutsOpen(mOriginalIcon);
|
||||
// TODO: add WW logging if want to add logging for long press on popup
|
||||
// container.
|
||||
// mLauncher.getUserEventDispatcher().logDeepShortcutsOpen(mOriginalIcon);
|
||||
if (!mIsAboveIcon) {
|
||||
// Show the icon but keep the text hidden.
|
||||
mOriginalIcon.setVisibility(VISIBLE);
|
||||
|
||||
@@ -37,7 +37,6 @@ import com.android.launcher3.BaseDraggingActivity;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto;
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.Q)
|
||||
public class RemoteActionShortcut extends SystemShortcut<BaseDraggingActivity> {
|
||||
@@ -107,9 +106,6 @@ public class RemoteActionShortcut extends SystemShortcut<BaseDraggingActivity> {
|
||||
Toast.LENGTH_SHORT)
|
||||
.show();
|
||||
}
|
||||
|
||||
mTarget.getUserEventDispatcher().logActionOnControl(LauncherLogProto.Action.Touch.TAP,
|
||||
LauncherLogProto.ControlType.REMOTE_ACTION_SHORTCUT, view);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -21,8 +21,6 @@ import com.android.launcher3.R;
|
||||
import com.android.launcher3.model.WidgetItem;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.model.data.WorkspaceItemInfo;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
|
||||
import com.android.launcher3.util.InstantAppResolver;
|
||||
import com.android.launcher3.util.PackageManagerHelper;
|
||||
import com.android.launcher3.util.PackageUserKey;
|
||||
@@ -117,8 +115,6 @@ public abstract class SystemShortcut<T extends BaseDraggingActivity> extends Ite
|
||||
(WidgetsBottomSheet) mTarget.getLayoutInflater().inflate(
|
||||
R.layout.widgets_bottom_sheet, mTarget.getDragLayer(), false);
|
||||
widgetsBottomSheet.populateAndShow(mItemInfo);
|
||||
mTarget.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP,
|
||||
ControlType.WIDGETS_BUTTON, view);
|
||||
mTarget.getStatsLogManager().logger().withItemInfo(mItemInfo)
|
||||
.log(LAUNCHER_SYSTEM_SHORTCUT_WIDGETS_TAP);
|
||||
}
|
||||
@@ -139,8 +135,6 @@ public abstract class SystemShortcut<T extends BaseDraggingActivity> extends Ite
|
||||
Rect sourceBounds = mTarget.getViewBounds(view);
|
||||
new PackageManagerHelper(mTarget).startDetailsActivityForInfo(
|
||||
mItemInfo, sourceBounds, ActivityOptions.makeBasic().toBundle());
|
||||
mTarget.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP,
|
||||
ControlType.APPINFO_TARGET, view);
|
||||
mTarget.getStatsLogManager().logger().withItemInfo(mItemInfo)
|
||||
.log(LAUNCHER_SYSTEM_SHORTCUT_APP_INFO_TAP);
|
||||
}
|
||||
|
||||
@@ -15,11 +15,12 @@
|
||||
*/
|
||||
package com.android.launcher3.states;
|
||||
|
||||
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
|
||||
/**
|
||||
* Scale down workspace/hotseat to hint at going to either overview (on pause) or first home screen.
|
||||
@@ -30,7 +31,7 @@ public class HintState extends LauncherState {
|
||||
| FLAG_HAS_SYS_UI_SCRIM;
|
||||
|
||||
public HintState(int id) {
|
||||
super(id, ContainerType.DEFAULT_CONTAINERTYPE, STATE_FLAGS);
|
||||
super(id, LAUNCHER_STATE_HOME, STATE_FLAGS);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.android.launcher3.states;
|
||||
|
||||
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
|
||||
@@ -22,7 +24,6 @@ import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.Workspace;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
|
||||
/**
|
||||
* Definition for spring loaded state used during drag and drop.
|
||||
@@ -35,7 +36,7 @@ public class SpringLoadedState extends LauncherState {
|
||||
| FLAG_HIDE_BACK_BUTTON;
|
||||
|
||||
public SpringLoadedState(int id) {
|
||||
super(id, ContainerType.WORKSPACE, STATE_FLAGS);
|
||||
super(id, LAUNCHER_STATE_HOME, STATE_FLAGS);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -21,6 +21,9 @@ import static com.android.launcher3.LauncherState.NORMAL;
|
||||
import static com.android.launcher3.LauncherState.OVERVIEW;
|
||||
import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelocity;
|
||||
import static com.android.launcher3.config.FeatureFlags.UNSTABLE_SPRINGS;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_ALLAPPS;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_UNKNOWN_SWIPEDOWN;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_UNKNOWN_SWIPEUP;
|
||||
import static com.android.launcher3.states.StateAnimationConfig.ANIM_ALL_COMPONENTS;
|
||||
@@ -52,9 +55,6 @@ import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.states.StateAnimationConfig;
|
||||
import com.android.launcher3.states.StateAnimationConfig.AnimationFlags;
|
||||
import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
import com.android.launcher3.util.FlingBlockCheck;
|
||||
import com.android.launcher3.util.TouchController;
|
||||
|
||||
@@ -190,11 +190,6 @@ public abstract class AbstractStateChangeTouchController
|
||||
|
||||
protected abstract float initCurrentAnimation(@AnimationFlags int animComponents);
|
||||
|
||||
/**
|
||||
* Returns the container that the touch started from when leaving NORMAL state.
|
||||
*/
|
||||
protected abstract int getLogContainerTypeForNormalState(MotionEvent ev);
|
||||
|
||||
private boolean reinitCurrentAnimation(boolean reachedToState, boolean isDragTowardPositive) {
|
||||
LauncherState newFromState = mFromState == null ? mLauncher.getStateManager().getState()
|
||||
: reachedToState ? mToState : mFromState;
|
||||
@@ -307,11 +302,11 @@ public abstract class AbstractStateChangeTouchController
|
||||
public boolean onDrag(float displacement, MotionEvent ev) {
|
||||
if (!mIsLogContainerSet) {
|
||||
if (mStartState == ALL_APPS) {
|
||||
mStartContainerType = ContainerType.ALLAPPS;
|
||||
mStartContainerType = LAUNCHER_STATE_ALLAPPS;
|
||||
} else if (mStartState == NORMAL) {
|
||||
mStartContainerType = getLogContainerTypeForNormalState(ev);
|
||||
mStartContainerType = LAUNCHER_STATE_HOME;
|
||||
} else if (mStartState == OVERVIEW) {
|
||||
mStartContainerType = ContainerType.TASKSWITCHER;
|
||||
mStartContainerType = LAUNCHER_STATE_OVERVIEW;
|
||||
}
|
||||
mIsLogContainerSet = true;
|
||||
}
|
||||
@@ -401,7 +396,6 @@ public abstract class AbstractStateChangeTouchController
|
||||
@Override
|
||||
public void onDragEnd(float velocity) {
|
||||
boolean fling = mDetector.isFling(velocity);
|
||||
final int logAction = fling ? Touch.FLING : Touch.SWIPE;
|
||||
|
||||
boolean blockedFling = fling && mFlingBlockCheck.isBlocked();
|
||||
if (blockedFling) {
|
||||
@@ -458,7 +452,7 @@ public abstract class AbstractStateChangeTouchController
|
||||
}
|
||||
}
|
||||
|
||||
mCurrentAnimation.setEndAction(() -> onSwipeInteractionCompleted(targetState, logAction));
|
||||
mCurrentAnimation.setEndAction(() -> onSwipeInteractionCompleted(targetState));
|
||||
ValueAnimator anim = mCurrentAnimation.getAnimationPlayer();
|
||||
anim.setFloatValues(startProgress, endProgress);
|
||||
maybeUpdateAtomicAnim(mFromState, targetState, targetState == mToState ? 1f : 0f);
|
||||
@@ -522,11 +516,7 @@ public abstract class AbstractStateChangeTouchController
|
||||
.setInterpolator(scrollInterpolatorForVelocity(velocity));
|
||||
}
|
||||
|
||||
protected int getDirectionForLog() {
|
||||
return mToState.ordinal > mFromState.ordinal ? Direction.UP : Direction.DOWN;
|
||||
}
|
||||
|
||||
protected void onSwipeInteractionCompleted(LauncherState targetState, int logAction) {
|
||||
protected void onSwipeInteractionCompleted(LauncherState targetState) {
|
||||
if (mAtomicComponentsController != null) {
|
||||
mAtomicComponentsController.getAnimationPlayer().end();
|
||||
mAtomicComponentsController = null;
|
||||
@@ -535,18 +525,18 @@ public abstract class AbstractStateChangeTouchController
|
||||
boolean shouldGoToTargetState = true;
|
||||
if (mPendingAnimation != null) {
|
||||
boolean reachedTarget = mToState == targetState;
|
||||
mPendingAnimation.finish(reachedTarget, logAction);
|
||||
mPendingAnimation.finish(reachedTarget);
|
||||
mPendingAnimation = null;
|
||||
shouldGoToTargetState = !reachedTarget;
|
||||
}
|
||||
if (shouldGoToTargetState) {
|
||||
goToTargetState(targetState, logAction);
|
||||
goToTargetState(targetState);
|
||||
}
|
||||
}
|
||||
|
||||
protected void goToTargetState(LauncherState targetState, int logAction) {
|
||||
protected void goToTargetState(LauncherState targetState) {
|
||||
if (targetState != mStartState) {
|
||||
logReachedState(logAction, targetState);
|
||||
logReachedState(targetState);
|
||||
}
|
||||
if (!mLauncher.isInState(targetState)) {
|
||||
// If we're already in the target state, don't jump to it at the end of the animation in
|
||||
@@ -556,24 +546,18 @@ public abstract class AbstractStateChangeTouchController
|
||||
mLauncher.getDragLayer().getScrim().createSysuiMultiplierAnim(1f).setDuration(0).start();
|
||||
}
|
||||
|
||||
private void logReachedState(int logAction, LauncherState targetState) {
|
||||
private void logReachedState(LauncherState targetState) {
|
||||
// Transition complete. log the action
|
||||
mLauncher.getUserEventDispatcher().logStateChangeAction(logAction,
|
||||
getDirectionForLog(), mDetector.getDownX(), mDetector.getDownY(),
|
||||
mStartContainerType /* e.g., hotseat */,
|
||||
mStartState.containerType /* e.g., workspace */,
|
||||
targetState.containerType,
|
||||
mLauncher.getWorkspace().getCurrentPage());
|
||||
mLauncher.getStatsLogManager().logger()
|
||||
.withSrcState(StatsLogManager.containerTypeToAtomState(mStartState.containerType))
|
||||
.withDstState(StatsLogManager.containerTypeToAtomState(targetState.containerType))
|
||||
.withSrcState(mStartState.statsLogOrdinal)
|
||||
.withDstState(targetState.statsLogOrdinal)
|
||||
.withContainerInfo(LauncherAtom.ContainerInfo.newBuilder()
|
||||
.setWorkspace(
|
||||
LauncherAtom.WorkspaceContainer.newBuilder()
|
||||
.setPageIndex(mLauncher.getWorkspace().getCurrentPage()))
|
||||
.build())
|
||||
.log(StatsLogManager.getLauncherAtomEvent(mStartState.containerType,
|
||||
targetState.containerType, mToState.ordinal > mFromState.ordinal
|
||||
.log(StatsLogManager.getLauncherAtomEvent(mStartState.statsLogOrdinal,
|
||||
targetState.statsLogOrdinal, mToState.ordinal > mFromState.ordinal
|
||||
? LAUNCHER_UNKNOWN_SWIPEUP
|
||||
: LAUNCHER_UNKNOWN_SWIPEDOWN));
|
||||
}
|
||||
|
||||
@@ -24,7 +24,6 @@ import com.android.launcher3.AbstractFloatingView;
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.states.StateAnimationConfig.AnimationFlags;
|
||||
import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
|
||||
|
||||
/**
|
||||
* TouchController to switch between NORMAL and ALL_APPS state.
|
||||
@@ -69,12 +68,6 @@ public class AllAppsSwipeController extends AbstractStateChangeTouchController {
|
||||
return fromState;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLogContainerTypeForNormalState(MotionEvent ev) {
|
||||
return mLauncher.getDragLayer().isEventOverView(mLauncher.getHotseat(), mTouchDownEvent)
|
||||
? ContainerType.HOTSEAT : ContainerType.WORKSPACE;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float initCurrentAnimation(@AnimationFlags int animComponents) {
|
||||
float range = getShiftRange();
|
||||
|
||||
Reference in New Issue
Block a user