Update suggestion card width.

- instead of using hard-coded width for 1 or 2 cards, they should take
up the whole screen width minus the defined padding, so that when the
device is in landscape mode, they look better.

Change-Id: Ic6485c858c7742a154a6d9b05fff180f161be323
Fixes: 72850225
Test: make RunSettingsRoboTests
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 */);