19d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren/* 29d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * Copyright (C) 2018 The Android Open Source Project 39d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * 49d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * Licensed under the Apache License, Version 2.0 (the "License"); 59d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * you may not use this file except in compliance with the License. 69d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * You may obtain a copy of the License at 79d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * 89d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * http://www.apache.org/licenses/LICENSE-2.0 99d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * 109d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * Unless required by applicable law or agreed to in writing, software 119d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * distributed under the License is distributed on an "AS IS" BASIS, 129d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * See the License for the specific language governing permissions and 149d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * limitations under the License. 159d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren */ 169d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren 179d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wrenpackage android.app.slice; 189d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren 199d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wrenimport android.annotation.NonNull; 209d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wrenimport android.content.Context; 21d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wrenimport android.metrics.LogMaker; 229d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wrenimport android.net.Uri; 239d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren 249d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wrenimport com.android.internal.logging.MetricsLogger; 25d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wrenimport com.android.internal.logging.nano.MetricsProto.MetricsEvent; 269d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren 279d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren/** 289d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * Metrics interface for slices. 299d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * 3041a25211de08327c5178fb5f168e1154871a08d6Chris Wren * This is called by SliceView, so Slice developers should 319d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * not need to reference this class. 329d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * 339d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * @see androidx.slice.widget.SliceView 349d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren */ 359d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wrenpublic class SliceMetrics { 369d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren 379d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren private static final String TAG = "SliceMetrics"; 389d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren private MetricsLogger mMetricsLogger; 39d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren private LogMaker mLogMaker; 409d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren 419d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren /** 429d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * An object to be used throughout the life of a slice to register events. 439d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren */ 449d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren public SliceMetrics(@NonNull Context context, @NonNull Uri uri) { 459d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren mMetricsLogger = new MetricsLogger(); 46d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren mLogMaker = new LogMaker(MetricsEvent.VIEW_UNKNOWN); 47d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren mLogMaker.addTaggedData(MetricsEvent.FIELD_SLICE_AUTHORITY, uri.getAuthority()); 48d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren mLogMaker.addTaggedData(MetricsEvent.FIELD_SLICE_PATH, uri.getPath()); 499d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren } 509d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren 519d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren /** 529d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * To be called whenever the slice becomes visible to the user. 539d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren */ 549d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren public void logVisible() { 55d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren synchronized (mLogMaker) { 56d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren mLogMaker.setCategory(MetricsEvent.SLICE) 57d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren .setType(MetricsEvent.TYPE_OPEN); 58d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren mMetricsLogger.write(mLogMaker); 59d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren } 609d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren } 619d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren 629d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren /** 639d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren * To be called whenever the slice becomes invisible to the user. 649d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren */ 659d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren public void logHidden() { 66d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren synchronized (mLogMaker) { 67d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren mLogMaker.setCategory(MetricsEvent.SLICE) 68d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren .setType(MetricsEvent.TYPE_CLOSE); 69d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren mMetricsLogger.write(mLogMaker); 70d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren } 719d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren } 729d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren 739d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren /** 7441a25211de08327c5178fb5f168e1154871a08d6Chris Wren * To be called whenever the user invokes a discrete action via a slice. 7541a25211de08327c5178fb5f168e1154871a08d6Chris Wren * 7641a25211de08327c5178fb5f168e1154871a08d6Chris Wren * <P> 7741a25211de08327c5178fb5f168e1154871a08d6Chris Wren * Use this for discrete events like a tap or the end of a drag, 7841a25211de08327c5178fb5f168e1154871a08d6Chris Wren * not for a continuous streams of events, such as the motion during a gesture. 7941a25211de08327c5178fb5f168e1154871a08d6Chris Wren * </P> 8041a25211de08327c5178fb5f168e1154871a08d6Chris Wren * 8141a25211de08327c5178fb5f168e1154871a08d6Chris Wren * @see androidx.slice.widget.EventInfo#actionType 8241a25211de08327c5178fb5f168e1154871a08d6Chris Wren * 8341a25211de08327c5178fb5f168e1154871a08d6Chris Wren * @param actionType The type of the event. 8441a25211de08327c5178fb5f168e1154871a08d6Chris Wren * @param subSlice The URI of the sub-slice that is the subject of the interaction. 859d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren */ 8641a25211de08327c5178fb5f168e1154871a08d6Chris Wren public void logTouch(int actionType, @NonNull Uri subSlice) { 87d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren synchronized (mLogMaker) { 88d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren mLogMaker.setCategory(MetricsEvent.SLICE) 89d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren .setType(MetricsEvent.TYPE_ACTION) 90d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren .addTaggedData(MetricsEvent.FIELD_SUBSLICE_AUTHORITY, subSlice.getAuthority()) 91d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren .addTaggedData(MetricsEvent.FIELD_SUBSLICE_PATH, subSlice.getPath()); 92d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren mMetricsLogger.write(mLogMaker); 93d63dffd8cdf35010ac0f37b791560e99278e43c2Chris Wren } 949d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren } 959d8ce74a631b44d4f07878d7fec5e5fa076f1e17Chris Wren} 96