1 /* 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 17 package com.android.settingslib.core.instrumentation; 18 19 import android.app.Activity; 20 import android.arch.lifecycle.Lifecycle.Event; 21 import android.arch.lifecycle.LifecycleObserver; 22 import android.arch.lifecycle.OnLifecycleEvent; 23 import android.content.Intent; 24 25 import android.os.SystemClock; 26 import com.android.internal.logging.nano.MetricsProto; 27 28 import static com.android.settingslib.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN; 29 30 /** 31 * Logs visibility change of a fragment. 32 */ 33 public class VisibilityLoggerMixin implements LifecycleObserver { 34 35 private static final String TAG = "VisibilityLoggerMixin"; 36 37 private final int mMetricsCategory; 38 39 private MetricsFeatureProvider mMetricsFeature; 40 private int mSourceMetricsCategory = MetricsProto.MetricsEvent.VIEW_UNKNOWN; 41 private long mVisibleTimestamp; 42 43 /** 44 * The metrics category constant for logging source when a setting fragment is opened. 45 */ 46 public static final String EXTRA_SOURCE_METRICS_CATEGORY = ":settings:source_metrics"; 47 48 private VisibilityLoggerMixin() { 49 mMetricsCategory = METRICS_CATEGORY_UNKNOWN; 50 } 51 52 public VisibilityLoggerMixin(int metricsCategory, MetricsFeatureProvider metricsFeature) { 53 mMetricsCategory = metricsCategory; 54 mMetricsFeature = metricsFeature; 55 } 56 57 @OnLifecycleEvent(Event.ON_RESUME) 58 public void onResume() { 59 mVisibleTimestamp = SystemClock.elapsedRealtime(); 60 if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) { 61 mMetricsFeature.visible(null /* context */, mSourceMetricsCategory, mMetricsCategory); 62 } 63 } 64 65 @OnLifecycleEvent(Event.ON_PAUSE) 66 public void onPause() { 67 mVisibleTimestamp = 0; 68 if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) { 69 mMetricsFeature.hidden(null /* context */, mMetricsCategory); 70 } 71 } 72 73 /** 74 * Sets source metrics category for this logger. Source is the caller that opened this UI. 75 */ 76 public void setSourceMetricsCategory(Activity activity) { 77 if (mSourceMetricsCategory != MetricsProto.MetricsEvent.VIEW_UNKNOWN || activity == null) { 78 return; 79 } 80 final Intent intent = activity.getIntent(); 81 if (intent == null) { 82 return; 83 } 84 mSourceMetricsCategory = intent.getIntExtra(EXTRA_SOURCE_METRICS_CATEGORY, 85 MetricsProto.MetricsEvent.VIEW_UNKNOWN); 86 } 87 88 /** Returns elapsed time since onResume() */ 89 public long elapsedTimeSinceVisible() { 90 if (mVisibleTimestamp == 0) { 91 return 0; 92 } 93 return SystemClock.elapsedRealtime() - mVisibleTimestamp; 94 } 95 } 96