1d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang/*
2d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang * Copyright (C) 2017 The Android Open Source Project
3d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang *
4d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang * Licensed under the Apache License, Version 2.0 (the "License");
5d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang * you may not use this file except in compliance with the License.
6d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang * You may obtain a copy of the License at
7d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang *
8d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang *      http://www.apache.org/licenses/LICENSE-2.0
9d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang *
10d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang * Unless required by applicable law or agreed to in writing, software
11d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang * distributed under the License is distributed on an "AS IS" BASIS,
12d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang * See the License for the specific language governing permissions and
14d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang * limitations under the License.
15d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang */
16d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
17d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhangpackage com.android.settings.intelligence.instrumentation;
18d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
19d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhangimport android.content.Context;
20d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhangimport android.text.TextUtils;
21d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
22d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhangimport com.android.settings.intelligence.nano.SettingsIntelligenceLogProto
23d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        .SettingsIntelligenceEvent;
24d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhangimport com.android.settings.intelligence.search.SearchResult;
25d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
26d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhangimport java.util.ArrayList;
27d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhangimport java.util.List;
28d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
29d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhangpublic class MetricsFeatureProvider {
30d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
31d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    protected Context mContext;
32d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    protected List<EventLogger> mLoggers;
33d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
34d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    public MetricsFeatureProvider(Context context) {
35d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        mContext = context;
36d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        mLoggers = new ArrayList<>();
37d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        mLoggers.add(new LocalEventLogger());
38d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    }
39d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
40d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    public void logGetSuggestion(List<String> ids, long latency) {
41d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        final SettingsIntelligenceEvent event = new SettingsIntelligenceEvent();
42d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.eventType = SettingsIntelligenceEvent.GET_SUGGESTION;
43d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.latencyMillis = latency;
44d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        if (ids != null) {
45d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang            event.suggestionIds = ids.toArray(new String[0]);
46d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        }
47d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        logEvent(event);
48d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    }
49d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
50d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    public void logDismissSuggestion(String id, long latency) {
51d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        final SettingsIntelligenceEvent event = new SettingsIntelligenceEvent();
52d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.eventType = SettingsIntelligenceEvent.DISMISS_SUGGESTION;
53d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.latencyMillis = latency;
54d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        if (!TextUtils.isEmpty(id)) {
55d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang            event.suggestionIds = new String[]{id};
56d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        }
57d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        logEvent(event);
58d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    }
59d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
60d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    public void logLaunchSuggestion(String id, long latency) {
61d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        final SettingsIntelligenceEvent event = new SettingsIntelligenceEvent();
62d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.eventType = SettingsIntelligenceEvent.LAUNCH_SUGGESTION;
63d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.latencyMillis = latency;
64d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        if (!TextUtils.isEmpty(id)) {
65d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang            event.suggestionIds = new String[]{id};
66d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        }
67d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        logEvent(event);
68d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    }
69d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
70d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    public void logSearchResultClick(SearchResult result, String query, int type, int count,
71d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang            int rank) {
72d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        final SettingsIntelligenceEvent event = new SettingsIntelligenceEvent();
73d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.eventType = type;
74d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.searchResultMetadata = new SettingsIntelligenceEvent.SearchResultMetadata();
75d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.searchResultMetadata.resultCount = count;
76d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.searchResultMetadata.searchResultRank = rank;
77d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.searchResultMetadata.searchResultKey = result.dataKey != null ? result.dataKey : "";
78d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.searchResultMetadata.searchQueryLength = query != null ? query.length() : 0;
79d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        logEvent(event);
80d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    }
81d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
82d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    public void logEvent(int eventType) {
83d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        logEvent(eventType, 0 /* latency */);
84d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    }
85d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
86d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    public void logEvent(int eventType, long latency) {
87d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        final SettingsIntelligenceEvent event = new SettingsIntelligenceEvent();
88d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.eventType = eventType;
89d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        event.latencyMillis = latency;
90d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        logEvent(event);
91d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    }
92d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang
93d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    private void logEvent(SettingsIntelligenceEvent event) {
94d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        for (EventLogger logger : mLoggers) {
95d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang            logger.log(event);
96d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang        }
97d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang    }
98d0eec4171551f04fec3cfa074b6a46465a7a9219Fan Zhang}
99