1package com.android.launcher3.logging;
2
3import android.view.View;
4
5import com.android.launcher3.ButtonDropTarget;
6import com.android.launcher3.DeleteDropTarget;
7import com.android.launcher3.InfoDropTarget;
8import com.android.launcher3.ItemInfo;
9import com.android.launcher3.LauncherSettings;
10import com.android.launcher3.UninstallDropTarget;
11import com.android.launcher3.userevent.nano.LauncherLogProto;
12import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
13import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
14
15/**
16 * Debugging helper methods.
17 * toString() cannot be overriden inside auto generated {@link LauncherLogProto}.
18 * Note: switch statement cannot be replaced with reflection as proguard strips the constants
19 */
20public class LoggerUtils {
21    private static final String TAG = "LoggerUtils";
22
23    public static String getActionStr(LauncherLogProto.Action action) {
24        switch(action.touch) {
25            case Action.TAP: return "TAP";
26            case Action.LONGPRESS: return "LONGPRESS";
27            case Action.DRAGDROP: return "DRAGDROP";
28            case Action.PINCH: return "PINCH";
29            case Action.SWIPE: return "SWIPE";
30            case Action.FLING: return "FLING";
31            default: return "UNKNOWN";
32        }
33    }
34
35    public static String getTargetStr(Target t) {
36        String typeStr = "";
37        if (t == null){
38            return typeStr;
39        }
40        switch (t.type) {
41            case Target.ITEM:
42                return getItemStr(t);
43            case Target.CONTROL:
44                return getControlStr(t);
45            case Target.CONTAINER:
46                return getContainerStr(t);
47            default:
48                return "UNKNOWN TARGET TYPE";
49        }
50    }
51
52    private static String getItemStr(Target t) {
53        String typeStr = "";
54        if (t == null){
55            return typeStr;
56        }
57        switch(t.itemType){
58            case LauncherLogProto.APP_ICON: typeStr = "APPICON"; break;
59            case LauncherLogProto.SHORTCUT: typeStr = "SHORTCUT"; break;
60            case LauncherLogProto.WIDGET: typeStr = "WIDGET"; break;
61            case LauncherLogProto.DEEPSHORTCUT: typeStr = "DEEPSHORTCUT"; break;
62            case LauncherLogProto.FOLDER_ICON: typeStr = "FOLDERICON"; break;
63            case LauncherLogProto.SEARCHBOX: typeStr = "SEARCHBOX"; break;
64
65            default: typeStr = "UNKNOWN";
66        }
67
68        if (t.packageNameHash != 0) {
69            typeStr += ", packageHash=" + t.packageNameHash;
70        }
71        if (t.componentHash != 0) {
72            typeStr += ", componentHash=" + t.componentHash;
73        }
74        if (t.intentHash != 0) {
75            typeStr += ", intentHash=" + t.intentHash;
76        }
77        if (t.spanX != 0) {
78            typeStr += ", spanX=" + t.spanX;
79        }
80        return typeStr += ", grid=(" + t.gridX + "," + t.gridY + "), id=" + t.pageIndex;
81    }
82
83    private static String getControlStr(Target t) {
84        if (t == null){
85            return "";
86        }
87        switch(t.controlType) {
88            case LauncherLogProto.ALL_APPS_BUTTON: return "ALL_APPS_BUTTON";
89            case LauncherLogProto.WIDGETS_BUTTON: return "WIDGETS_BUTTON";
90            case LauncherLogProto.WALLPAPER_BUTTON: return "WALLPAPER_BUTTON";
91            case LauncherLogProto.SETTINGS_BUTTON: return "SETTINGS_BUTTON";
92            case LauncherLogProto.REMOVE_TARGET: return "REMOVE_TARGET";
93            case LauncherLogProto.UNINSTALL_TARGET: return "UNINSTALL_TARGET";
94            case LauncherLogProto.APPINFO_TARGET: return "APPINFO_TARGET";
95            case LauncherLogProto.RESIZE_HANDLE: return "RESIZE_HANDLE";
96            default: return "UNKNOWN";
97        }
98    }
99
100    private static String getContainerStr(LauncherLogProto.Target t) {
101        String str = "";
102        if (t == null) {
103            return str;
104        }
105        switch (t.containerType) {
106            case LauncherLogProto.WORKSPACE:
107                str = "WORKSPACE";
108                break;
109            case LauncherLogProto.HOTSEAT:
110                str = "HOTSEAT";
111                break;
112            case LauncherLogProto.FOLDER:
113                str = "FOLDER";
114                break;
115            case LauncherLogProto.ALLAPPS:
116                str = "ALLAPPS";
117                break;
118            case LauncherLogProto.WIDGETS:
119                str = "WIDGETS";
120                break;
121            case LauncherLogProto.OVERVIEW:
122                str = "OVERVIEW";
123                break;
124            case LauncherLogProto.PREDICTION:
125                str = "PREDICTION";
126                break;
127            case LauncherLogProto.SEARCHRESULT:
128                str = "SEARCHRESULT";
129                break;
130            case LauncherLogProto.DEEPSHORTCUTS:
131                str = "DEEPSHORTCUTS";
132                break;
133            default:
134                str = "UNKNOWN";
135        }
136        return str + " id=" + t.pageIndex;
137    }
138
139    /**
140     * Used for launching an event by tapping on an icon.
141     */
142    public static LauncherLogProto.LauncherEvent initLauncherEvent(
143            int actionType,
144            View v,
145            int parentTargetType){
146        LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent();
147
148        event.srcTarget = new LauncherLogProto.Target[2];
149        event.srcTarget[0] = initTarget(v);
150        event.srcTarget[1] = new LauncherLogProto.Target();
151        event.srcTarget[1].type = parentTargetType;
152
153        event.action = new LauncherLogProto.Action();
154        event.action.type = actionType;
155        return event;
156    }
157
158    /**
159     * Used for clicking on controls and buttons.
160     */
161    public static LauncherLogProto.LauncherEvent initLauncherEvent(
162            int actionType,
163            int childTargetType){
164        LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent();
165
166        event.srcTarget = new LauncherLogProto.Target[1];
167        event.srcTarget[0] = new LauncherLogProto.Target();
168        event.srcTarget[0].type = childTargetType;
169
170        event.action = new LauncherLogProto.Action();
171        event.action.type = actionType;
172        return event;
173    }
174
175    /**
176     * Used for drag and drop interaction.
177     */
178    public static LauncherLogProto.LauncherEvent initLauncherEvent(
179            int actionType,
180            View v,
181            ItemInfo info,
182            int parentSrcTargetType,
183            View parentDestTargetType){
184        LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent();
185
186        event.srcTarget = new LauncherLogProto.Target[2];
187        event.srcTarget[0] = initTarget(v, info);
188        event.srcTarget[1] = new LauncherLogProto.Target();
189        event.srcTarget[1].type = parentSrcTargetType;
190
191        event.destTarget = new LauncherLogProto.Target[2];
192        event.destTarget[0] = initTarget(v, info);
193        event.destTarget[1] = initDropTarget(parentDestTargetType);
194
195        event.action = new LauncherLogProto.Action();
196        event.action.type = actionType;
197        return event;
198    }
199
200    private static Target initTarget(View v, ItemInfo info) {
201        Target t = new LauncherLogProto.Target();
202        t.type = Target.ITEM;
203        switch (info.itemType) {
204            case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
205                t.itemType = LauncherLogProto.APP_ICON;
206                break;
207            case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
208                t.itemType = LauncherLogProto.SHORTCUT;
209                break;
210            case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
211                t.itemType = LauncherLogProto.FOLDER_ICON;
212                break;
213            case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
214                t.itemType = LauncherLogProto.WIDGET;
215                break;
216            case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT:
217                t.itemType = LauncherLogProto.DEEPSHORTCUT;
218                break;
219        }
220        return t;
221    }
222
223    private static Target initDropTarget(View v) {
224        Target t = new LauncherLogProto.Target();
225        t.type = (v instanceof ButtonDropTarget)? Target.CONTROL : Target.CONTAINER;
226        if (t.type == Target.CONTAINER) {
227            return t;
228        }
229
230        if (v instanceof InfoDropTarget) {
231            t.controlType = LauncherLogProto.APPINFO_TARGET;
232        } else if (v instanceof UninstallDropTarget) {
233            t.controlType = LauncherLogProto.UNINSTALL_TARGET;
234        } else if (v instanceof DeleteDropTarget) {
235            t.controlType = LauncherLogProto.REMOVE_TARGET;
236        }
237        return t;
238    }
239
240    private static Target initTarget(View v) {
241        Target t = new LauncherLogProto.Target();
242        t.type = Target.ITEM;
243        if (!(v.getTag() instanceof ItemInfo)) {
244            return t;
245        }
246        return initTarget(v, (ItemInfo) v.getTag());
247    }
248}
249