Home | History | Annotate | Download | only in instrumentation
      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