Log latency and timeout occurrence for contextual cards.

Fixes: 124492762
Test: rebuild
Change-Id: I552adf7e6d76e8576a790e83792d067ed5716dc2
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index ff2ee91..1f5f7dd 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -187,7 +187,6 @@
         // Collect future and eligible cards
         for (Future<ContextualCard> cardFuture : eligibleCards) {
             try {
-                //TODO(b/124492762): Log latency and timeout occurrence.
                 final ContextualCard card = cardFuture.get(ELIGIBILITY_CHECKER_TIMEOUT_MS,
                         TimeUnit.MILLISECONDS);
                 if (card != null) {
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
index 8f7e84a..7df322d 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
@@ -22,6 +22,7 @@
 
 import static java.util.stream.Collectors.groupingBy;
 
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.os.Bundle;
 import android.provider.Settings;
@@ -38,6 +39,7 @@
 
 import com.android.settings.homepage.contextualcards.slices.SliceContextualCardRenderer;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
@@ -195,8 +197,8 @@
     @Override
     public void onFinishCardLoading(List<ContextualCard> cards) {
         final long loadTime = System.currentTimeMillis() - mStartTime;
-        //TODO(b/123668403): remove the log here once we do the change with FutureTask
         Log.d(TAG, "Total loading time = " + loadTime);
+
         final List<ContextualCard> cardsToKeep = getCardsToKeep(cards);
 
         //navigate back to the homepage, screen rotate or after card dismissal
@@ -206,15 +208,25 @@
             return;
         }
 
-        //only log homepage display upon a fresh launch
+        final MetricsFeatureProvider metricsFeatureProvider =
+                FeatureFactory.getFactory(mContext).getMetricsFeatureProvider();
         final long timeoutLimit = getCardLoaderTimeout(mContext);
         if (loadTime <= timeoutLimit) {
             onContextualCardUpdated(cards.stream()
                     .collect(groupingBy(ContextualCard::getCardType)));
+        } else {
+            // log timeout occurrence
+            metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+                    SettingsEnums.ACTION_CONTEXTUAL_CARD_LOAD_TIMEOUT,
+                    SettingsEnums.SETTINGS_HOMEPAGE,
+                    null /* key */, (int) loadTime /* value */);
         }
+        //only log homepage display upon a fresh launch
         final long totalTime = System.currentTimeMillis() - mStartTime;
         FeatureFactory.getFactory(mContext).getContextualCardFeatureProvider(mContext)
                 .logHomepageDisplay(totalTime);
+        metricsFeatureProvider.action(mContext,
+                SettingsEnums.ACTION_CONTEXTUAL_HOME_SHOW, (int) totalTime);
 
         mIsFirstLaunch = false;
     }
diff --git a/src/com/android/settings/homepage/contextualcards/EligibleCardChecker.java b/src/com/android/settings/homepage/contextualcards/EligibleCardChecker.java
index fe68d02..811aaa2 100644
--- a/src/com/android/settings/homepage/contextualcards/EligibleCardChecker.java
+++ b/src/com/android/settings/homepage/contextualcards/EligibleCardChecker.java
@@ -18,6 +18,7 @@
 
 import static android.app.slice.Slice.HINT_ERROR;
 
+import android.app.settings.SettingsEnums;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.net.Uri;
@@ -27,6 +28,9 @@
 import androidx.slice.Slice;
 import androidx.slice.SliceViewManager;
 
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -46,7 +50,32 @@
 
     @Override
     public ContextualCard call() throws Exception {
-        return isCardEligibleToDisplay(mCard) ? mCard : null;
+        final long startTime = System.currentTimeMillis();
+        final MetricsFeatureProvider metricsFeatureProvider =
+                FeatureFactory.getFactory(mContext).getMetricsFeatureProvider();
+        ContextualCard result;
+
+        if (isCardEligibleToDisplay(mCard)) {
+            metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+                    SettingsEnums.ACTION_CONTEXTUAL_CARD_ELIGIBILITY,
+                    SettingsEnums.SETTINGS_HOMEPAGE,
+                    mCard.getTextSliceUri() /* key */, 1 /* true */);
+            result = mCard;
+        } else {
+            metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+                    SettingsEnums.ACTION_CONTEXTUAL_CARD_ELIGIBILITY,
+                    SettingsEnums.SETTINGS_HOMEPAGE,
+                    mCard.getTextSliceUri() /* key */, 0 /* false */);
+            result = null;
+        }
+        // Log individual card loading time
+        metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+                SettingsEnums.ACTION_CONTEXTUAL_CARD_LOAD,
+                SettingsEnums.SETTINGS_HOMEPAGE,
+                mCard.getTextSliceUri() /* key */,
+                (int) (System.currentTimeMillis() - startTime) /* value */);
+
+        return result;
     }
 
     @VisibleForTesting