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