diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java
index c296c7a..bba7f53 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java
@@ -20,17 +20,4 @@
 
 /** Feature provider for the contextual card feature. */
 public interface ContextualCardFeatureProvider {
-
-    /** Homepage displays. */
-    void logHomepageDisplay(long latency);
-
-    /** When user clicks dismiss in contextual card */
-    void logContextualCardDismiss(ContextualCard card);
-
-    /** After ContextualCardManager decides which cards will be displayed/hidden */
-    void logContextualCardDisplay(List<ContextualCard> showedCards,
-            List<ContextualCard> hiddenCards);
-
-    /** When user clicks toggle/title area of a contextual card. */
-    void logContextualCardClick(ContextualCard card, int sliceRow, int tapTarget, int uiPosition);
 }
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
index 793134f..03a1550 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
@@ -16,161 +16,12 @@
 
 package com.android.settings.homepage.contextualcards;
 
-import android.annotation.NonNull;
 import android.content.Context;
-import android.content.Intent;
-import android.os.UserHandle;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.slice.widget.EventInfo;
-
-import com.android.settings.R;
-import com.android.settings.intelligence.ContextualCardProto.ContextualCardList;
-
-import java.util.List;
 
 public class ContextualCardFeatureProviderImpl implements ContextualCardFeatureProvider {
-    private static final String TAG = "ContextualCardFeature";
-
-    // Contextual card interaction logs
-    // Settings Homepage shows
-    private static final int CONTEXTUAL_HOME_SHOW = 38;
-
-    // Contextual card shows, log card name and rank
-    private static final int CONTEXTUAL_CARD_SHOW = 39;
-
-    // Contextual card is dismissed, log card name
-    private static final int CONTEXTUAL_CARD_DISMISS = 41;
-
-    // Contextual card is clicked , log card name, score, tap area
-    private static final int CONTEXTUAL_CARD_CLICK = 42;
-
-    // SettingsLogBroadcastReceiver contracts
-    // contextual card name
-    private static final String EXTRA_CONTEXTUALCARD_NAME = "name";
-
-    // contextual card uri
-    private static final String EXTRA_CONTEXTUALCARD_URI = "uri";
-
-    // contextual card score
-    private static final String EXTRA_CONTEXTUALCARD_SCORE = "score";
-
-    // contextual card clicked row
-    private static final String EXTRA_CONTEXTUALCARD_ROW = "row";
-
-    // contextual card tap target
-    private static final String EXTRA_CONTEXTUALCARD_TAP_TARGET = "target";
-
-    // contextual card ui position
-    private static final String EXTRA_CONTEXTUALCARD_UI_POSTITION = "ui_position";
-
-    // contextual homepage display latency
-    private static final String EXTRA_LATENCY = "latency";
-
-    // log type
-    private static final String EXTRA_CONTEXTUALCARD_ACTION_TYPE = "type";
-
-    // displayed contextual cards
-    private static final String EXTRA_CONTEXTUALCARD_VISIBLE = "visible";
-
-    // hidden contextual cards
-    private static final String EXTRA_CONTEXTUALCARD_HIDDEN = "hidden";
-
-    // Contextual card tap target
-    private static final int TARGET_DEFAULT = 0;
-
-    // Click title area
-    private static final int TARGET_TITLE = 1;
-
-    // Click toggle
-    private static final int TARGET_TOGGLE = 2;
-
-    // Click slider
-    private static final int TARGET_SLIDER = 3;
-
     private final Context mContext;
 
     public ContextualCardFeatureProviderImpl(Context context) {
         mContext = context;
     }
-
-    @Override
-    public void logHomepageDisplay(long latency) {
-        sendBroadcast(new Intent()
-                .putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_HOME_SHOW)
-                .putExtra(EXTRA_LATENCY, latency));
-    }
-
-    @Override
-    public void logContextualCardDismiss(ContextualCard card) {
-        final Intent intent = new Intent();
-        intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_CARD_DISMISS);
-        intent.putExtra(EXTRA_CONTEXTUALCARD_NAME, card.getName());
-        intent.putExtra(EXTRA_CONTEXTUALCARD_URI, card.getSliceUri().toString());
-        intent.putExtra(EXTRA_CONTEXTUALCARD_SCORE, card.getRankingScore());
-        sendBroadcast(intent);
-    }
-
-    @Override
-    public void logContextualCardDisplay(List<ContextualCard> visibleCards,
-            List<ContextualCard> hiddenCards) {
-        final Intent intent = new Intent();
-        intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_CARD_SHOW);
-        intent.putExtra(EXTRA_CONTEXTUALCARD_VISIBLE, serialize(visibleCards));
-        intent.putExtra(EXTRA_CONTEXTUALCARD_HIDDEN, serialize(hiddenCards));
-        sendBroadcast(intent);
-    }
-
-    @Override
-    public void logContextualCardClick(ContextualCard card, int row,
-            int actionType, int uiPosition) {
-        final Intent intent = new Intent();
-        intent.putExtra(EXTRA_CONTEXTUALCARD_ACTION_TYPE, CONTEXTUAL_CARD_CLICK);
-        intent.putExtra(EXTRA_CONTEXTUALCARD_NAME, card.getName());
-        intent.putExtra(EXTRA_CONTEXTUALCARD_URI, card.getSliceUri().toString());
-        intent.putExtra(EXTRA_CONTEXTUALCARD_SCORE, card.getRankingScore());
-        intent.putExtra(EXTRA_CONTEXTUALCARD_ROW, row);
-        intent.putExtra(EXTRA_CONTEXTUALCARD_TAP_TARGET, actionTypeToTapTarget(actionType));
-        intent.putExtra(EXTRA_CONTEXTUALCARD_UI_POSTITION, uiPosition);
-        sendBroadcast(intent);
-    }
-
-    @VisibleForTesting
-    void sendBroadcast(final Intent intent) {
-        intent.setPackage(mContext.getString(R.string.config_settingsintelligence_package_name));
-        final String action = mContext.getString(R.string.config_settingsintelligence_log_action);
-        if (!TextUtils.isEmpty(action)) {
-            intent.setAction(action);
-            mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
-        }
-    }
-
-    private int actionTypeToTapTarget(int actionType) {
-        switch (actionType) {
-            case EventInfo.ACTION_TYPE_CONTENT:
-                return TARGET_TITLE;
-            case EventInfo.ACTION_TYPE_TOGGLE:
-                return TARGET_TOGGLE;
-            case EventInfo.ACTION_TYPE_SLIDER:
-                return TARGET_SLIDER;
-            default:
-                Log.w(TAG, "unknown type " + actionType);
-                return TARGET_DEFAULT;
-        }
-    }
-
-    @VisibleForTesting
-    @NonNull
-    byte[] serialize(List<ContextualCard> cards) {
-        final ContextualCardList.Builder builder = ContextualCardList.newBuilder();
-        cards.stream().forEach(card -> builder.addCard(
-                com.android.settings.intelligence.ContextualCardProto.ContextualCard.newBuilder()
-                        .setSliceUri(card.getSliceUri().toString())
-                        .setCardName(card.getName())
-                        .setCardScore(card.getRankingScore())
-                        .build()));
-        return builder.build().toByteArray();
-    }
 }
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
index d8361a9..e454a3c 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
@@ -228,8 +228,6 @@
         }
         //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);
 
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index cacecd6..78c3c08 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -78,11 +78,6 @@
         <item>fake_package/fake_service</item>
     </string-array>
 
-    <!-- Settings intelligence interaction log intent action -->
-    <string name="config_settingsintelligence_log_action" translatable="false">
-        aaa.bbb.ccc
-    </string>
-
     <!-- List of packages that should be whitelisted for slice uri access. Do not translate -->
     <string-array name="slice_whitelist_package_names" translatable="false">
         <item>com.android.settings.slice_whitelist_package</item>
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImplTest.java
deleted file mode 100644
index 0683bd8..0000000
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImplTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.homepage.contextualcards;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.UserHandle;
-
-import com.android.settings.intelligence.ContextualCardProto.ContextualCardList;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-public class ContextualCardFeatureProviderImplTest {
-
-    private Context mContext;
-    private ContextualCardFeatureProviderImpl mImpl;
-
-    @Before
-    public void setUp() {
-        mContext = spy(RuntimeEnvironment.application);
-        mImpl = new ContextualCardFeatureProviderImpl(mContext);
-    }
-
-    @Test
-    public void sendBroadcast_emptyAction_notSendBroadcast() {
-        final Intent intent = new Intent();
-        mImpl.sendBroadcast(intent);
-
-        verify(mContext, never()).sendBroadcastAsUser(intent, UserHandle.CURRENT);
-    }
-
-    @Test
-    @Config(qualifiers = "mcc999")
-    public void sendBroadcast_hasAction_sendBroadcast() {
-        final Intent intent = new Intent();
-        mImpl.sendBroadcast(intent);
-
-        verify(mContext).sendBroadcastAsUser(intent, UserHandle.CURRENT);
-    }
-
-    @Test
-    @Config(qualifiers = "mcc999")
-    public void logContextualCardDisplay_hasAction_sendBroadcast() {
-        mImpl.logContextualCardDisplay(new ArrayList<>(), new ArrayList<>());
-
-        verify(mContext).sendBroadcastAsUser(any(Intent.class), any());
-    }
-
-    @Test
-    public void serialize_hasSizeTwo_returnSizeTwo() {
-        final List<ContextualCard> cards = new ArrayList<>();
-        cards.add(new ContextualCard.Builder()
-                .setName("name1")
-                .setSliceUri(Uri.parse("uri1"))
-                .build());
-        cards.add(new ContextualCard.Builder()
-                .setName("name2")
-                .setSliceUri(Uri.parse("uri2"))
-                .build());
-
-
-        final byte[] data = mImpl.serialize(cards);
-
-        try {
-            assertThat(ContextualCardList
-                    .parseFrom(data).getCardCount()).isEqualTo(cards.size());
-        } catch (Exception e) {
-            throw new RuntimeException(e.getMessage());
-        }
-    }
-}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
index d3f6499..f025ee8 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
@@ -197,8 +197,8 @@
 
         mContextualCardLoader.getDisplayableCards(new ArrayList<>());
 
-        verify(mFakeFeatureFactory.mContextualCardFeatureProvider, never())
-                .logContextualCardDisplay(anyList(), anyList());
+        verify(mFakeFeatureFactory.metricsFeatureProvider, never()).action(any(),
+                eq(SettingsEnums.ACTION_CONTEXTUAL_CARD_SHOW), any(String.class));
     }
 
     private ContextualCard getContextualCard(String sliceUri) {
