diff --git a/src/com/android/settings/homepage/ContextualCard.java b/src/com/android/settings/homepage/ContextualCard.java
index 174a437..5bd265b 100644
--- a/src/com/android/settings/homepage/ContextualCard.java
+++ b/src/com/android/settings/homepage/ContextualCard.java
@@ -33,10 +33,10 @@
     /**
      * Flags indicating the type of the ContextualCard.
      */
-    @IntDef({CardType.INVALID, CardType.SLICE, CardType.SUGGESTION, CardType.CONDITIONAL})
+    @IntDef({CardType.DEFAULT, CardType.SLICE, CardType.SUGGESTION, CardType.CONDITIONAL})
     @Retention(RetentionPolicy.SOURCE)
     public @interface CardType {
-        int INVALID = -1;
+        int DEFAULT = 0;
         int SLICE = 1;
         int SUGGESTION = 2;
         int CONDITIONAL = 3;
diff --git a/src/com/android/settings/homepage/ContextualCardManager.java b/src/com/android/settings/homepage/ContextualCardManager.java
index 1eec6a7..b9aa792 100644
--- a/src/com/android/settings/homepage/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/ContextualCardManager.java
@@ -20,6 +20,7 @@
 
 import android.content.Context;
 import android.os.Bundle;
+import android.util.Log;
 import android.widget.BaseAdapter;
 
 import androidx.annotation.NonNull;
@@ -32,6 +33,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * This is a centralized manager of multiple {@link ContextualCardController}.
@@ -57,15 +60,20 @@
     private final ControllerRendererPool mControllerRendererPool;
     private final Lifecycle mLifecycle;
     private final List<ContextualCard> mContextualCards;
+    private final List<LifecycleObserver> mLifecycleObservers;
 
     private ContextualCardUpdateListener mListener;
 
-
-    public ContextualCardManager(Context context, Lifecycle lifecycle) {
+    public ContextualCardManager(Context context, @NonNull Lifecycle lifecycle) {
         mContext = context;
         mLifecycle = lifecycle;
         mContextualCards = new ArrayList<>();
+        mLifecycleObservers = new ArrayList<>();
         mControllerRendererPool = new ControllerRendererPool();
+        //for data provided by Settings
+        for (int cardType : SETTINGS_CARDS) {
+            setupController(cardType);
+        }
     }
 
     void loadContextualCards(PersonalSettingsFragment fragment) {
@@ -77,71 +85,65 @@
     }
 
     private void loadCardControllers() {
-        if (mContextualCards != null) {
-            for (ContextualCard card : mContextualCards) {
-                setupController(card.getCardType());
-            }
-        }
-
-        //for data provided by Settings
-        for (int cardType : SETTINGS_CARDS) {
-            setupController(cardType);
+        for (ContextualCard card : mContextualCards) {
+            setupController(card.getCardType());
         }
     }
 
     private void setupController(int cardType) {
         final ContextualCardController controller = mControllerRendererPool.getController(mContext,
                 cardType);
-        if (controller != null) {
-            controller.setCardUpdateListener(this);
-            if (controller instanceof LifecycleObserver) {
-                if (mLifecycle != null) {
-                    mLifecycle.addObserver((LifecycleObserver) controller);
-                }
-            }
+        if (controller == null) {
+            Log.w(TAG, "Cannot find ContextualCardController for type " + cardType);
+            return;
+        }
+        controller.setCardUpdateListener(this);
+        if (controller instanceof LifecycleObserver && !mLifecycleObservers.contains(controller)) {
+            mLifecycleObservers.add((LifecycleObserver) controller);
+            mLifecycle.addObserver((LifecycleObserver) controller);
         }
     }
 
     //TODO(b/111822376): implement sorting mechanism.
-    private void sortCards() {
+    private void sortCards(List<ContextualCard> cards) {
         //take mContextualCards as the source and do the ranking based on the rule.
     }
 
     @Override
-    public void onContextualCardUpdated(int cardType, List<ContextualCard> updateList) {
+    public void onContextualCardUpdated(List<ContextualCard> updateList) {
         //TODO(b/112245748): Should implement a DiffCallback.
         //Keep the old list for comparison.
         final List<ContextualCard> prevCards = mContextualCards;
 
-        //Remove the existing data that matches the certain cardType so as to insert the new data.
-        for (int i = mContextualCards.size() - 1; i >= 0; i--) {
-            if (mContextualCards.get(i).getCardType() == cardType) {
-                mContextualCards.remove(i);
-            }
-        }
+        final Set<Integer> cardTypes = updateList
+                .stream()
+                .map(card -> card.getCardType())
+                .collect(Collectors.toSet());
+        //Remove the existing data that matches the certain cardType before inserting new data.
+        final List<ContextualCard> cardsToKeep = mContextualCards
+                .stream()
+                .filter(card -> !cardTypes.contains(card.getCardType()))
+                .collect(Collectors.toList());
+        final List<ContextualCard> allCards = new ArrayList<>();
+        allCards.addAll(cardsToKeep);
+        allCards.addAll(updateList);
 
-        //Append the new data
-        mContextualCards.addAll(updateList);
+        sortCards(allCards);
 
-        sortCards();
+        //replace with the new data
+        mContextualCards.clear();
+        mContextualCards.addAll(allCards);
+
+        loadCardControllers();
 
         if (mListener != null) {
-            mListener.onContextualCardUpdated(ContextualCard.CardType.INVALID, mContextualCards);
+            mListener.onContextualCardUpdated(mContextualCards);
         }
     }
 
     @Override
     public void onFinishCardLoading(List<ContextualCard> contextualCards) {
-        mContextualCards.clear();
-        if (contextualCards != null) {
-            mContextualCards.addAll(contextualCards);
-        }
-
-        //Force card sorting here in case CardControllers of custom view have nothing to update
-        // for the first launch.
-        sortCards();
-
-        loadCardControllers();
+        onContextualCardUpdated(contextualCards);
     }
 
     void setListener(ContextualCardUpdateListener listener) {
diff --git a/src/com/android/settings/homepage/ContextualCardUpdateListener.java b/src/com/android/settings/homepage/ContextualCardUpdateListener.java
index d307a8f..812c4ce 100644
--- a/src/com/android/settings/homepage/ContextualCardUpdateListener.java
+++ b/src/com/android/settings/homepage/ContextualCardUpdateListener.java
@@ -27,5 +27,5 @@
  * ContextualCardsAdapter} in this case.
  */
 public interface ContextualCardUpdateListener {
-    void onContextualCardUpdated(int cardType, List<ContextualCard> updateList);
+    void onContextualCardUpdated(List<ContextualCard> updateList);
 }
\ No newline at end of file
diff --git a/src/com/android/settings/homepage/ContextualCardsAdapter.java b/src/com/android/settings/homepage/ContextualCardsAdapter.java
index 53a47e0..402212f 100644
--- a/src/com/android/settings/homepage/ContextualCardsAdapter.java
+++ b/src/com/android/settings/homepage/ContextualCardsAdapter.java
@@ -101,7 +101,7 @@
     }
 
     @Override
-    public void onContextualCardUpdated(int cardType, List<ContextualCard> contextualCards) {
+    public void onContextualCardUpdated(List<ContextualCard> contextualCards) {
         //TODO(b/112245748): Should implement a DiffCallback so we can use notifyItemChanged()
         // instead.
         if (contextualCards == null) {
diff --git a/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java b/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java
index 6701cfd..adac8eb 100644
--- a/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java
+++ b/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java
@@ -58,7 +58,7 @@
 
     @Override
     public void onDataUpdated(List<ContextualCard> cardList) {
-        mListener.onContextualCardUpdated(getCardType(), cardList);
+        mListener.onContextualCardUpdated(cardList);
     }
 
     @Override
@@ -96,7 +96,6 @@
                             .setActionText(condition.getActionText())
                             .setName(mContext.getPackageName() + "/"
                                     + condition.getTitle().toString())
-                            .setCardType(ContextualCard.CardType.CONDITIONAL)
                             .setTitleText(condition.getTitle().toString())
                             .setSummaryText(condition.getSummary().toString())
                             .setIconDrawable(condition.getIcon())
diff --git a/src/com/android/settings/homepage/conditional/ConditionalContextualCard.java b/src/com/android/settings/homepage/conditional/ConditionalContextualCard.java
index 62a4956..828f90b 100644
--- a/src/com/android/settings/homepage/conditional/ConditionalContextualCard.java
+++ b/src/com/android/settings/homepage/conditional/ConditionalContextualCard.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.homepage.conditional;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.settings.homepage.ContextualCard;
 
 /**
@@ -38,6 +40,11 @@
         mActionText = builder.mActionText;
     }
 
+    @Override
+    public int getCardType() {
+        return CardType.CONDITIONAL;
+    }
+
     public long getConditionId() {
         return mConditionId;
     }
@@ -50,7 +57,7 @@
         return mActionText;
     }
 
-    static class Builder extends ContextualCard.Builder {
+    public static class Builder extends ContextualCard.Builder {
 
         private long mConditionId;
         private int mMetricsConstant;
@@ -71,6 +78,12 @@
             return this;
         }
 
+        @Override
+        public Builder setCardType(int cardType) {
+            throw new IllegalArgumentException(
+                    "Cannot change card type for " + getClass().getName());
+        }
+
         public ConditionalContextualCard build() {
             return new ConditionalContextualCard(this);
         }
diff --git a/tests/robotests/src/com/android/settings/homepage/ConditionalContextualCardTest.java b/tests/robotests/src/com/android/settings/homepage/ConditionalContextualCardTest.java
new file mode 100644
index 0000000..ced8b06
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/homepage/ConditionalContextualCardTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.android.settings.homepage.conditional.ConditionalContextualCard;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class ConditionalContextualCardTest {
+
+    @Test(expected = IllegalArgumentException.class)
+    public void newInstance_changeCardType_shouldCrash() {
+        new ConditionalContextualCard.Builder()
+                .setCardType(ContextualCard.CardType.SUGGESTION)
+                .build();
+    }
+
+    @Test
+    public void getCardType_shouldAlwaysBeConditional() {
+        assertThat(new ConditionalContextualCard.Builder().build().getCardType())
+                .isEqualTo(ContextualCard.CardType.CONDITIONAL);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardRendererTest.java b/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardRendererTest.java
index 1ee052d..dc56a7f 100644
--- a/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardRendererTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardRendererTest.java
@@ -101,7 +101,6 @@
                 .setMetricsConstant(1)
                 .setActionText("test_action")
                 .setName("test_name")
-                .setCardType(ContextualCard.CardType.CONDITIONAL)
                 .setTitleText("test_title")
                 .setSummaryText("test_summary")
                 .setIconDrawable(mContext.getDrawable(R.drawable.ic_do_not_disturb_on_24dp))
