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