diff --git a/res/values-sw400dp/dimens.xml b/res/values-sw400dp/dimens.xml index 8d45dd43449..6a0242246e6 100755 --- a/res/values-sw400dp/dimens.xml +++ b/res/values-sw400dp/dimens.xml @@ -23,8 +23,6 @@ 56dp - 384dp - 188dp 180dp 22dp diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 98afa5af12e..fd54548cd2e 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -304,8 +304,6 @@ 24dp - 332dp - 162dp 156dp 14dp 12dp diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java index 62bc148b2cd..b24a9146574 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.Drawable; 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 @@ public class SuggestionAdapter extends RecyclerView.Adapter 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 @@ public class SuggestionAdapter extends RecyclerView.Adapter 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 @@ public class SuggestionAdapter extends RecyclerView.Adapter 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 @@ public class SuggestionAdapter extends RecyclerView.Adapter 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 d25969e4787..cc25b5de902 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.support.v7.widget.RecyclerView; 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 @@ public class DashboardAdapterTest { private Condition mCondition; @Mock private Resources mResources; + @Mock + private WindowManager mWindowManager; private FakeFeatureFactory mFactory; private DashboardAdapter mDashboardAdapter; private List mConditionList; @@ -87,6 +90,7 @@ public class DashboardAdapterTest { 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 fc773a7f817..bac02d37d86 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 static org.mockito.Mockito.when; 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 @@ public class SuggestionAdapterTest { 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 mOneSuggestion; private List 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 @@ public class SuggestionAdapterTest { verify(drawable).setTint(colorAccent); } + @Test + public void setCardLayout_oneCard_shouldSetCardWidthToMatchParent() { + final List 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 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 suggestions = makeSuggestions("pkg1"); + setupSuggestions(mContext, suggestions); + + mConfig.setCardLayout(mSuggestionHolder, 3, 0); + + assertThat(mSuggestionHolder.itemView.getLayoutParams().width).isEqualTo(120); + } + private void setupSuggestions(Context context, List suggestions) { mSuggestionAdapter = new SuggestionAdapter(context, mSuggestionControllerMixin, null /* savedInstanceState */, null /* callback */, null /* lifecycle */);