blob: 79838962ef1eea2de249a4d02f3ac333f65543ab [file] [log] [blame]
Leif Wilden5eb77482018-01-23 23:54:05 +00001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settingslib.core.instrumentation;
18
19import android.app.Activity;
20import android.content.Context;
21import android.content.Intent;
22
23import android.os.SystemClock;
24import com.android.internal.logging.nano.MetricsProto;
25import com.android.settingslib.core.lifecycle.LifecycleObserver;
26import com.android.settingslib.core.lifecycle.events.OnPause;
27import com.android.settingslib.core.lifecycle.events.OnResume;
28
29import static com.android.settingslib.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
30
31/**
32 * Logs visibility change of a fragment.
33 */
34public class VisibilityLoggerMixin implements LifecycleObserver, OnResume, OnPause {
35
36 private static final String TAG = "VisibilityLoggerMixin";
37
38 private final int mMetricsCategory;
39
40 private MetricsFeatureProvider mMetricsFeature;
41 private int mSourceMetricsCategory = MetricsProto.MetricsEvent.VIEW_UNKNOWN;
42 private long mVisibleTimestamp;
43
44 /**
45 * The metrics category constant for logging source when a setting fragment is opened.
46 */
47 public static final String EXTRA_SOURCE_METRICS_CATEGORY = ":settings:source_metrics";
48
49 private VisibilityLoggerMixin() {
50 mMetricsCategory = METRICS_CATEGORY_UNKNOWN;
51 }
52
53 public VisibilityLoggerMixin(int metricsCategory, MetricsFeatureProvider metricsFeature) {
54 mMetricsCategory = metricsCategory;
55 mMetricsFeature = metricsFeature;
56 }
57
58 @Override
59 public void onResume() {
60 mVisibleTimestamp = SystemClock.elapsedRealtime();
61 if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) {
62 mMetricsFeature.visible(null /* context */, mSourceMetricsCategory, mMetricsCategory);
63 }
64 }
65
66 @Override
67 public void onPause() {
68 mVisibleTimestamp = 0;
69 if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) {
70 mMetricsFeature.hidden(null /* context */, mMetricsCategory);
71 }
72 }
73
74 /**
75 * Sets source metrics category for this logger. Source is the caller that opened this UI.
76 */
77 public void setSourceMetricsCategory(Activity activity) {
78 if (mSourceMetricsCategory != MetricsProto.MetricsEvent.VIEW_UNKNOWN || activity == null) {
79 return;
80 }
81 final Intent intent = activity.getIntent();
82 if (intent == null) {
83 return;
84 }
85 mSourceMetricsCategory = intent.getIntExtra(EXTRA_SOURCE_METRICS_CATEGORY,
86 MetricsProto.MetricsEvent.VIEW_UNKNOWN);
87 }
88
89 /** Returns elapsed time since onResume() */
90 public long elapsedTimeSinceVisible() {
91 if (mVisibleTimestamp == 0) {
92 return 0;
93 }
94 return SystemClock.elapsedRealtime() - mVisibleTimestamp;
95 }
96}