From 6da5e32bd89d7255b9e40bfa94d5d27872b7a1c9 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Fri, 4 Jan 2019 12:41:58 -0800 Subject: [PATCH 1/2] Add CardPreference in battery settings page This is MatrialCardView styled preference that only support icon, title and summary. Bug: 119618813 Test: RunSettingsRoboTests Change-Id: Ibbf9eb2a01c8ee0579e1553ead6e43e96531c92a --- res/layout/card_preference_layout.xml | 30 ++++++++++++ res/values/attrs.xml | 2 + res/values/styles_preference.xml | 5 ++ .../fuelgauge/batterytip/tips/BatteryTip.java | 3 +- .../settings/widget/CardPreference.java | 39 +++++++++++++++ .../settings/widget/CardPreferenceTest.java | 49 +++++++++++++++++++ 6 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 res/layout/card_preference_layout.xml create mode 100644 src/com/android/settings/widget/CardPreference.java create mode 100644 tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java diff --git a/res/layout/card_preference_layout.xml b/res/layout/card_preference_layout.xml new file mode 100644 index 00000000000..d4a06d6c455 --- /dev/null +++ b/res/layout/card_preference_layout.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/res/values/attrs.xml b/res/values/attrs.xml index b2d5468f854..c7bf1c7576c 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -54,6 +54,8 @@ + + diff --git a/res/values/styles_preference.xml b/res/values/styles_preference.xml index f25289df748..e7e0c97d4bc 100644 --- a/res/values/styles_preference.xml +++ b/res/values/styles_preference.xml @@ -21,6 +21,7 @@ + + diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java index 841a27ea63c..64737a7c9f3 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java @@ -26,6 +26,7 @@ import androidx.annotation.IntDef; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; +import com.android.settings.widget.CardPreference; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import java.lang.annotation.Retention; @@ -147,7 +148,7 @@ public abstract class BatteryTip implements Comparable, Parcelable { public abstract void log(Context context, MetricsFeatureProvider metricsFeatureProvider); public Preference buildPreference(Context context) { - Preference preference = new Preference(context); + Preference preference = new CardPreference(context); preference.setKey(getKey()); preference.setTitle(getTitle(context)); diff --git a/src/com/android/settings/widget/CardPreference.java b/src/com/android/settings/widget/CardPreference.java new file mode 100644 index 00000000000..20ea7109e48 --- /dev/null +++ b/src/com/android/settings/widget/CardPreference.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.widget; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.preference.Preference; + +import com.android.settings.R; + +import com.google.android.material.card.MaterialCardView; + +/** + * Preference that wrapped by {@link MaterialCardView}, only support to set icon, title and summary + */ +public class CardPreference extends Preference { + public CardPreference(Context context) { + this(context, null /* attrs */); + } + + public CardPreference(Context context, AttributeSet attrs) { + super(context, attrs, R.attr.cardPreferenceStyle); + } +} diff --git a/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java new file mode 100644 index 00000000000..730489795fe --- /dev/null +++ b/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.widget; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; + +import com.android.settings.R; + +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; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mContext.setTheme(R.style.PreferenceTheme); + mCardPreference = new CardPreference(mContext); + } + + @Test + public void getLayoutResource() { + assertThat(mCardPreference.getLayoutResource()).isEqualTo(R.layout.card_preference_layout); + } + +} From 56726ca04c99a9d8b1862d2384c250f8a4309690 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Fri, 11 Jan 2019 11:49:28 -0800 Subject: [PATCH 2/2] Remove divider line for battery card preference Use CardPreference directly here instead of preference category Also clean up code and test a little bit. Bug: 119618813 Test: RunSettingsRoboTests Change-Id: I3ee2313c10e6e2e34609137f3dcb0391104377d5 --- res/xml/power_usage_summary.xml | 6 +-- .../BatteryTipPreferenceController.java | 14 +++---- .../fuelgauge/batterytip/tips/BatteryTip.java | 7 +--- .../BatteryTipPreferenceControllerTest.java | 40 +++++-------------- .../batterytip/tips/BatteryTipTest.java | 3 +- 5 files changed, 22 insertions(+), 48 deletions(-) diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml index 14d8edaaa9e..a981a9bbb20 100644 --- a/res/xml/power_usage_summary.xml +++ b/res/xml/power_usage_summary.xml @@ -28,10 +28,9 @@ android:layout="@layout/battery_header" settings:controller="com.android.settings.fuelgauge.BatteryHeaderPreferenceController" /> - + settings:platform_slice="true" /> batteryTips) { @@ -110,14 +110,12 @@ public class BatteryTipPreferenceController extends BasePreferenceController { } } - mPreferenceGroup.removeAll(); for (int i = 0, size = batteryTips.size(); i < size; i++) { final BatteryTip batteryTip = mBatteryTips.get(i); batteryTip.sanityCheck(mContext); if (batteryTip.getState() != BatteryTip.StateType.INVISIBLE) { - final Preference preference = batteryTip.buildPreference(mPrefContext); - mBatteryTipMap.put(preference.getKey(), batteryTip); - mPreferenceGroup.addPreference(preference); + batteryTip.updatePreference(mCardPreference); + mBatteryTipMap.put(mCardPreference.getKey(), batteryTip); batteryTip.log(mContext, mMetricsFeatureProvider); mNeedUpdate = batteryTip.needUpdate(); break; diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java index 64737a7c9f3..de71ab2d98f 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java @@ -147,14 +147,11 @@ public abstract class BatteryTip implements Comparable, Parcelable { */ public abstract void log(Context context, MetricsFeatureProvider metricsFeatureProvider); - public Preference buildPreference(Context context) { - Preference preference = new CardPreference(context); - - preference.setKey(getKey()); + public void updatePreference(Preference preference) { + final Context context = preference.getContext(); preference.setTitle(getTitle(context)); preference.setSummary(getSummary(context)); preference.setIcon(getIconId()); - return preference; } public boolean shouldShowDialog() { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java index 5d45045c038..b68a8f57dd7 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java @@ -44,6 +44,7 @@ import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.SummaryTip; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.widget.CardPreference; import org.junit.Before; import org.junit.Test; @@ -72,17 +73,14 @@ public class BatteryTipPreferenceControllerTest { private BatteryTip mBatteryTip; @Mock private SettingsActivity mSettingsActivity; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private PreferenceManager mPreferenceManager; @Mock private InstrumentedPreferenceFragment mFragment; private Context mContext; - private PreferenceGroup mPreferenceGroup; + private CardPreference mCardPreference; private BatteryTipPreferenceController mBatteryTipPreferenceController; private List mOldBatteryTips; private List mNewBatteryTips; - private Preference mPreference; private FakeFeatureFactory mFeatureFactory; @Before @@ -90,12 +88,9 @@ public class BatteryTipPreferenceControllerTest { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; - mPreferenceGroup = spy(new PreferenceCategory(mContext)); + mCardPreference = spy(new CardPreference(mContext)); when(mPreferenceScreen.getContext()).thenReturn(mContext); - when(mPreferenceGroup.getPreferenceManager()).thenReturn(mPreferenceManager); - doReturn(mPreferenceGroup).when(mPreferenceScreen).findPreference(KEY_PREF); - mPreference = new Preference(mContext); - mPreference.setKey(KEY_TIP); + doReturn(mCardPreference).when(mPreferenceScreen).findPreference(KEY_PREF); mFeatureFactory = FakeFeatureFactory.setupForTest(); mOldBatteryTips = new ArrayList<>(); @@ -104,7 +99,7 @@ public class BatteryTipPreferenceControllerTest { mNewBatteryTips.add(new SummaryTip(BatteryTip.StateType.INVISIBLE, AVERAGE_TIME_MS)); mBatteryTipPreferenceController = buildBatteryTipPreferenceController(); - mBatteryTipPreferenceController.mPreferenceGroup = mPreferenceGroup; + mBatteryTipPreferenceController.mCardPreference = mCardPreference; mBatteryTipPreferenceController.mPrefContext = mContext; } @@ -112,18 +107,7 @@ public class BatteryTipPreferenceControllerTest { public void testDisplayPreference_addSummaryTip() { mBatteryTipPreferenceController.displayPreference(mPreferenceScreen); - assertOnlyContainsSummaryTip(mPreferenceGroup); - } - - @Test - public void testUpdateBatteryTips_updateTwice_firstShowSummaryTipThenRemoveIt() { - // Display summary tip because its state is new - mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips); - assertOnlyContainsSummaryTip(mPreferenceGroup); - - // Remove summary tip because its new state is invisible - mBatteryTipPreferenceController.updateBatteryTips(mNewBatteryTips); - assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(0); + assertOnlyContainsSummaryTip(mCardPreference); } @Test @@ -142,11 +126,11 @@ public class BatteryTipPreferenceControllerTest { mBatteryTipPreferenceController.saveInstanceState(bundle); final BatteryTipPreferenceController controller = buildBatteryTipPreferenceController(); - controller.mPreferenceGroup = mPreferenceGroup; + controller.mCardPreference = mCardPreference; controller.mPrefContext = mContext; controller.restoreInstanceState(bundle); - assertOnlyContainsSummaryTip(mPreferenceGroup); + assertOnlyContainsSummaryTip(mCardPreference); } @Test @@ -166,12 +150,11 @@ public class BatteryTipPreferenceControllerTest { when(mBatteryTip.getType()).thenReturn(SMART_BATTERY_MANAGER); List batteryTips = new ArrayList<>(); batteryTips.add(mBatteryTip); - doReturn(mPreference).when(mBatteryTip).buildPreference(any()); doReturn(false).when(mBatteryTip).shouldShowDialog(); doReturn(KEY_TIP).when(mBatteryTip).getKey(); mBatteryTipPreferenceController.updateBatteryTips(batteryTips); - mBatteryTipPreferenceController.handlePreferenceTreeClick(mPreference); + mBatteryTipPreferenceController.handlePreferenceTreeClick(mCardPreference); verify(mBatteryTipListener).onBatteryTipHandled(mBatteryTip); } @@ -182,10 +165,7 @@ public class BatteryTipPreferenceControllerTest { BasePreferenceController.AVAILABLE_UNSEARCHABLE); } - private void assertOnlyContainsSummaryTip(final PreferenceGroup preferenceGroup) { - assertThat(preferenceGroup.getPreferenceCount()).isEqualTo(1); - - final Preference preference = preferenceGroup.getPreference(0); + private void assertOnlyContainsSummaryTip(CardPreference preference) { assertThat(preference.getTitle()).isEqualTo( mContext.getString(R.string.battery_tip_summary_title)); assertThat(preference.getSummary()).isEqualTo( diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java index 3e18bf06d62..87fc0dddb77 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java @@ -56,7 +56,8 @@ public class BatteryTipTest { @Test public void buildPreference() { - final Preference preference = mBatteryTip.buildPreference(mContext); + final Preference preference = new Preference(mContext); + mBatteryTip.updatePreference(preference); assertThat(preference.getTitle()).isEqualTo(TITLE); assertThat(preference.getSummary()).isEqualTo(SUMMARY);