diff --git a/res/values-sw400dp/dimens.xml b/res/values-sw400dp/dimens.xml
index 8d45dd4..6a02422 100755
--- a/res/values-sw400dp/dimens.xml
+++ b/res/values-sw400dp/dimens.xml
@@ -23,8 +23,6 @@
     <dimen name="support_escalation_card_padding_end">56dp</dimen>
 
     <!-- Suggestion cards-->
-    <dimen name="suggestion_card_width_one_card">384dp</dimen>
-    <dimen name="suggestion_card_width_two_cards">188dp</dimen>
     <dimen name="suggestion_card_width_multiple_cards">180dp</dimen>
     <dimen name="suggestion_card_padding_bottom_one_card">22dp</dimen>
 
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 98afa5a..fd54548 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -304,8 +304,6 @@
 
     <!-- Suggestion cards size and padding -->
     <dimen name="suggestion_card_icon_size">24dp</dimen>
-    <dimen name="suggestion_card_width_one_card">332dp</dimen>
-    <dimen name="suggestion_card_width_two_cards">162dp</dimen>
     <dimen name="suggestion_card_width_multiple_cards">156dp</dimen>
     <dimen name="suggestion_card_outer_margin">14dp</dimen>
     <dimen name="suggestion_card_inner_margin">12dp</dimen>
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
index 62bc148..b24a914 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
@@ -23,12 +23,15 @@
 import android.graphics.drawable.Icon;
 import android.os.Bundle;
 import android.service.settings.suggestions.Suggestion;
+import android.support.annotation.VisibleForTesting;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
+import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.WindowManager;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
@@ -117,7 +120,7 @@
         mConfig.setCardLayout(holder, suggestionCount, position);
         final Icon icon = suggestion.getIcon();
         final Drawable drawable = mCache.getIcon(icon);
-        if ((suggestion.getFlags() & Suggestion.FLAG_ICON_TINTABLE) != 0) {
+        if (drawable != null && (suggestion.getFlags() & Suggestion.FLAG_ICON_TINTABLE) != 0) {
             drawable.setTint(Utils.getColorAccent(mContext));
         }
         holder.icon.setImageDrawable(drawable);
@@ -226,28 +229,27 @@
         return mSuggestions;
     }
 
-    private static class CardConfig {
+    @VisibleForTesting
+    static class CardConfig {
         // Card start/end margin
         private final int mMarginInner;
         private final int mMarginOuter;
-        // Card width for different numbers of cards
-        private final int mWidthSingleCard;
-        private final int mWidthTwoCards;
+        // Card width if there are more than 2 cards
         private final int mWidthMultipleCards;
         // padding between icon and title
         private final int mPaddingTitleTopSingleCard;
         private final int mPaddingTitleTopMultipleCards;
+        private final WindowManager mWindowManager;
 
         private static CardConfig sConfig;
 
         private CardConfig(Context context) {
+            mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
             final Resources res = context.getResources();
             mMarginInner =
                 res.getDimensionPixelOffset(R.dimen.suggestion_card_inner_margin);
             mMarginOuter =
                 res.getDimensionPixelOffset(R.dimen.suggestion_card_outer_margin);
-            mWidthSingleCard = res.getDimensionPixelOffset(R.dimen.suggestion_card_width_one_card);
-            mWidthTwoCards = res.getDimensionPixelOffset(R.dimen.suggestion_card_width_two_cards);
             mWidthMultipleCards =
                 res.getDimensionPixelOffset(R.dimen.suggestion_card_width_multiple_cards);
             mPaddingTitleTopSingleCard =
@@ -263,12 +265,12 @@
             return sConfig;
         }
 
-        private void setCardLayout(DashboardItemHolder holder, int suggestionCount,
-            int position) {
+        @VisibleForTesting
+        void setCardLayout(DashboardItemHolder holder, int suggestionCount, int position) {
             final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                 suggestionCount == 1
-                    ? mWidthSingleCard : suggestionCount == 2
-                    ? mWidthTwoCards : mWidthMultipleCards,
+                    ? LinearLayout.LayoutParams.MATCH_PARENT : suggestionCount == 2
+                    ? getWidthForTwoCrads() : mWidthMultipleCards,
                 LinearLayout.LayoutParams.WRAP_CONTENT);
             if (suggestionCount == 1) {
                 params.setMarginStart(mMarginOuter);
@@ -281,6 +283,16 @@
             holder.itemView.setLayoutParams(params);
         }
 
+        private int getWidthForTwoCrads() {
+            return (getScreenWidth() - mMarginInner - mMarginOuter * 2) / 2;
+        }
+
+        @VisibleForTesting
+        int getScreenWidth() {
+            final DisplayMetrics metrics = new DisplayMetrics();
+            mWindowManager.getDefaultDisplay().getMetrics(metrics);
+            return metrics.widthPixels;
+        }
     }
 
 }
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
index d25969e..cc25b5d 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
@@ -35,6 +35,7 @@
 import android.util.DisplayMetrics;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.WindowManager;
 import android.widget.TextView;
 
 import com.android.settings.R;
@@ -77,6 +78,8 @@
     private Condition mCondition;
     @Mock
     private Resources mResources;
+    @Mock
+    private WindowManager mWindowManager;
     private FakeFeatureFactory mFactory;
     private DashboardAdapter mDashboardAdapter;
     private List<Condition> mConditionList;
@@ -87,6 +90,7 @@
         mFactory = FakeFeatureFactory.setupForTest();
         when(mFactory.dashboardFeatureProvider.shouldTintIcon()).thenReturn(true);
 
+        when(mContext.getSystemService(Context.WINDOW_SERVICE)).thenReturn(mWindowManager);
         when(mContext.getResources()).thenReturn(mResources);
         when(mResources.getQuantityString(any(int.class), any(int.class), any()))
                 .thenReturn("");
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
index fc773a7..bac02d3 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
@@ -28,12 +28,15 @@
 
 import android.app.PendingIntent;
 import android.content.Context;
+import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
 import android.service.settings.suggestions.Suggestion;
+import android.view.Display;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.WindowManager;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
 
@@ -67,17 +70,33 @@
     private SettingsActivity mActivity;
     @Mock
     private SuggestionControllerMixin mSuggestionControllerMixin;
+    @Mock
+    private Resources mResources;
+    @Mock
+    private WindowManager mWindowManager;
+
     private FakeFeatureFactory mFeatureFactory;
     private Context mContext;
     private SuggestionAdapter mSuggestionAdapter;
     private DashboardAdapter.DashboardItemHolder mSuggestionHolder;
     private List<Suggestion> mOneSuggestion;
     private List<Suggestion> mTwoSuggestions;
+    private SuggestionAdapter.CardConfig mConfig;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
+        when(mActivity.getSystemService(Context.WINDOW_SERVICE)).thenReturn(mWindowManager);
+        when(mActivity.getResources()).thenReturn(mResources);
+        when(mResources.getDimensionPixelOffset(R.dimen.suggestion_card_inner_margin))
+            .thenReturn(10);
+        when(mResources.getDimensionPixelOffset(R.dimen.suggestion_card_outer_margin))
+            .thenReturn(20);
+        when(mResources.getDimensionPixelOffset(R.dimen.suggestion_card_width_multiple_cards))
+            .thenReturn(120);
+        mConfig = spy(SuggestionAdapter.CardConfig.get(mActivity));
+
         mFeatureFactory = FakeFeatureFactory.setupForTest();
 
         final Suggestion suggestion1 = new Suggestion.Builder("id1")
@@ -275,6 +294,44 @@
         verify(drawable).setTint(colorAccent);
     }
 
+    @Test
+    public void setCardLayout_oneCard_shouldSetCardWidthToMatchParent() {
+        final List<Suggestion> suggestions = makeSuggestions("pkg1");
+        setupSuggestions(mContext, suggestions);
+
+        mConfig.setCardLayout(mSuggestionHolder, 1, 0);
+
+        assertThat(mSuggestionHolder.itemView.getLayoutParams().width)
+            .isEqualTo(LinearLayout.LayoutParams.MATCH_PARENT);
+    }
+
+    @Test
+    public void setCardLayout_twoCards_shouldSetCardWidthToHalfScreenMinusPadding() {
+        final List<Suggestion> suggestions = makeSuggestions("pkg1");
+        setupSuggestions(mContext, suggestions);
+        doReturn(200).when(mConfig).getScreenWidth();
+
+        mConfig.setCardLayout(mSuggestionHolder, 2, 0);
+
+        /*
+         * card width = (screen width - left margin - inner margin - right margin) / 2
+         *            = (200 - 20 - 10 - 20) / 2
+         *            = 75
+         */
+        assertThat(mSuggestionHolder.itemView.getLayoutParams().width).isEqualTo(75);
+    }
+
+
+    @Test
+    public void setCardLayout_multipleCards_shouldSetCardWidthFromResource() {
+        final List<Suggestion> suggestions = makeSuggestions("pkg1");
+        setupSuggestions(mContext, suggestions);
+
+        mConfig.setCardLayout(mSuggestionHolder, 3, 0);
+
+        assertThat(mSuggestionHolder.itemView.getLayoutParams().width).isEqualTo(120);
+    }
+
     private void setupSuggestions(Context context, List<Suggestion> suggestions) {
         mSuggestionAdapter = new SuggestionAdapter(context, mSuggestionControllerMixin,
             null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
