1ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song/*
2ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song * Copyright (C) 2012 The Android Open Source Project
3ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song *
4ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song * Licensed under the Apache License, Version 2.0 (the "License");
5ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song * you may not use this file except in compliance with the License.
6ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song * You may obtain a copy of the License at
7ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song *
8ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song *      http://www.apache.org/licenses/LICENSE-2.0
9ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song *
10ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song * Unless required by applicable law or agreed to in writing, software
11ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song * distributed under the License is distributed on an "AS IS" BASIS,
12ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song * See the License for the specific language governing permissions and
14ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song * limitations under the License.
15ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song */
16ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song
17a9c69ce09c164c8ad0191e05318460d0955825a7Hyunyoung Songpackage com.android.launcher3.logging;
18a9c69ce09c164c8ad0191e05318460d0955825a7Hyunyoung Song
196470cf449f1caf6a030e7ea93e785bb6ba414a59Hyunyoung Songimport android.content.ComponentName;
20ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Songimport android.content.Intent;
2159a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Songimport android.os.SystemClock;
2264976d5a5667f52ed3fe4346ea5ab910dcc2dc2dSunny Goyalimport android.util.Log;
23ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Songimport android.view.View;
24ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Songimport android.view.ViewParent;
258fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song
2659a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Songimport com.android.launcher3.DropTarget;
27ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Songimport com.android.launcher3.ItemInfo;
2859a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Songimport com.android.launcher3.Utilities;
2959a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Songimport com.android.launcher3.config.ProviderConfig;
3046ab2276f97518e9ba71e4bf3109b8ebd924cbabSunny Goyalimport com.android.launcher3.userevent.nano.LauncherLogProto.Action;
31ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Songimport com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent;
32ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Songimport com.android.launcher3.userevent.nano.LauncherLogProto.Target;
33ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Songimport com.android.launcher3.util.ComponentKey;
34ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song
35ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Songimport java.util.List;
3664976d5a5667f52ed3fe4346ea5ab910dcc2dc2dSunny Goyalimport java.util.Locale;
378fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song
38aa953654279d7cca29682d85111e398ea1f20390Hyunyoung Song/**
39aa953654279d7cca29682d85111e398ea1f20390Hyunyoung Song * Manages the creation of {@link LauncherEvent}.
40ffad962092e2b42e336918c2f1e8f5ec48cc08a9Hyunyoung Song * To debug this class, execute following command before sideloading a new apk.
41ffad962092e2b42e336918c2f1e8f5ec48cc08a9Hyunyoung Song *
42ffad962092e2b42e336918c2f1e8f5ec48cc08a9Hyunyoung Song * $ adb shell setprop log.tag.UserEvent VERBOSE
43aa953654279d7cca29682d85111e398ea1f20390Hyunyoung Song */
4464976d5a5667f52ed3fe4346ea5ab910dcc2dc2dSunny Goyalpublic class UserEventDispatcher {
4564976d5a5667f52ed3fe4346ea5ab910dcc2dc2dSunny Goyal
46ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5;
475aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song
4859a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song    private final boolean mIsVerbose;
4959a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song
50ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    /**
5159a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song     * TODO: change the name of this interface to LogContainerProvider
5259a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song     * and the method name to fillInLogContainerData. Not changed to minimize CL diff
5359a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song     * in this branch.
5459a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song     *
55ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song     * Implemented by containers to provide a launch source for a given child.
56ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song     */
57ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    public interface LaunchSourceProvider {
58ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song
59ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        /**
60ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song         * Copies data from the source to the destination proto.
615aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song         *
625aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song         * @param v            source of the data
635aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song         * @param info         source of the data
645aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song         * @param target       dest of the data
655aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song         * @param targetParent dest of the data
66ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song         */
67ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent);
68ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    }
69ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song
70ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    /**
71ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song     * Recursively finds the parent of the given child which implements IconLogInfoProvider
72ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song     */
73ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    public static LaunchSourceProvider getLaunchProviderRecursive(View v) {
74ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        ViewParent parent = null;
7559a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song
76ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        if (v != null) {
77ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song            parent = v.getParent();
78ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        } else {
79ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song            return null;
80ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        }
81ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song
82ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        // Optimization to only check up to 5 parents.
83ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        int count = MAXIMUM_VIEW_HIERARCHY_LEVEL;
84ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        while (parent != null && count-- > 0) {
85ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song            if (parent instanceof LaunchSourceProvider) {
86ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song                return (LaunchSourceProvider) parent;
87ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song            } else {
88ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song                parent = parent.getParent();
89ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song            }
90ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        }
91ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        return null;
92ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    }
93ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song
94aa953654279d7cca29682d85111e398ea1f20390Hyunyoung Song    private String TAG = "UserEvent";
958fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song
968fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song    private long mElapsedContainerMillis;
978fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song    private long mElapsedSessionMillis;
988fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song    private long mActionDurationMillis;
998fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song
100ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    // Used for filling in predictedRank on {@link Target}s.
101ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    private List<ComponentKey> mPredictedApps;
102ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song
10359a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song    public UserEventDispatcher() {
10459a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        if (ProviderConfig.IS_DOGFOOD_BUILD) {
10559a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song            mIsVerbose = Utilities.isPropertyEnabled(TAG);
10659a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        } else {
10759a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song            mIsVerbose = false;
10859a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        }
10959a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song    }
11059a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song
111ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    //                      APP_ICON    SHORTCUT    WIDGET
112ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    // --------------------------------------------------------------
113ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    // packageNameHash      required    optional    required
114ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    // componentNameHash    required                required
115ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    // intentHash                       required
116ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    // --------------------------------------------------------------
1178fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song
1186470cf449f1caf6a030e7ea93e785bb6ba414a59Hyunyoung Song    protected LauncherEvent createLauncherEvent(View v, Intent intent) {
119ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        LauncherEvent event = LoggerUtils.initLauncherEvent(
1208ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song                Action.TOUCH, v, Target.CONTAINER);
121ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        event.action.touch = Action.TAP;
1228fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song
123ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        // Fill in grid(x,y), pageIndex of the child and container type of the parent
124ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        // TODO: make this percolate up the view hierarchy if needed.
125ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        int idx = 0;
126ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        LaunchSourceProvider provider = getLaunchProviderRecursive(v);
12759a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        if (v == null || !(v.getTag() instanceof ItemInfo) || provider == null) {
1288ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song            return null;
1298ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song        }
1306470cf449f1caf6a030e7ea93e785bb6ba414a59Hyunyoung Song        ItemInfo itemInfo = (ItemInfo) v.getTag();
1316470cf449f1caf6a030e7ea93e785bb6ba414a59Hyunyoung Song        provider.fillInLaunchSourceData(v, itemInfo, event.srcTarget[idx], event.srcTarget[idx + 1]);
1326470cf449f1caf6a030e7ea93e785bb6ba414a59Hyunyoung Song
1336470cf449f1caf6a030e7ea93e785bb6ba414a59Hyunyoung Song        event.srcTarget[idx].intentHash = intent.hashCode();
1346470cf449f1caf6a030e7ea93e785bb6ba414a59Hyunyoung Song        ComponentName cn = intent.getComponent();
1356470cf449f1caf6a030e7ea93e785bb6ba414a59Hyunyoung Song        if (cn != null) {
1366470cf449f1caf6a030e7ea93e785bb6ba414a59Hyunyoung Song            event.srcTarget[idx].packageNameHash = cn.getPackageName().hashCode();
1376470cf449f1caf6a030e7ea93e785bb6ba414a59Hyunyoung Song            event.srcTarget[idx].componentHash = cn.hashCode();
138373f5718f6ace627cfb17a4c9da2acfb9263c0f5Hyunyoung Song            if (mPredictedApps != null) {
139373f5718f6ace627cfb17a4c9da2acfb9263c0f5Hyunyoung Song                event.srcTarget[idx].predictedRank = mPredictedApps.indexOf(
140373f5718f6ace627cfb17a4c9da2acfb9263c0f5Hyunyoung Song                        new ComponentKey(cn, itemInfo.user));
141373f5718f6ace627cfb17a4c9da2acfb9263c0f5Hyunyoung Song            }
1426470cf449f1caf6a030e7ea93e785bb6ba414a59Hyunyoung Song        }
14346ab2276f97518e9ba71e4bf3109b8ebd924cbabSunny Goyal        return event;
14446ab2276f97518e9ba71e4bf3109b8ebd924cbabSunny Goyal    }
145ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song
146aa953654279d7cca29682d85111e398ea1f20390Hyunyoung Song    public void logAppLaunch(View v, Intent intent) {
1478ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song        LauncherEvent ev = createLauncherEvent(v, intent);
1488ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song        if (ev == null) {
1498ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song            return;
1508ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song        }
1518ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song        dispatchUserEvent(ev, intent);
152ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    }
153ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song
154ffad962092e2b42e336918c2f1e8f5ec48cc08a9Hyunyoung Song    public void logActionOnItem(int action, int itemType) {
155ffad962092e2b42e336918c2f1e8f5ec48cc08a9Hyunyoung Song        LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, Target.ITEM);
156ffad962092e2b42e336918c2f1e8f5ec48cc08a9Hyunyoung Song        event.action.touch = action;
157ffad962092e2b42e336918c2f1e8f5ec48cc08a9Hyunyoung Song        event.srcTarget[0].itemType = itemType;
158ffad962092e2b42e336918c2f1e8f5ec48cc08a9Hyunyoung Song        dispatchUserEvent(event, null);
159ffad962092e2b42e336918c2f1e8f5ec48cc08a9Hyunyoung Song    }
160ffad962092e2b42e336918c2f1e8f5ec48cc08a9Hyunyoung Song
1615aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song    public void logActionOnControl(int action, int controlType) {
1625aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song        LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, Target.CONTROL);
1635aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song        event.action.touch = action;
1645aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song        event.srcTarget[0].controlType = controlType;
1655aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song        dispatchUserEvent(event, null);
166ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    }
167ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song
1685aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song    public void logActionOnContainer(int action, int dir, int containerType) {
1695aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song        LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, Target.CONTAINER);
1705aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song        event.action.touch = action;
1715aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song        event.action.dir = dir;
1725aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song        event.srcTarget[0].containerType = containerType;
1735aa2714959405043639cb2d0b8d9ab8c6eef0bd2Hyunyoung Song        dispatchUserEvent(event, null);
174ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    }
175ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song
176be06874c8105cf1beec8171235600da9f4ee035eTony Wickham    public void logDeepShortcutsOpen(View icon) {
17755c6691e3a2e953dc9882ad0bc0a4c1ee2d42e67Tony Wickham        LauncherEvent event = LoggerUtils.initLauncherEvent(
1788ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song                Action.TOUCH, icon, Target.CONTAINER);
179be06874c8105cf1beec8171235600da9f4ee035eTony Wickham        LaunchSourceProvider provider = getLaunchProviderRecursive(icon);
18059a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        if (icon == null && !(icon.getTag() instanceof ItemInfo)) {
1818ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song            return;
1828ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song        }
183be06874c8105cf1beec8171235600da9f4ee035eTony Wickham        ItemInfo info = (ItemInfo) icon.getTag();
184be06874c8105cf1beec8171235600da9f4ee035eTony Wickham        provider.fillInLaunchSourceData(icon, info, event.srcTarget[0], event.srcTarget[1]);
185be06874c8105cf1beec8171235600da9f4ee035eTony Wickham        event.action.touch = Action.LONGPRESS;
18655c6691e3a2e953dc9882ad0bc0a4c1ee2d42e67Tony Wickham        dispatchUserEvent(event, null);
18755c6691e3a2e953dc9882ad0bc0a4c1ee2d42e67Tony Wickham    }
18855c6691e3a2e953dc9882ad0bc0a4c1ee2d42e67Tony Wickham
189ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song    public void setPredictedApps(List<ComponentKey> predictedApps) {
190ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song        mPredictedApps = predictedApps;
1918fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song    }
1928fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song
19359a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song    public void logDragNDrop(DropTarget.DragObject dragObj, View dropTargetAsView) {
19459a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH,
19559a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                dragObj.dragView,
19659a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                dragObj.originalDragInfo,
19759a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                Target.CONTAINER,
19859a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                dropTargetAsView);
19959a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        event.action.touch = Action.DRAGDROP;
20059a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song
20159a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        dragObj.dragSource.fillInLaunchSourceData(null, dragObj.originalDragInfo,
20259a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                event.srcTarget[0], event.srcTarget[1]);
20359a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song
20459a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        if (dropTargetAsView instanceof LaunchSourceProvider) {
20559a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song            ((LaunchSourceProvider) dropTargetAsView).fillInLaunchSourceData(null,
20659a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                    dragObj.dragInfo, event.destTarget[0], event.destTarget[1]);
20759a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song
20859a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        }
20959a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        event.actionDurationMillis = SystemClock.uptimeMillis() - mActionDurationMillis;
21059a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        dispatchUserEvent(event, null);
21159a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song    }
21259a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song
2138fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song    /**
2148fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song     * Currently logs following containers: workspace, allapps, widget tray.
2158fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song     */
2168fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song    public final void resetElapsedContainerMillis() {
21759a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        mElapsedContainerMillis = SystemClock.uptimeMillis();
2188fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song    }
2198fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song
2208fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song    public final void resetElapsedSessionMillis() {
22159a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        mElapsedSessionMillis = SystemClock.uptimeMillis();
22259a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        mElapsedContainerMillis = SystemClock.uptimeMillis();
2238fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song    }
2248fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song
2258fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song    public final void resetActionDurationMillis() {
22659a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        mActionDurationMillis = SystemClock.uptimeMillis();
2278fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song    }
2288fd5e938d34ee84d076b5c5d2575cc6c46c254ceHyunyoung Song
22964976d5a5667f52ed3fe4346ea5ab910dcc2dc2dSunny Goyal    public void dispatchUserEvent(LauncherEvent ev, Intent intent) {
230d8fcffb8fe61a0288a85ac588ae51f7ed064f7c7Hyunyoung Song        ev.elapsedContainerMillis = SystemClock.uptimeMillis() - mElapsedContainerMillis;
231d8fcffb8fe61a0288a85ac588ae51f7ed064f7c7Hyunyoung Song        ev.elapsedSessionMillis = SystemClock.uptimeMillis() - mElapsedSessionMillis;
232d8fcffb8fe61a0288a85ac588ae51f7ed064f7c7Hyunyoung Song
23359a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        if (!mIsVerbose) {
23459a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song            return;
23559a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        }
23659a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        Log.d(TAG, String.format(Locale.US,
23759a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                "\naction:%s\n Source child:%s\tparent:%s",
23859a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                LoggerUtils.getActionStr(ev.action),
23959a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                LoggerUtils.getTargetStr(ev.srcTarget != null ? ev.srcTarget[0] : null),
24059a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                LoggerUtils.getTargetStr(ev.srcTarget != null && ev.srcTarget.length > 1 ?
24159a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                        ev.srcTarget[1] : null)));
24259a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        if (ev.destTarget != null && ev.destTarget.length > 0) {
2438ce6063c4a5bd90810f0a21c946e5bbad3ce9de4Hyunyoung Song            Log.d(TAG, String.format(Locale.US,
24459a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                    " Destination child:%s\tparent:%s",
24559a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                    LoggerUtils.getTargetStr(ev.destTarget != null ? ev.destTarget[0] : null),
24659a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                    LoggerUtils.getTargetStr(ev.destTarget != null && ev.destTarget.length > 1 ?
24759a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                            ev.destTarget[1] : null)));
24864976d5a5667f52ed3fe4346ea5ab910dcc2dc2dSunny Goyal        }
24959a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song        Log.d(TAG, String.format(Locale.US,
25059a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                " Elapsed container %d ms session %d ms action %d ms",
25159a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                ev.elapsedContainerMillis,
25259a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                ev.elapsedSessionMillis,
25359a238095e82fd02355f4cb53abe01655a50b051Hyunyoung Song                ev.actionDurationMillis));
25464976d5a5667f52ed3fe4346ea5ab910dcc2dc2dSunny Goyal    }
255ddec1c739ef37c3a042982b8943fe42e04b65f4cHyunyoung Song}
256