1761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang/*******************************************************************************
2761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *      Copyright (C) 2013 Google Inc.
3761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *      Licensed to The Android Open Source Project.
4761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *
5761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *      Licensed under the Apache License, Version 2.0 (the "License");
6761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *      you may not use this file except in compliance with the License.
7761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *      You may obtain a copy of the License at
8761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *
9761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *           http://www.apache.org/licenses/LICENSE-2.0
10761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *
11761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *      Unless required by applicable law or agreed to in writing, software
12761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *      distributed under the License is distributed on an "AS IS" BASIS,
13761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *      See the License for the specific language governing permissions and
15761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *      limitations under the License.
16761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *******************************************************************************/
17761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
18761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huangpackage com.android.mail.analytics;
19761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
20761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huangimport android.app.Activity;
218cc0de897f4d4b5790a363684347eeae06088f45Andy Huangimport android.app.ActivityManager;
22761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
23761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang/**
24761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang * Mail wrapper for analytics libraries. Libraries should implement {@link Tracker}, and app
25761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang * configurations that want to enable analytics should call {@link #setTracker(Tracker)} as soon
26761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang * as possible upon application start.
27761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang * <p>
28761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang * {@link #getInstance()} will always return an object, but if the app has not yet (or will not
29761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang * ever) set its own tracker instance, method calls on that tracker will be stubbed out.
30761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang *
31761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang */
32761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huangpublic final class Analytics {
33761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
34042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang    public static final String EVENT_CATEGORY_MENU_ITEM = "menu_item";
35761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
36cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps    /**
370abdb685b601c39ae1ccffb930acac323f4aafedRégis Décamps     * The email provider for this account.
38cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps     */
39cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps    public static final int CD_INDEX_ACCOUNT_EMAIL_PROVIDER = 1;
40761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
41042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang    public static final int CD_INDEX_ACCOUNT_COUNT = 2;
42761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
43042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang    public static final int CD_INDEX_SENDER_IMAGES_ENABLED = 3;
44042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang
450e29e769c74e385342fc5dc8e9c85517771aaa34James Lemieux    /** @deprecated Attachment Previews entirely removed from Conversation List */
46042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang    public static final int CD_INDEX_ATTACHMENT_PREVIEWS_ENABLED = 4;
47042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang
48042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang    public static final int CD_INDEX_INBOX_TYPE = 5;
49042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang
50042a530b2296487fa5899a3e871214ac4a47e3d8Andy Huang    public static final int CD_INDEX_INBOX_SECTIONS_ENABLED = 6;
51761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
524fe0af81874976a1995191321e35c844b2229811Andy Huang    public static final int CD_INDEX_REPLY_ALL_SETTING = 7;
534fe0af81874976a1995191321e35c844b2229811Andy Huang
54e6c9fb6835247d98898e2af581ad9449ad7f3184Andy Huang    public static final int CD_INDEX_AUTO_ADVANCE = 8;
55e6c9fb6835247d98898e2af581ad9449ad7f3184Andy Huang
56cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps    /**
572168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     * Custom dimension in analytics to describe if the user already interacted with the app.
582168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     * The value is one of
592168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     * <ul>
602168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     *     <li>{@link #CD_VALUE_USER_RETENTION_TYPE_NEW},</li>
612168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     *     <li>{@link #CD_VALUE_USER_RETENTION_TYPE_UPGRADING} or</li>
622168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     *     <li>{@link @CD_VALUE_USER_RETENTION_TYPE_RETURNING}</li>
632168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     * </ul>
64cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps     */
65cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps    public static final int CD_INDEX_USER_RETENTION_TYPE = 9;
66cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps
67cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps    /**
682168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     * Value for {@link #CD_INDEX_USER_RETENTION_TYPE} meaning that the user has never used the
69cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps     * Mail app anywhere before.
70cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps     */
71cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps    public static final String CD_VALUE_USER_RETENTION_TYPE_NEW = "new";
72cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps    /**
732168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     * Value for {@link #CD_INDEX_USER_RETENTION_TYPE} meaning that the user has used an older
74cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps     * version of the Mail app before.
75cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps     */
76cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps    public static final String CD_VALUE_USER_RETENTION_TYPE_UPGRADING = "upgrading";
772168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps
78cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps    /**
792168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps     * Value for {@link #CD_INDEX_USER_RETENTION_TYPE} meaning that the user has already this
80cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps     * version of the Mail app before.
81cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps     */
82cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps    public static final String CD_VALUE_USER_RETENTION_TYPE_RETURNING = "returning";
83cc4a037b71a60cb912b7fbf25805c54179d75ff0Régis Décamps
84761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    private static Tracker sInstance;
85761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
86761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    private Analytics() {
87761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    }
88761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
89761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    public static Tracker getInstance() {
90761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        synchronized (Analytics.class) {
91761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang            if (sInstance == null) {
92761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang                sInstance = new StubTracker();
93761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang            }
94761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        }
95761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        return sInstance;
96761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    }
97761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
98761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    public static void setTracker(Tracker t) {
99761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        synchronized (Analytics.class) {
100761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang            sInstance = t;
101761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        }
102761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    }
103761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
1048cc0de897f4d4b5790a363684347eeae06088f45Andy Huang    public static boolean isLoggable() {
1058cc0de897f4d4b5790a363684347eeae06088f45Andy Huang        return !ActivityManager.isUserAMonkey() && !ActivityManager.isRunningInTestHarness();
1068cc0de897f4d4b5790a363684347eeae06088f45Andy Huang    }
1078cc0de897f4d4b5790a363684347eeae06088f45Andy Huang
108761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    private static final class StubTracker implements Tracker {
109761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
110761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        @Override
111761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        public void activityStart(Activity a) {}
112761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
113761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        @Override
114761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        public void activityStop(Activity a) {}
115761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
116761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        @Override
117761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        public void sendEvent(String category, String action, String label, long value) {}
118761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
119761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        @Override
12072953f25e00ee8e7b5c7682148430dc82f00a77dJin Cao        public void sendTiming(String category, long millis, String name, String label) {}
12172953f25e00ee8e7b5c7682148430dc82f00a77dJin Cao
12272953f25e00ee8e7b5c7682148430dc82f00a77dJin Cao        @Override
1232b55549d4fbe25e91f673a0727fc89ff755d9327Andy Huang        public void sendMenuItemEvent(String category, int itemResId, String label, long value) {}
1242b55549d4fbe25e91f673a0727fc89ff755d9327Andy Huang
1252b55549d4fbe25e91f673a0727fc89ff755d9327Andy Huang        @Override
126761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        public void sendView(String view) {}
127761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
128761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        @Override
129761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        public void setCustomDimension(int index, String value) {}
130761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
131761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        @Override
132761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        public void setCustomMetric(int index, Long value) {}
133761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
134761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        @Override
135761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang        public void debugDispatchNow() {}
136761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
1370abdb685b601c39ae1ccffb930acac323f4aafedRégis Décamps        @Override
1382168cbc9c58d2133bdf77ecd342c3d5ee755d607Régis Décamps        public void setEmail(String emailAddress, String accountManagerType) {}
139761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang    }
140761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang
141761522c1ac7a8fa05acde714f0e26fde47f3415fAndy Huang}
142