Support accessibility for battery chart (3)

Support accessibilty read out full timestamp labels instead of the short one, e.g "Sunday" instead of "Sun".

Bug: 242989585
Test: manual
Change-Id: Ica2176ef3f07849d278327b9301f8c318782c2d5
This commit is contained in:
Zaiyue Xue
2022-08-29 18:04:14 +08:00
parent 266ddbf9b4
commit 79311805b6
5 changed files with 167 additions and 84 deletions

View File

@@ -108,10 +108,6 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
private View mBatteryChartViewGroup; private View mBatteryChartViewGroup;
private PreferenceScreen mPreferenceScreen; private PreferenceScreen mPreferenceScreen;
private FooterPreference mFooterPreference; private FooterPreference mFooterPreference;
// Daily view model only saves abbreviated day of week texts (e.g. MON). This field saves the
// full day of week texts (e.g. Monday), which is used in category title and battery detail
// page.
private List<String> mDailyTimestampFullTexts;
private BatteryChartViewModel mDailyViewModel; private BatteryChartViewModel mDailyViewModel;
private List<BatteryChartViewModel> mHourlyViewModels; private List<BatteryChartViewModel> mHourlyViewModels;
@@ -122,6 +118,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
private final MetricsFeatureProvider mMetricsFeatureProvider; private final MetricsFeatureProvider mMetricsFeatureProvider;
private final Handler mHandler = new Handler(Looper.getMainLooper()); private final Handler mHandler = new Handler(Looper.getMainLooper());
@VisibleForTesting
final DailyChartLabelTextGenerator mDailyChartLabelTextGenerator =
new DailyChartLabelTextGenerator();
@VisibleForTesting
final HourlyChartLabelTextGenerator mHourlyChartLabelTextGenerator =
new HourlyChartLabelTextGenerator();
// Preference cache to avoid create new instance each time. // Preference cache to avoid create new instance each time.
@VisibleForTesting @VisibleForTesting
final Map<String, Preference> mPreferenceCache = new HashMap<>(); final Map<String, Preference> mPreferenceCache = new HashMap<>();
@@ -279,29 +282,24 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
getTotalHours(batteryLevelData)); getTotalHours(batteryLevelData));
if (batteryLevelData == null) { if (batteryLevelData == null) {
mDailyTimestampFullTexts = null;
mDailyViewModel = null; mDailyViewModel = null;
mHourlyViewModels = null; mHourlyViewModels = null;
refreshUi(); refreshUi();
return; return;
} }
mDailyTimestampFullTexts = generateTimestampDayOfWeekTexts(
mContext, batteryLevelData.getDailyBatteryLevels().getTimestamps(),
/* isAbbreviation= */ false);
mDailyViewModel = new BatteryChartViewModel( mDailyViewModel = new BatteryChartViewModel(
batteryLevelData.getDailyBatteryLevels().getLevels(), batteryLevelData.getDailyBatteryLevels().getLevels(),
generateTimestampDayOfWeekTexts( batteryLevelData.getDailyBatteryLevels().getTimestamps(),
mContext, batteryLevelData.getDailyBatteryLevels().getTimestamps(), BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS,
/* isAbbreviation= */ true), mDailyChartLabelTextGenerator);
BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS);
mHourlyViewModels = new ArrayList<>(); mHourlyViewModels = new ArrayList<>();
for (BatteryLevelData.PeriodBatteryLevelData hourlyBatteryLevelsPerDay : for (BatteryLevelData.PeriodBatteryLevelData hourlyBatteryLevelsPerDay :
batteryLevelData.getHourlyBatteryLevelsPerDay()) { batteryLevelData.getHourlyBatteryLevelsPerDay()) {
mHourlyViewModels.add(new BatteryChartViewModel( mHourlyViewModels.add(new BatteryChartViewModel(
hourlyBatteryLevelsPerDay.getLevels(), hourlyBatteryLevelsPerDay.getLevels(),
generateTimestampHourTexts( hourlyBatteryLevelsPerDay.getTimestamps(),
mContext, hourlyBatteryLevelsPerDay.getTimestamps()), BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS)); mHourlyChartLabelTextGenerator));
} }
refreshUi(); refreshUi();
} }
@@ -543,8 +541,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
@VisibleForTesting @VisibleForTesting
String getSlotInformation() { String getSlotInformation() {
if (mDailyTimestampFullTexts == null || mDailyViewModel == null if (mDailyViewModel == null || mHourlyViewModels == null) {
|| mHourlyViewModels == null) {
// No data // No data
return null; return null;
} }
@@ -552,17 +549,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
return null; return null;
} }
final String selectedDayText = mDailyTimestampFullTexts.get(mDailyChartIndex); final String selectedDayText = mDailyViewModel.getFullText(mDailyChartIndex);
if (mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) { if (mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) {
return selectedDayText; return selectedDayText;
} }
final String fromHourText = mHourlyViewModels.get(mDailyChartIndex).texts().get( final String selectedHourText = mHourlyViewModels.get(mDailyChartIndex).getFullText(
mHourlyChartIndex); mHourlyChartIndex);
final String toHourText = mHourlyViewModels.get(mDailyChartIndex).texts().get(
mHourlyChartIndex + 1);
final String selectedHourText =
String.format("%s%s%s", fromHourText, mIs24HourFormat ? "-" : " - ", toHourText);
if (isBatteryLevelDataInOneDay()) { if (isBatteryLevelDataInOneDay()) {
return selectedHourText; return selectedHourText;
} }
@@ -663,25 +656,6 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
/ DateUtils.HOUR_IN_MILLIS); / DateUtils.HOUR_IN_MILLIS);
} }
private static List<String> generateTimestampDayOfWeekTexts(@NonNull final Context context,
@NonNull final List<Long> timestamps, final boolean isAbbreviation) {
final ArrayList<String> texts = new ArrayList<>();
for (Long timestamp : timestamps) {
texts.add(ConvertUtils.utcToLocalTimeDayOfWeek(context, timestamp, isAbbreviation));
}
return texts;
}
private static List<String> generateTimestampHourTexts(
@NonNull final Context context, @NonNull final List<Long> timestamps) {
final boolean is24HourFormat = DateFormat.is24HourFormat(context);
final ArrayList<String> texts = new ArrayList<>();
for (Long timestamp : timestamps) {
texts.add(ConvertUtils.utcToLocalTimeHour(context, timestamp, is24HourFormat));
}
return texts;
}
/** Used for {@link AppBatteryPreferenceController}. */ /** Used for {@link AppBatteryPreferenceController}. */
public static List<BatteryDiffEntry> getAppBatteryUsageData(Context context) { public static List<BatteryDiffEntry> getAppBatteryUsageData(Context context) {
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
@@ -727,4 +701,36 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
} }
return null; return null;
} }
private final class DailyChartLabelTextGenerator implements
BatteryChartViewModel.LabelTextGenerator {
@Override
public String generateText(List<Long> timestamps, int index) {
return ConvertUtils.utcToLocalTimeDayOfWeek(mContext,
timestamps.get(index), /* isAbbreviation= */ true);
}
@Override
public String generateFullText(List<Long> timestamps, int index) {
return ConvertUtils.utcToLocalTimeDayOfWeek(mContext,
timestamps.get(index), /* isAbbreviation= */ false);
}
}
private final class HourlyChartLabelTextGenerator implements
BatteryChartViewModel.LabelTextGenerator {
@Override
public String generateText(List<Long> timestamps, int index) {
return ConvertUtils.utcToLocalTimeHour(mContext, timestamps.get(index),
mIs24HourFormat);
}
@Override
public String generateFullText(List<Long> timestamps, int index) {
return index == timestamps.size() - 1
? generateText(timestamps, index)
: String.format("%s%s%s", generateText(timestamps, index),
mIs24HourFormat ? "-" : " - ", generateText(timestamps, index + 1));
}
}
} }

View File

@@ -158,7 +158,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
if (mViewModel != null) { if (mViewModel != null) {
int maxTop = 0; int maxTop = 0;
for (int index = 0; index < mViewModel.size(); index++) { for (int index = 0; index < mViewModel.size(); index++) {
final String text = mViewModel.texts().get(index); final String text = mViewModel.getText(index);
mTextPaint.getTextBounds(text, 0, text.length(), mAxisLabelsBounds.get(index)); mTextPaint.getTextBounds(text, 0, text.length(), mAxisLabelsBounds.get(index));
maxTop = Math.max(maxTop, -mAxisLabelsBounds.get(index).top); maxTop = Math.max(maxTop, -mAxisLabelsBounds.get(index).top);
} }
@@ -490,7 +490,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
Canvas canvas, final int index, final Rect displayArea, final float baselineY) { Canvas canvas, final int index, final Rect displayArea, final float baselineY) {
mTextPaint.setTextAlign(Paint.Align.CENTER); mTextPaint.setTextAlign(Paint.Align.CENTER);
canvas.drawText( canvas.drawText(
mViewModel.texts().get(index), mViewModel.getText(index),
displayArea.centerX(), displayArea.centerX(),
baselineY, baselineY,
mTextPaint); mTextPaint);
@@ -524,9 +524,9 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
mTrapezoidPaint.setColor(isHoverState ? mTrapezoidHoverColor : trapezoidColor); mTrapezoidPaint.setColor(isHoverState ? mTrapezoidHoverColor : trapezoidColor);
final float leftTop = round( final float leftTop = round(
trapezoidBottom - requireNonNull(mViewModel.levels().get(index)) * unitHeight); trapezoidBottom - requireNonNull(mViewModel.getLevel(index)) * unitHeight);
final float rightTop = round(trapezoidBottom final float rightTop = round(trapezoidBottom
- requireNonNull(mViewModel.levels().get(index + 1)) * unitHeight); - requireNonNull(mViewModel.getLevel(index + 1)) * unitHeight);
trapezoidPath.reset(); trapezoidPath.reset();
trapezoidPath.moveTo(mTrapezoidSlots[index].mLeft, trapezoidBottom); trapezoidPath.moveTo(mTrapezoidSlots[index].mLeft, trapezoidBottom);
trapezoidPath.lineTo(mTrapezoidSlots[index].mLeft, leftTop); trapezoidPath.lineTo(mTrapezoidSlots[index].mLeft, leftTop);
@@ -564,8 +564,8 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
private static boolean isTrapezoidValid( private static boolean isTrapezoidValid(
@NonNull BatteryChartViewModel viewModel, int trapezoidIndex) { @NonNull BatteryChartViewModel viewModel, int trapezoidIndex) {
return viewModel.levels().get(trapezoidIndex) != null return viewModel.getLevel(trapezoidIndex) != null
&& viewModel.levels().get(trapezoidIndex + 1) != null; && viewModel.getLevel(trapezoidIndex + 1) != null;
} }
private static boolean isTrapezoidIndexValid( private static boolean isTrapezoidIndexValid(
@@ -617,8 +617,8 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
new AccessibilityNodeInfo(BatteryChartView.this, index); new AccessibilityNodeInfo(BatteryChartView.this, index);
onInitializeAccessibilityNodeInfo(childInfo); onInitializeAccessibilityNodeInfo(childInfo);
childInfo.setClickable(isValidToDraw(mViewModel, index)); childInfo.setClickable(isValidToDraw(mViewModel, index));
childInfo.setText(mViewModel.texts().get(index)); childInfo.setText(mViewModel.getFullText(index));
childInfo.setContentDescription(mViewModel.texts().get(index)); childInfo.setContentDescription(mViewModel.getFullText(index));
final Rect bounds = new Rect(); final Rect bounds = new Rect();
getBoundsOnScreen(bounds, true); getBoundsOnScreen(bounds, true);

View File

@@ -19,6 +19,7 @@ package com.android.settings.fuelgauge.batteryusage;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.util.Preconditions; import androidx.core.util.Preconditions;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
@@ -38,34 +39,59 @@ class BatteryChartViewModel {
CENTER_OF_TRAPEZOIDS, CENTER_OF_TRAPEZOIDS,
} }
interface LabelTextGenerator {
/** Generate the label text. The text may be abbreviated to save space. */
String generateText(List<Long> timestamps, int index);
/** Generate the full text for accessibility. */
String generateFullText(List<Long> timestamps, int index);
}
private final List<Integer> mLevels; private final List<Integer> mLevels;
private final List<String> mTexts; private final List<Long> mTimestamps;
private final AxisLabelPosition mAxisLabelPosition; private final AxisLabelPosition mAxisLabelPosition;
private final LabelTextGenerator mLabelTextGenerator;
private final String[] mTexts;
private final String[] mFullTexts;
private int mSelectedIndex = SELECTED_INDEX_ALL; private int mSelectedIndex = SELECTED_INDEX_ALL;
BatteryChartViewModel( BatteryChartViewModel(@NonNull List<Integer> levels, @NonNull List<Long> timestamps,
@NonNull List<Integer> levels, @NonNull List<String> texts, @NonNull AxisLabelPosition axisLabelPosition,
@NonNull AxisLabelPosition axisLabelPosition) { @NonNull LabelTextGenerator labelTextGenerator) {
Preconditions.checkArgument( Preconditions.checkArgument(
levels.size() == texts.size() && levels.size() >= MIN_LEVELS_DATA_SIZE, levels.size() == timestamps.size() && levels.size() >= MIN_LEVELS_DATA_SIZE,
String.format(Locale.ENGLISH, String.format(Locale.ENGLISH,
"Invalid BatteryChartViewModel levels.size: %d, texts.size: %d.", "Invalid BatteryChartViewModel levels.size: %d, timestamps.size: %d.",
levels.size(), texts.size())); levels.size(), timestamps.size()));
mLevels = levels; mLevels = levels;
mTexts = texts; mTimestamps = timestamps;
mAxisLabelPosition = axisLabelPosition; mAxisLabelPosition = axisLabelPosition;
mLabelTextGenerator = labelTextGenerator;
mTexts = new String[size()];
mFullTexts = new String[size()];
} }
public int size() { public int size() {
return mLevels.size(); return mLevels.size();
} }
public List<Integer> levels() { public Integer getLevel(int index) {
return mLevels; return mLevels.get(index);
} }
public List<String> texts() { public String getText(int index) {
return mTexts; if (mTexts[index] == null) {
mTexts[index] = mLabelTextGenerator.generateText(mTimestamps, index);
}
return mTexts[index];
}
public String getFullText(int index) {
if (mFullTexts[index] == null) {
mFullTexts[index] = mLabelTextGenerator.generateFullText(mTimestamps, index);
}
return mFullTexts[index];
} }
public AxisLabelPosition axisLabelPosition() { public AxisLabelPosition axisLabelPosition() {
@@ -82,7 +108,7 @@ class BatteryChartViewModel {
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(mLevels, mTexts, mSelectedIndex, mAxisLabelPosition); return Objects.hash(mLevels, mTimestamps, mSelectedIndex, mAxisLabelPosition);
} }
@Override @Override
@@ -94,16 +120,26 @@ class BatteryChartViewModel {
} }
final BatteryChartViewModel batteryChartViewModel = (BatteryChartViewModel) other; final BatteryChartViewModel batteryChartViewModel = (BatteryChartViewModel) other;
return Objects.equals(mLevels, batteryChartViewModel.mLevels) return Objects.equals(mLevels, batteryChartViewModel.mLevels)
&& Objects.equals(mTexts, batteryChartViewModel.mTexts) && Objects.equals(mTimestamps, batteryChartViewModel.mTimestamps)
&& mAxisLabelPosition == batteryChartViewModel.mAxisLabelPosition && mAxisLabelPosition == batteryChartViewModel.mAxisLabelPosition
&& mSelectedIndex == batteryChartViewModel.mSelectedIndex; && mSelectedIndex == batteryChartViewModel.mSelectedIndex;
} }
@Override @Override
public String toString() { public String toString() {
return String.format(Locale.ENGLISH, // Generate all the texts and full texts.
"levels: %s,\ntexts: %s,\naxisLabelPosition: %s, selectedIndex: %d", for (int i = 0; i < size(); i++) {
Objects.toString(mLevels), Objects.toString(mTexts), mAxisLabelPosition, getText(i);
mSelectedIndex); getFullText(i);
}
return new StringBuilder()
.append("levels: " + Objects.toString(mLevels))
.append(", timestamps: " + Objects.toString(mTimestamps))
.append(", texts: " + Arrays.toString(mTexts))
.append(", fullTexts: " + Arrays.toString(mFullTexts))
.append(", axisLabelPosition: " + mAxisLabelPosition)
.append(", selectedIndex: " + mSelectedIndex)
.toString();
} }
} }

View File

@@ -19,6 +19,7 @@ package com.android.settings.fuelgauge.batteryusage;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.any; import static org.mockito.Mockito.any;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
@@ -173,22 +174,33 @@ public final class BatteryChartPreferenceControllerTest {
@Test @Test
public void setBatteryChartViewModel_6Hours() { public void setBatteryChartViewModel_6Hours() {
reset(mHourlyChartView);
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6)); mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6));
verify(mDailyChartView, atLeastOnce()).setVisibility(View.GONE); verify(mDailyChartView, atLeastOnce()).setVisibility(View.GONE);
verify(mHourlyChartView, atLeastOnce()).setVisibility(View.VISIBLE); verify(mHourlyChartView, atLeastOnce()).setVisibility(View.VISIBLE);
verify(mHourlyChartView).setViewModel(new BatteryChartViewModel( // Ignore fast refresh ui from the data processor callback.
verify(mHourlyChartView, atLeast(0)).setViewModel(null);
verify(mHourlyChartView, atLeastOnce()).setViewModel(new BatteryChartViewModel(
List.of(100, 97, 95), List.of(100, 97, 95),
List.of("8 AM", "10 AM", "12 PM"), List.of(1619251200000L /* 8 AM */,
BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS)); 1619258400000L /* 10 AM */,
1619265600000L /* 12 PM */),
BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator));
} }
@Test @Test
public void setBatteryChartViewModel_60Hours() { public void setBatteryChartViewModel_60Hours() {
BatteryChartViewModel expectedDailyViewModel = new BatteryChartViewModel( BatteryChartViewModel expectedDailyViewModel = new BatteryChartViewModel(
List.of(100, 83, 59, 41), List.of(100, 83, 59, 41),
List.of("Sat", "Sun", "Mon", "Mon"), // "Sat", "Sun", "Mon", "Mon"
BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS); List.of(1619251200000L /* Sat */,
1619308800000L /* Sun */,
1619395200000L /* Mon */,
1619460000000L /* Mon */),
BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS,
mBatteryChartPreferenceController.mDailyChartLabelTextGenerator);
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(60)); mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(60));
@@ -208,9 +220,17 @@ public final class BatteryChartPreferenceControllerTest {
verify(mDailyChartView).setViewModel(expectedDailyViewModel); verify(mDailyChartView).setViewModel(expectedDailyViewModel);
verify(mHourlyChartView).setViewModel(new BatteryChartViewModel( verify(mHourlyChartView).setViewModel(new BatteryChartViewModel(
List.of(100, 97, 95, 93, 91, 89, 87, 85, 83), List.of(100, 97, 95, 93, 91, 89, 87, 85, 83),
List.of("8 AM", "10 AM", "12 PM", "2 PM", "4 PM", "6 PM", "8 PM", "10 PM", List.of(1619251200000L /* 8 AM */,
"12 AM"), 1619258400000L /* 10 AM */,
BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS)); 1619265600000L /* 12 PM */,
1619272800000L /* 2 PM */,
1619280000000L /* 4 PM */,
1619287200000L /* 6 PM */,
1619294400000L /* 8 PM */,
1619301600000L /* 10 PM */,
1619308800000L /* 12 AM */),
BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator));
reset(mDailyChartView); reset(mDailyChartView);
reset(mHourlyChartView); reset(mHourlyChartView);
@@ -224,9 +244,21 @@ public final class BatteryChartPreferenceControllerTest {
verify(mDailyChartView).setViewModel(expectedDailyViewModel); verify(mDailyChartView).setViewModel(expectedDailyViewModel);
BatteryChartViewModel expectedHourlyViewModel = new BatteryChartViewModel( BatteryChartViewModel expectedHourlyViewModel = new BatteryChartViewModel(
List.of(83, 81, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59), List.of(83, 81, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59),
List.of("12 AM", "2 AM", "4 AM", "6 AM", "8 AM", "10 AM", "12 PM", "2 PM", List.of(1619308800000L /* 12 AM */,
"4 PM", "6 PM", "8 PM", "10 PM", "12 AM"), 1619316000000L /* 2 AM */,
BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS); 1619323200000L /* 4 AM */,
1619330400000L /* 6 AM */,
1619337600000L /* 8 AM */,
1619344800000L /* 10 AM */,
1619352000000L /* 12 PM */,
1619359200000L /* 2 PM */,
1619366400000L /* 4 PM */,
1619373600000L /* 6 PM */,
1619380800000L /* 8 PM */,
1619388000000L /* 10 PM */,
1619395200000L /* 12 AM */),
BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator);
expectedHourlyViewModel.setSelectedIndex(6); expectedHourlyViewModel.setSelectedIndex(6);
verify(mHourlyChartView).setViewModel(expectedHourlyViewModel); verify(mHourlyChartView).setViewModel(expectedHourlyViewModel);
@@ -243,9 +275,18 @@ public final class BatteryChartPreferenceControllerTest {
verify(mDailyChartView).setViewModel(expectedDailyViewModel); verify(mDailyChartView).setViewModel(expectedDailyViewModel);
verify(mHourlyChartView).setViewModel(new BatteryChartViewModel( verify(mHourlyChartView).setViewModel(new BatteryChartViewModel(
List.of(59, 57, 55, 53, 51, 49, 47, 45, 43, 41), List.of(59, 57, 55, 53, 51, 49, 47, 45, 43, 41),
List.of("12 AM", "2 AM", "4 AM", "6 AM", "8 AM", "10 AM", "12 PM", "2 PM", List.of(1619395200000L /* 12 AM */,
"4 PM", "6 PM"), 1619402400000L /* 2 AM */,
BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS)); 1619409600000L /* 4 AM */,
1619416800000L /* 6 AM */,
1619424000000L /* 8 AM */,
1619431200000L /* 10 AM */,
1619438400000L /* 12 PM */,
1619445600000L /* 2 PM */,
1619452800000L /* 4 PM */,
1619460000000L /* 6 PM */),
BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS,
mBatteryChartPreferenceController.mHourlyChartLabelTextGenerator));
} }
@Test @Test

View File

@@ -63,8 +63,8 @@ public final class BatteryChartViewTest {
public void onClick_invokesCallback() { public void onClick_invokesCallback() {
final int originalSelectedIndex = 2; final int originalSelectedIndex = 2;
BatteryChartViewModel batteryChartViewModel = new BatteryChartViewModel( BatteryChartViewModel batteryChartViewModel = new BatteryChartViewModel(
List.of(90, 80, 70, 60), List.of("", "", "", ""), List.of(90, 80, 70, 60), List.of(0L, 0L, 0L, 0L),
BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS); BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS, null);
batteryChartViewModel.setSelectedIndex(originalSelectedIndex); batteryChartViewModel.setSelectedIndex(originalSelectedIndex);
mBatteryChartView.setViewModel(batteryChartViewModel); mBatteryChartView.setViewModel(batteryChartViewModel);
for (int i = 0; i < mBatteryChartView.mTrapezoidSlots.length; i++) { for (int i = 0; i < mBatteryChartView.mTrapezoidSlots.length; i++) {