From b0802bdcb6c26fa8eb1c5a24dc3029f44829655b Mon Sep 17 00:00:00 2001 From: Jan Nordqvist Date: Wed, 18 Apr 2018 15:20:03 -0700 Subject: [PATCH] Hiding data remaining text when available space is too small. Bug: 77799887 Test: manual Test: make RunSettingsRoboTests Change-Id: I53390a36e74f9832bdc7757cd67d51064e8a77f3 --- res/layout/data_usage_summary_preference.xml | 4 +- .../datausage/DataUsageSummaryPreference.java | 6 +++ .../settings/datausage/MeasurableLinearLayout.java | 47 +++++++++++++++++++ .../datausage/DataUsageSummaryPreferenceTest.java | 53 ++++++++++++++++++++-- 4 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 src/com/android/settings/datausage/MeasurableLinearLayout.java diff --git a/res/layout/data_usage_summary_preference.xml b/res/layout/data_usage_summary_preference.xml index 1432c726ee..6af159a01b 100644 --- a/res/layout/data_usage_summary_preference.xml +++ b/res/layout/data_usage_summary_preference.xml @@ -34,7 +34,7 @@ android:textColor="?android:attr/colorAccent" android:text="@string/data_usage_title" /> - - + = 0 && mDataplanSize > 0L) { TextView usageRemainingField = (TextView) holder.findViewById(R.id.data_remaining_view); long dataRemaining = mDataplanSize - mDataplanUse; @@ -243,6 +246,9 @@ public class DataUsageSummaryPreference extends Preference { usageRemainingField.setTextColor( Utils.getColorAttr(getContext(), android.R.attr.colorError)); } + layout.setChildren(usageNumberField, usageRemainingField); + } else { + layout.setChildren(usageNumberField, null); } } diff --git a/src/com/android/settings/datausage/MeasurableLinearLayout.java b/src/com/android/settings/datausage/MeasurableLinearLayout.java new file mode 100644 index 0000000000..f165be7f58 --- /dev/null +++ b/src/com/android/settings/datausage/MeasurableLinearLayout.java @@ -0,0 +1,47 @@ +package com.android.settings.datausage; + +import android.annotation.Nullable; +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.LinearLayout; + +public class MeasurableLinearLayout extends LinearLayout { + private View mFixedView; + private View mDisposableView; + + public MeasurableLinearLayout(Context context) { + super(context, null); + } + + public MeasurableLinearLayout(Context context, @Nullable AttributeSet attrs) { + super(context, attrs, 0); + } + + public MeasurableLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr, 0); + } + + public MeasurableLinearLayout(Context context, AttributeSet attrs, + int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + if (mDisposableView != null && getMeasuredWidth() - mFixedView.getMeasuredWidth() + < mDisposableView.getMeasuredWidth()) { + mDisposableView.setVisibility(GONE); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } else if (mDisposableView != null && mDisposableView.getVisibility() != VISIBLE) { + mDisposableView.setVisibility(VISIBLE); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + + public void setChildren(View fixedView, View disposableView) { + mFixedView = fixedView; + mDisposableView = disposableView; + } +} \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java index 951192401d..f6c9f204f2 100644 --- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java @@ -17,6 +17,10 @@ package com.android.settings.datausage; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; import android.app.Activity; import android.content.ComponentName; @@ -82,13 +86,13 @@ public class DataUsageSummaryPreferenceTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; + mContext = spy(RuntimeEnvironment.application); mSummaryPreference = new DataUsageSummaryPreference(mContext, null /* attrs */); LayoutInflater inflater = LayoutInflater.from(mContext); View view = inflater.inflate(mSummaryPreference.getLayoutResource(), null /* root */, false /* attachToRoot */); - mHolder = PreferenceViewHolder.createInstanceForTests(view); + mHolder = spy(PreferenceViewHolder.createInstanceForTests(view)); final long now = System.currentTimeMillis(); mCycleEnd = now + CYCLE_DURATION_MILLIS; @@ -378,6 +382,7 @@ public class DataUsageSummaryPreferenceTest { bindViewHolder(); assertThat(mDataUsed.getText().toString()).isEqualTo("1.00 MB used"); assertThat(mDataRemaining.getText().toString()).isEqualTo("9.00 MB left"); + assertThat(mDataRemaining.getVisibility()).isEqualTo(View.VISIBLE); final int colorId = Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorAccent); assertThat(mDataRemaining.getCurrentTextColor()).isEqualTo(colorId); } @@ -436,6 +441,46 @@ public class DataUsageSummaryPreferenceTest { } @Test + public void testSetUsageInfo_withOverflowStrings_dataRemainingNotShown() { + LayoutInflater inflater = LayoutInflater.from(mContext); + View view = inflater.inflate(mSummaryPreference.getLayoutResource(), null /* root */, + false /* attachToRoot */); + + TextView dataUsed = spy(new TextView(mContext)); + TextView dataRemaining = spy(new TextView(mContext)); + doReturn(dataUsed).when(mHolder).findViewById(R.id.data_usage_view); + doReturn(dataRemaining).when(mHolder).findViewById(R.id.data_remaining_view); + + mSummaryPreference.setUsageInfo(mCycleEnd, mUpdateTime, DUMMY_CARRIER, 1 /* numPlans */, + new Intent()); + mSummaryPreference.setUsageNumbers( + BillingCycleSettings.MIB_IN_BYTES, + 10 * BillingCycleSettings.MIB_IN_BYTES, + true /* hasMobileData */); + + when(mContext.getResources()).thenCallRealMethod(); + when(mContext.getText(R.string.data_used_formatted)) + .thenReturn("^1 ^2 used with long trailing text"); + when(mContext.getText(R.string.data_remaining)).thenReturn("^1 left"); + + bindViewHolder(); + + doReturn(500).when(dataUsed).getMeasuredWidth(); + doReturn(500).when(dataRemaining).getMeasuredWidth(); + + assertThat(dataRemaining.getVisibility()).isEqualTo(View.VISIBLE); + + MeasurableLinearLayout layout = + (MeasurableLinearLayout) mHolder.findViewById(R.id.usage_layout); + layout.measure( + View.MeasureSpec.makeMeasureSpec(800, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(1000, View.MeasureSpec.EXACTLY)); + + assertThat(dataUsed.getText().toString()).isEqualTo("1.00 MB used with long trailing text"); + assertThat(dataRemaining.getVisibility()).isEqualTo(View.GONE); + } + + @Test public void testSetWifiMode_withUsageInfo_dataUsageShown() { final int daysLeft = 3; final long cycleEnd = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(daysLeft) @@ -483,8 +528,8 @@ public class DataUsageSummaryPreferenceTest { mCycleTime = (TextView) mHolder.findViewById(R.id.cycle_left_time); mCarrierInfo = (TextView) mHolder.findViewById(R.id.carrier_and_update); mDataLimits = (TextView) mHolder.findViewById(R.id.data_limits); - mDataUsed = (TextView) mHolder.findViewById(R.id.data_usage_view); - mDataRemaining = (TextView) mHolder.findViewById(R.id.data_remaining_view); + mDataUsed = spy((TextView) mHolder.findViewById(R.id.data_usage_view)); + mDataRemaining = spy((TextView) mHolder.findViewById(R.id.data_remaining_view)); mLaunchButton = (Button) mHolder.findViewById(R.id.launch_mdp_app_button); mLabelBar = (LinearLayout) mHolder.findViewById(R.id.label_bar); mLabel1 = (TextView) mHolder.findViewById(R.id.text1); -- 2.11.0