Implements the buttons layout for the extra defend

Bug: 235246949
Test: make RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.fuelgauge.*
Test: make RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.widget.CardPreferenceTest
Test: manual test
Change-Id: I1dc4ab31adf85c684a4c09bd6c9bcfb54b52dc3c
This commit is contained in:
Pajace Chen
2022-08-16 18:12:01 +08:00
committed by Wesley Wang
parent 662e5722b3
commit f3496399dd
13 changed files with 662 additions and 13 deletions

View File

@@ -41,7 +41,8 @@ public class BatteryDefenderDetectorTest {
mBatteryInfo.discharging = false;
mBatteryDefenderDetector = new BatteryDefenderDetector(mBatteryInfo);
mBatteryDefenderDetector = new BatteryDefenderDetector(
mBatteryInfo, /* extraDefend= */ false);
}
@Test

View File

@@ -17,13 +17,25 @@ package com.android.settings.fuelgauge.batterytip.tips;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.util.Log;
import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.widget.CardPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.Before;
@@ -33,6 +45,7 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadows.ShadowLog;
@RunWith(RobolectricTestRunner.class)
public class BatteryDefenderTipTest {
@@ -43,6 +56,8 @@ public class BatteryDefenderTipTest {
private MetricsFeatureProvider mMetricsFeatureProvider;
@Mock private BatteryTip mBatteryTip;
@Mock private Preference mPreference;
@Mock private CardPreference mCardPreference;
@Before
public void setUp() {
@@ -52,6 +67,9 @@ public class BatteryDefenderTipTest {
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
mContext = RuntimeEnvironment.application;
mBatteryDefenderTip = new BatteryDefenderTip(BatteryTip.StateType.NEW);
when(mPreference.getContext()).thenReturn(mContext);
when(mCardPreference.getContext()).thenReturn(mContext);
}
@Test
@@ -61,11 +79,19 @@ public class BatteryDefenderTipTest {
}
@Test
public void getSummary_showSummary() {
public void getSummary_notExtraDefended_showNonExtraDefendedSummary() {
assertThat(mBatteryDefenderTip.getSummary(mContext))
.isEqualTo(mContext.getString(R.string.battery_tip_limited_temporarily_summary));
}
@Test
public void getSummary_extraDefended_showExtraDefendedSummary() {
BatteryDefenderTip defenderTip = new BatteryDefenderTip(
BatteryTip.StateType.NEW, /* extraDefended= */ true);
assertThat(defenderTip.getSummary(mContext).toString()).isEqualTo("12%");
}
@Test
public void getIcon_showIcon() {
assertThat(mBatteryDefenderTip.getIconId())
@@ -80,4 +106,94 @@ public class BatteryDefenderTipTest {
verify(mMetricsFeatureProvider).action(mContext,
SettingsEnums.ACTION_BATTERY_DEFENDER_TIP, mBatteryTip.mState);
}
@Test
public void updatePreference_castFail_logErrorMessage() {
mBatteryDefenderTip.updatePreference(mPreference);
assertThat(getLastErrorLog()).isEqualTo("cast Preference to CardPreference failed");
}
@Test
public void updatePreference_shouldSetPrimaryButtonText() {
String expectedText = mContext.getString(R.string.battery_tip_charge_to_full_button);
mBatteryDefenderTip.updatePreference(mCardPreference);
verify(mCardPreference).setPrimaryButtonText(expectedText);
}
@Test
public void updatePreference_shouldSetSecondaryButtonText() {
String expected = mContext.getString(R.string.see_more);
mBatteryDefenderTip.updatePreference(mCardPreference);
verify(mCardPreference).setSecondaryButtonText(expected);
}
@Test
public void updatePreference_shouldSetSecondaryButtonVisible() {
mBatteryDefenderTip.updatePreference(mCardPreference);
verify(mCardPreference).setSecondaryButtonVisible(true);
}
@Test
public void updatePreference_whenCharging_setPrimaryButtonVisibleToBeTrue() {
fakeDeviceIsCharging(true);
mBatteryDefenderTip.updatePreference(mCardPreference);
verify(mCardPreference).setPrimaryButtonVisible(true);
}
@Test
public void updatePreference_whenNotCharging_setPrimaryButtonVisibleToBeFalse() {
fakeDeviceIsCharging(false);
mBatteryDefenderTip.updatePreference(mCardPreference);
verify(mCardPreference).setPrimaryButtonVisible(false);
}
@Test
public void updatePreference_whenGetChargingStatusFailed_setPrimaryButtonVisibleToBeFalse() {
fakeGetChargingStatusFailed();
mBatteryDefenderTip.updatePreference(mCardPreference);
verify(mCardPreference).setPrimaryButtonVisible(false);
}
private void fakeDeviceIsCharging(boolean charging) {
int charged = charging ? 1 : 0; // 1 means charging, 0:not charging
Intent batteryChangedIntent = new Intent(Intent.ACTION_BATTERY_CHANGED);
batteryChangedIntent.putExtra(BatteryManager.EXTRA_PLUGGED, charged);
Context mockContext = mock(Context.class);
when(mockContext.getString(anyInt())).thenReturn("fake_string");
when(mCardPreference.getContext()).thenReturn(mockContext);
when(mockContext.registerReceiver(eq(null), any(IntentFilter.class)))
.thenReturn(batteryChangedIntent);
}
private void fakeGetChargingStatusFailed() {
Context mockContext = mock(Context.class);
when(mockContext.getString(anyInt())).thenReturn("fake_string");
when(mCardPreference.getContext()).thenReturn(mockContext);
when(mockContext.registerReceiver(eq(null), any(IntentFilter.class))).thenReturn(null);
}
private String getLastErrorLog() {
return ShadowLog.getLogsForTag(BatteryDefenderTip.class.getSimpleName()).stream()
.filter(log -> log.type == Log.ERROR)
.reduce((first, second) -> second)
.orElse(createErrorLog("No Error Log"))
.msg;
}
private ShadowLog.LogItem createErrorLog(String msg) {
return new ShadowLog.LogItem(Log.ERROR, "tag", msg, null);
}
}

View File

@@ -16,9 +16,18 @@
package com.android.settings.widget;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import android.content.Context;
import android.view.View;
import android.widget.Button;
import androidx.preference.PreferenceViewHolder;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
@@ -26,23 +35,301 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class)
public class CardPreferenceTest {
private Context mContext;
private CardPreference mCardPreference;
private PreferenceViewHolder mHolder;
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
mContext.setTheme(R.style.SettingsPreferenceTheme);
mCardPreference = new CardPreference(mContext);
Context context = ApplicationProvider.getApplicationContext();
context.setTheme(R.style.Theme_Settings);
mCardPreference = new CardPreference(context);
View rootView = View.inflate(context, R.layout.card_preference_layout, /* parent= */ null);
mHolder = PreferenceViewHolder.createInstanceForTests(rootView);
}
@Test
public void getLayoutResource() {
assertThat(mCardPreference.getLayoutResource()).isEqualTo(R.layout.card_preference_layout);
public void newACardPreference_layoutResourceShouldBeCardPreferenceLayout() {
Context context = ApplicationProvider.getApplicationContext();
context.setTheme(R.style.SettingsPreferenceTheme);
CardPreference cardPreference = new CardPreference(context);
assertThat(cardPreference.getLayoutResource()).isEqualTo(R.layout.card_preference_layout);
}
@Test
public void onBindViewHolder_noButtonVisible_buttonsLayoutShouldBeGone() {
mCardPreference.onBindViewHolder(mHolder);
assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE);
}
@Test
public void onBindViewHolder_setPrimaryButtonVisibility_buttonsLayoutShouldBeVisible() {
mCardPreference.setPrimaryButtonVisible(true);
mCardPreference.onBindViewHolder(mHolder);
assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(VISIBLE);
}
@Test
public void onBindViewHolder_setPrimaryButtonVisibility_shouldApplyToPrimaryButton() {
mCardPreference.setPrimaryButtonVisible(true);
mCardPreference.onBindViewHolder(mHolder);
assertThat(getPrimaryButton().getVisibility()).isEqualTo(VISIBLE);
}
@Test
public void onBindViewHolder_setSecondaryButtonVisibility_buttonsLayoutShouldBeVisible() {
mCardPreference.setSecondaryButtonVisible(true);
mCardPreference.onBindViewHolder(mHolder);
assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(VISIBLE);
}
@Test
public void onBindViewHolder_setSecondaryButtonVisibility_shouldApplyToSecondaryButton() {
mCardPreference.setSecondaryButtonVisible(true);
mCardPreference.onBindViewHolder(mHolder);
assertThat(getSecondaryButton().getVisibility()).isEqualTo(VISIBLE);
}
@Test
public void onBindViewHolder_setPrimaryButtonText_shouldApplyToPrimaryButton() {
String expectedText = "primary-button";
mCardPreference.setPrimaryButtonText(expectedText);
mCardPreference.onBindViewHolder(mHolder);
assertThat(getPrimaryButton().getText().toString()).isEqualTo(expectedText);
}
@Test
public void onBindViewHolder_setSecondaryButtonText_shouldApplyToSecondaryButton() {
String expectedText = "secondary-button";
mCardPreference.setSecondaryButtonText(expectedText);
mCardPreference.onBindViewHolder(mHolder);
assertThat(getSecondaryButton().getText().toString()).isEqualTo(expectedText);
}
@Test
public void onBindViewHolder_initialTextForPrimaryButtonShouldBeEmpty() {
mCardPreference.onBindViewHolder(mHolder);
assertThat(getPrimaryButton().getText().toString()).isEqualTo("");
}
@Test
public void onBindViewHolder_initialTextForSecondaryButtonShouldBeEmpty() {
mCardPreference.onBindViewHolder(mHolder);
assertThat(getSecondaryButton().getText().toString()).isEqualTo("");
}
@Test
public void performClickOnPrimaryButton_shouldCalledClickListener() {
final boolean[] hasCalled = {false};
View.OnClickListener clickListener = v -> hasCalled[0] = true;
mCardPreference.setPrimaryButtonClickListener(clickListener);
mCardPreference.onBindViewHolder(mHolder);
getPrimaryButton().performClick();
assertThat(hasCalled[0]).isTrue();
}
@Test
public void performClickOnSecondaryButton_shouldCalledClickListener() {
final boolean[] hasCalled = {false};
View.OnClickListener clickListener = v -> hasCalled[0] = true;
mCardPreference.setSecondaryButtonClickListener(clickListener);
mCardPreference.onBindViewHolder(mHolder);
getSecondaryButton().performClick();
assertThat(hasCalled[0]).isTrue();
}
@Test
public void onBindViewHolder_primaryButtonDefaultIsGone() {
mCardPreference.onBindViewHolder(mHolder);
assertThat(getPrimaryButton().getVisibility()).isEqualTo(GONE);
}
@Test
public void onBindViewHolder_secondaryButtonDefaultIsGone() {
mCardPreference.onBindViewHolder(mHolder);
assertThat(getSecondaryButton().getVisibility()).isEqualTo(GONE);
}
@Test
public void setPrimaryButtonVisibility_setTrueAfterBindViewHolder_shouldBeVisible() {
mCardPreference.setPrimaryButtonVisible(false);
mCardPreference.onBindViewHolder(mHolder);
mCardPreference.setPrimaryButtonVisible(true);
assertThat(getPrimaryButton().getVisibility()).isEqualTo(VISIBLE);
}
@Test
public void setPrimaryButtonText_setAfterBindViewHolder_setOnUi() {
String expectedText = "123456";
mCardPreference.onBindViewHolder(mHolder);
mCardPreference.setPrimaryButtonText(expectedText);
assertThat(getPrimaryButton().getText().toString()).isEqualTo(expectedText);
}
@Test
public void setPrimaryButtonText_setNull_shouldBeEmptyText() {
final String emptyString = "";
mCardPreference.setPrimaryButtonText("1234");
mCardPreference.onBindViewHolder(mHolder);
mCardPreference.setPrimaryButtonText(null);
assertThat(getPrimaryButton().getText().toString()).isEqualTo(emptyString);
}
@Test
public void setPrimaryButtonClickListener_setAfterOnBindViewHolder() {
final String[] hasCalled = {""};
String expectedClickedResult = "was called";
View.OnClickListener clickListener = v -> hasCalled[0] = expectedClickedResult;
mCardPreference.onBindViewHolder(mHolder);
mCardPreference.setPrimaryButtonClickListener(clickListener);
getPrimaryButton().performClick();
assertThat(hasCalled[0]).isEqualTo(expectedClickedResult);
}
@Test
public void setPrimaryButtonClickListener_setNull_shouldClearTheOnClickListener() {
final String[] hasCalled = {"not called"};
View.OnClickListener clickListener = v -> hasCalled[0] = "called once";
mCardPreference.setPrimaryButtonClickListener(clickListener);
mCardPreference.onBindViewHolder(mHolder);
mCardPreference.setPrimaryButtonClickListener(null);
getPrimaryButton().performClick();
assertThat(hasCalled[0]).isEqualTo("not called");
}
@Test
public void setSecondaryButtonVisibility_setTrueAfterBindViewHolder_shouldBeVisible() {
mCardPreference.setSecondaryButtonVisible(false);
mCardPreference.onBindViewHolder(mHolder);
mCardPreference.setSecondaryButtonVisible(true);
assertThat(getSecondaryButton().getVisibility()).isEqualTo(VISIBLE);
}
@Test
public void setSecondaryButtonText_setAfterBindViewHolder_setOnUi() {
String expectedText = "10101010";
mCardPreference.onBindViewHolder(mHolder);
mCardPreference.setSecondaryButtonText(expectedText);
assertThat(getSecondaryButton().getText().toString()).isEqualTo(expectedText);
}
@Test
public void setSecondaryButtonText_setNull_shouldBeEmptyText() {
String emptyString = "";
mCardPreference.setSecondaryButtonText("1234");
mCardPreference.onBindViewHolder(mHolder);
mCardPreference.setSecondaryButtonText(null);
assertThat(getSecondaryButton().getText().toString()).isEqualTo(emptyString);
}
@Test
public void setSecondaryButtonClickListener_setAfterOnBindViewHolder() {
final String[] hasCalled = {""};
String expectedClickedResult = "2nd was called";
View.OnClickListener clickListener = v -> hasCalled[0] = expectedClickedResult;
mCardPreference.onBindViewHolder(mHolder);
mCardPreference.setSecondaryButtonClickListener(clickListener);
getSecondaryButton().performClick();
assertThat(hasCalled[0]).isEqualTo(expectedClickedResult);
}
@Test
public void setSecondaryButtonClickListener_setNull_shouldClearTheOnClickListener() {
final String[] hasCalled = {"not called"};
View.OnClickListener clickListener = v -> hasCalled[0] = "called once";
mCardPreference.setSecondaryButtonClickListener(clickListener);
mCardPreference.onBindViewHolder(mHolder);
mCardPreference.setSecondaryButtonClickListener(null);
getSecondaryButton().performClick();
assertThat(hasCalled[0]).isEqualTo("not called");
}
@Test
public void
setPrimaryButtonVisibility_onlyPrimaryButtonVisible_setGone_buttonGroupShouldBeGone() {
mCardPreference.setPrimaryButtonVisible(true);
mCardPreference.setSecondaryButtonVisible(false);
mCardPreference.onBindViewHolder(mHolder);
assertWithMessage("PreCondition: buttonsView should be Visible")
.that(getCardPreferenceButtonsView().getVisibility())
.isEqualTo(VISIBLE);
mCardPreference.setPrimaryButtonVisible(false);
assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE);
}
@Test
public void
setSecondaryButtonVisibility_only2ndButtonVisible_setGone_buttonGroupShouldBeGone() {
mCardPreference.setPrimaryButtonVisible(false);
mCardPreference.setSecondaryButtonVisible(true);
mCardPreference.onBindViewHolder(mHolder);
assertWithMessage("PreCondition: buttonsView should be Visible")
.that(getCardPreferenceButtonsView().getVisibility())
.isEqualTo(VISIBLE);
mCardPreference.setSecondaryButtonVisible(false);
assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE);
}
private View getCardPreferenceButtonsView() {
return mHolder.findViewById(R.id.card_preference_buttons);
}
private Button getPrimaryButton() {
return (Button) mHolder.findViewById(android.R.id.button1);
}
private Button getSecondaryButton() {
return (Button) mHolder.findViewById(android.R.id.button2);
}
}