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
This commit is contained in:
Doris Ling
2018-02-05 17:55:16 -08:00
parent 3ded640895
commit c627161ca6
5 changed files with 84 additions and 15 deletions

View File

@@ -23,8 +23,6 @@
<dimen name="support_escalation_card_padding_end">56dp</dimen> <dimen name="support_escalation_card_padding_end">56dp</dimen>
<!-- Suggestion cards--> <!-- 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_width_multiple_cards">180dp</dimen>
<dimen name="suggestion_card_padding_bottom_one_card">22dp</dimen> <dimen name="suggestion_card_padding_bottom_one_card">22dp</dimen>

View File

@@ -304,8 +304,6 @@
<!-- Suggestion cards size and padding --> <!-- Suggestion cards size and padding -->
<dimen name="suggestion_card_icon_size">24dp</dimen> <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_width_multiple_cards">156dp</dimen>
<dimen name="suggestion_card_outer_margin">14dp</dimen> <dimen name="suggestion_card_outer_margin">14dp</dimen>
<dimen name="suggestion_card_inner_margin">12dp</dimen> <dimen name="suggestion_card_inner_margin">12dp</dimen>

View File

@@ -23,12 +23,15 @@ import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.os.Bundle; import android.os.Bundle;
import android.service.settings.suggestions.Suggestion; import android.service.settings.suggestions.Suggestion;
import android.support.annotation.VisibleForTesting;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@@ -117,7 +120,7 @@ public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder>
mConfig.setCardLayout(holder, suggestionCount, position); mConfig.setCardLayout(holder, suggestionCount, position);
final Icon icon = suggestion.getIcon(); final Icon icon = suggestion.getIcon();
final Drawable drawable = mCache.getIcon(icon); 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)); drawable.setTint(Utils.getColorAccent(mContext));
} }
holder.icon.setImageDrawable(drawable); holder.icon.setImageDrawable(drawable);
@@ -226,28 +229,27 @@ public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder>
return mSuggestions; return mSuggestions;
} }
private static class CardConfig { @VisibleForTesting
static class CardConfig {
// Card start/end margin // Card start/end margin
private final int mMarginInner; private final int mMarginInner;
private final int mMarginOuter; private final int mMarginOuter;
// Card width for different numbers of cards // Card width if there are more than 2 cards
private final int mWidthSingleCard;
private final int mWidthTwoCards;
private final int mWidthMultipleCards; private final int mWidthMultipleCards;
// padding between icon and title // padding between icon and title
private final int mPaddingTitleTopSingleCard; private final int mPaddingTitleTopSingleCard;
private final int mPaddingTitleTopMultipleCards; private final int mPaddingTitleTopMultipleCards;
private final WindowManager mWindowManager;
private static CardConfig sConfig; private static CardConfig sConfig;
private CardConfig(Context context) { private CardConfig(Context context) {
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
final Resources res = context.getResources(); final Resources res = context.getResources();
mMarginInner = mMarginInner =
res.getDimensionPixelOffset(R.dimen.suggestion_card_inner_margin); res.getDimensionPixelOffset(R.dimen.suggestion_card_inner_margin);
mMarginOuter = mMarginOuter =
res.getDimensionPixelOffset(R.dimen.suggestion_card_outer_margin); 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 = mWidthMultipleCards =
res.getDimensionPixelOffset(R.dimen.suggestion_card_width_multiple_cards); res.getDimensionPixelOffset(R.dimen.suggestion_card_width_multiple_cards);
mPaddingTitleTopSingleCard = mPaddingTitleTopSingleCard =
@@ -263,12 +265,12 @@ public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder>
return sConfig; return sConfig;
} }
private void setCardLayout(DashboardItemHolder holder, int suggestionCount, @VisibleForTesting
int position) { void setCardLayout(DashboardItemHolder holder, int suggestionCount, int position) {
final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
suggestionCount == 1 suggestionCount == 1
? mWidthSingleCard : suggestionCount == 2 ? LinearLayout.LayoutParams.MATCH_PARENT : suggestionCount == 2
? mWidthTwoCards : mWidthMultipleCards, ? getWidthForTwoCrads() : mWidthMultipleCards,
LinearLayout.LayoutParams.WRAP_CONTENT); LinearLayout.LayoutParams.WRAP_CONTENT);
if (suggestionCount == 1) { if (suggestionCount == 1) {
params.setMarginStart(mMarginOuter); params.setMarginStart(mMarginOuter);
@@ -281,6 +283,16 @@ public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder>
holder.itemView.setLayoutParams(params); 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;
}
} }
} }

View File

@@ -35,6 +35,7 @@ import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.widget.TextView; import android.widget.TextView;
import com.android.settings.R; import com.android.settings.R;
@@ -77,6 +78,8 @@ public class DashboardAdapterTest {
private Condition mCondition; private Condition mCondition;
@Mock @Mock
private Resources mResources; private Resources mResources;
@Mock
private WindowManager mWindowManager;
private FakeFeatureFactory mFactory; private FakeFeatureFactory mFactory;
private DashboardAdapter mDashboardAdapter; private DashboardAdapter mDashboardAdapter;
private List<Condition> mConditionList; private List<Condition> mConditionList;
@@ -87,6 +90,7 @@ public class DashboardAdapterTest {
mFactory = FakeFeatureFactory.setupForTest(); mFactory = FakeFeatureFactory.setupForTest();
when(mFactory.dashboardFeatureProvider.shouldTintIcon()).thenReturn(true); when(mFactory.dashboardFeatureProvider.shouldTintIcon()).thenReturn(true);
when(mContext.getSystemService(Context.WINDOW_SERVICE)).thenReturn(mWindowManager);
when(mContext.getResources()).thenReturn(mResources); when(mContext.getResources()).thenReturn(mResources);
when(mResources.getQuantityString(any(int.class), any(int.class), any())) when(mResources.getQuantityString(any(int.class), any(int.class), any()))
.thenReturn(""); .thenReturn("");

View File

@@ -28,12 +28,15 @@ import static org.mockito.Mockito.when;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.service.settings.suggestions.Suggestion; import android.service.settings.suggestions.Suggestion;
import android.view.Display;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@@ -67,17 +70,33 @@ public class SuggestionAdapterTest {
private SettingsActivity mActivity; private SettingsActivity mActivity;
@Mock @Mock
private SuggestionControllerMixin mSuggestionControllerMixin; private SuggestionControllerMixin mSuggestionControllerMixin;
@Mock
private Resources mResources;
@Mock
private WindowManager mWindowManager;
private FakeFeatureFactory mFeatureFactory; private FakeFeatureFactory mFeatureFactory;
private Context mContext; private Context mContext;
private SuggestionAdapter mSuggestionAdapter; private SuggestionAdapter mSuggestionAdapter;
private DashboardAdapter.DashboardItemHolder mSuggestionHolder; private DashboardAdapter.DashboardItemHolder mSuggestionHolder;
private List<Suggestion> mOneSuggestion; private List<Suggestion> mOneSuggestion;
private List<Suggestion> mTwoSuggestions; private List<Suggestion> mTwoSuggestions;
private SuggestionAdapter.CardConfig mConfig;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application); 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(); mFeatureFactory = FakeFeatureFactory.setupForTest();
final Suggestion suggestion1 = new Suggestion.Builder("id1") final Suggestion suggestion1 = new Suggestion.Builder("id1")
@@ -275,6 +294,44 @@ public class SuggestionAdapterTest {
verify(drawable).setTint(colorAccent); 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) { private void setupSuggestions(Context context, List<Suggestion> suggestions) {
mSuggestionAdapter = new SuggestionAdapter(context, mSuggestionControllerMixin, mSuggestionAdapter = new SuggestionAdapter(context, mSuggestionControllerMixin,
null /* savedInstanceState */, null /* callback */, null /* lifecycle */); null /* savedInstanceState */, null /* callback */, null /* lifecycle */);