From 5407d1b16dc503041d2abe1dc7f25f89592166d9 Mon Sep 17 00:00:00 2001 From: ykhung Date: Wed, 28 Apr 2021 11:56:52 +0800 Subject: [PATCH 01/19] Refine the app/system section divider content show/hide rule Bug: 177406865 Bug: 185187729 Test: make SettingsRoboTests Change-Id: I5440a93078417df20ca61687f6c464dbad80a419 --- .../BatteryChartPreferenceController.java | 57 +++---------- .../BatteryChartPreferenceControllerTest.java | 80 ++++++------------- 2 files changed, 34 insertions(+), 103 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java index 972fda140f8..4f19785482b 100644 --- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java @@ -66,8 +66,6 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll @VisibleForTesting PreferenceGroup mAppListPrefGroup; @VisibleForTesting BatteryChartView mBatteryChartView; @VisibleForTesting ExpandDividerPreference mExpandDividerPreference; - @VisibleForTesting CategoryTitleType mCategoryTitleType = - CategoryTitleType.TYPE_UNKNOWN; @VisibleForTesting int[] mBatteryHistoryLevels; @VisibleForTesting long[] mBatteryHistoryKeys; @@ -87,14 +85,6 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll @VisibleForTesting final List mSystemEntries = new ArrayList<>(); - /** Which component data will be shown in the screen. */ - enum CategoryTitleType { - TYPE_UNKNOWN, - TYPE_APP_COMPONENT, - TYPE_SYSTEM_COMPONENT, - TYPE_ALL_COMPONENTS - } - public BatteryChartPreferenceController( Context context, String preferenceKey, Lifecycle lifecycle, SettingsActivity activity, @@ -283,7 +273,6 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll } private void addAllPreferences() { - mCategoryTitleType = CategoryTitleType.TYPE_UNKNOWN; final List entries = mBatteryIndexedMap.get(Integer.valueOf(mTrapezoidIndex)); if (entries == null) { @@ -312,10 +301,9 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll // Adds app entries to the list if it is not empty. if (!appEntries.isEmpty()) { addPreferenceToScreen(appEntries); - mCategoryTitleType = CategoryTitleType.TYPE_APP_COMPONENT; } - // Adds the expabable divider if we have two sections data. - if (!appEntries.isEmpty() && !mSystemEntries.isEmpty()) { + // Adds the expabable divider if we have system entries data. + if (!mSystemEntries.isEmpty()) { if (mExpandDividerPreference == null) { mExpandDividerPreference = new ExpandDividerPreference(mPrefContext); mExpandDividerPreference.setOnExpandListener(this); @@ -323,9 +311,6 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mExpandDividerPreference.setOrder( mAppListPrefGroup.getPreferenceCount()); mAppListPrefGroup.addPreference(mExpandDividerPreference); - mCategoryTitleType = CategoryTitleType.TYPE_ALL_COMPONENTS; - } else if (appEntries.isEmpty() && !mSystemEntries.isEmpty()) { - mCategoryTitleType = CategoryTitleType.TYPE_SYSTEM_COMPONENT; } refreshExpandUi(); } @@ -408,38 +393,14 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll @VisibleForTesting void refreshCategoryTitle() { final String slotInformation = getSlotInformation(); - Log.d(TAG, String.format("refreshCategoryTitle:%s slotInfo:%s", - mCategoryTitleType, slotInformation)); - refreshPreferenceCategoryTitle(slotInformation); - refreshExpandableDividerTitle(slotInformation); - } - - private void refreshExpandableDividerTitle(String slotInformation) { - if (mExpandDividerPreference == null) { - return; + Log.d(TAG, String.format("refreshCategoryTitle:%s", slotInformation)); + if (mAppListPrefGroup != null) { + mAppListPrefGroup.setTitle( + getSlotInformation(/*isApp=*/ true, slotInformation)); } - mExpandDividerPreference.setTitle( - mCategoryTitleType == CategoryTitleType.TYPE_ALL_COMPONENTS - ? getSlotInformation(/*isApp=*/ false, slotInformation) - : null); - } - - private void refreshPreferenceCategoryTitle(String slotInformation) { - if (mAppListPrefGroup == null) { - return; - } - switch (mCategoryTitleType) { - case TYPE_APP_COMPONENT: - case TYPE_ALL_COMPONENTS: - mAppListPrefGroup.setTitle( - getSlotInformation(/*isApp=*/ true, slotInformation)); - break; - case TYPE_SYSTEM_COMPONENT: - mAppListPrefGroup.setTitle( - getSlotInformation(/*isApp=*/ false, slotInformation)); - break; - default: - mAppListPrefGroup.setTitle(R.string.battery_app_usage_for_past_24); + if (mExpandDividerPreference != null) { + mExpandDividerPreference.setTitle( + getSlotInformation(/*isApp=*/ false, slotInformation)); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java index 35e3276f922..4e1d16ca4e5 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java @@ -33,6 +33,7 @@ import android.graphics.drawable.Drawable; import android.text.format.DateUtils; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceGroup; import com.android.settings.R; @@ -482,52 +483,13 @@ public final class BatteryChartPreferenceControllerTest { } @Test - public void testRefreshCategoryTitle_appComponent_setHourIntoPreferenceTitle() { + public void testRefreshCategoryTitle_setHourIntoBothTitleTextView() { + mBatteryChartPreferenceController = createController(); setUpBatteryHistoryKeys(); - mBatteryChartPreferenceController.mCategoryTitleType = - BatteryChartPreferenceController.CategoryTitleType.TYPE_APP_COMPONENT; + mBatteryChartPreferenceController.mAppListPrefGroup = + spy(new PreferenceCategory(mContext)); mBatteryChartPreferenceController.mExpandDividerPreference = - mExpandDividerPreference; - // Simulates select the first slot. - mBatteryChartPreferenceController.mTrapezoidIndex = 0; - - mBatteryChartPreferenceController.refreshCategoryTitle(); - - final ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); - // Verifies the title in the preference group. - verify(mAppListGroup).setTitle(captor.capture()); - assertThat(captor.getValue()) - .isEqualTo("App usage for 4 pm-7 am"); - verify(mExpandDividerPreference).setTitle(null); - } - - @Test - public void testRefreshCategoryTitle_systemComponent_setHourIntoPreferenceTitle() { - setUpBatteryHistoryKeys(); - mBatteryChartPreferenceController.mCategoryTitleType = - BatteryChartPreferenceController.CategoryTitleType.TYPE_SYSTEM_COMPONENT; - mBatteryChartPreferenceController.mExpandDividerPreference = - mExpandDividerPreference; - // Simulates select the first slot. - mBatteryChartPreferenceController.mTrapezoidIndex = 0; - - mBatteryChartPreferenceController.refreshCategoryTitle(); - - final ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); - // Verifies the title in the preference group. - verify(mAppListGroup).setTitle(captor.capture()); - assertThat(captor.getValue()) - .isEqualTo("System usage for 4 pm-7 am"); - verify(mExpandDividerPreference).setTitle(null); - } - - @Test - public void testRefreshCategoryTitle_allComponents_setHourIntoBothTitleTextView() { - setUpBatteryHistoryKeys(); - mBatteryChartPreferenceController.mCategoryTitleType = - BatteryChartPreferenceController.CategoryTitleType.TYPE_ALL_COMPONENTS; - mBatteryChartPreferenceController.mExpandDividerPreference = - mExpandDividerPreference; + spy(new ExpandDividerPreference(mContext)); // Simulates select the first slot. mBatteryChartPreferenceController.mTrapezoidIndex = 0; @@ -535,22 +497,25 @@ public final class BatteryChartPreferenceControllerTest { ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); // Verifies the title in the preference group. - verify(mAppListGroup).setTitle(captor.capture()); + verify(mBatteryChartPreferenceController.mAppListPrefGroup) + .setTitle(captor.capture()); assertThat(captor.getValue()) .isEqualTo("App usage for 4 pm-7 am"); // Verifies the title in the expandable divider. captor = ArgumentCaptor.forClass(String.class); - verify(mExpandDividerPreference).setTitle(captor.capture()); + verify(mBatteryChartPreferenceController.mExpandDividerPreference) + .setTitle(captor.capture()); assertThat(captor.getValue()) .isEqualTo("System usage for 4 pm-7 am"); } @Test - public void testRefreshCategoryTitle_allComponents_setLast24HrIntoBothTitleTextView() { - mBatteryChartPreferenceController.mCategoryTitleType = - BatteryChartPreferenceController.CategoryTitleType.TYPE_ALL_COMPONENTS; + public void testRefreshCategoryTitle_setLast24HrIntoBothTitleTextView() { + mBatteryChartPreferenceController = createController(); + mBatteryChartPreferenceController.mAppListPrefGroup = + spy(new PreferenceCategory(mContext)); mBatteryChartPreferenceController.mExpandDividerPreference = - mExpandDividerPreference; + spy(new ExpandDividerPreference(mContext)); // Simulates select all condition. mBatteryChartPreferenceController.mTrapezoidIndex = BatteryChartView.SELECTED_INDEX_ALL; @@ -559,12 +524,14 @@ public final class BatteryChartPreferenceControllerTest { ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); // Verifies the title in the preference group. - verify(mAppListGroup).setTitle(captor.capture()); + verify(mBatteryChartPreferenceController.mAppListPrefGroup) + .setTitle(captor.capture()); assertThat(captor.getValue()) .isEqualTo("App usage for past 24 hr"); // Verifies the title in the expandable divider. captor = ArgumentCaptor.forClass(String.class); - verify(mExpandDividerPreference).setTitle(captor.capture()); + verify(mBatteryChartPreferenceController.mExpandDividerPreference) + .setTitle(captor.capture()); assertThat(captor.getValue()) .isEqualTo("System usage for past 24 hr"); } @@ -643,8 +610,11 @@ public final class BatteryChartPreferenceControllerTest { } private BatteryChartPreferenceController createController() { - return new BatteryChartPreferenceController( - mContext, "app_list", /*lifecycle=*/ null, - mSettingsActivity, mFragment); + final BatteryChartPreferenceController controller = + new BatteryChartPreferenceController( + mContext, "app_list", /*lifecycle=*/ null, + mSettingsActivity, mFragment); + controller.mPrefContext = mContext; + return controller; } } From 6adeed1a2c76614815621dcd92b9595b568fba12 Mon Sep 17 00:00:00 2001 From: "Wesley.CW Wang" Date: Thu, 29 Apr 2021 19:03:38 +0800 Subject: [PATCH 02/19] Update batter saver page footer (1/2) - Remove iconSpaceReserved since settings theme already handle it - Add underline Bug: 183689347 Test: make SettingsRoboTests Change-Id: Ib52cfb48453d49b1ead3bf19183449cc18018dd3 --- res/xml/power_usage_detail.xml | 2 +- res/xml/power_usage_summary.xml | 7 +------ .../fuelgauge/batterysaver/BatterySaverSettings.java | 7 +++---- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/res/xml/power_usage_detail.xml b/res/xml/power_usage_detail.xml index 5919a2ef0b1..f40ce7f954b 100644 --- a/res/xml/power_usage_detail.xml +++ b/res/xml/power_usage_detail.xml @@ -55,7 +55,7 @@ \ No newline at end of file diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml index 0d37d581f41..34c524c69ba 100644 --- a/res/xml/power_usage_summary.xml +++ b/res/xml/power_usage_summary.xml @@ -1,5 +1,5 @@ - - + + android:padding="20dp" + android:background="@color/battery_info_error_color_red"> @@ -53,7 +55,7 @@ android:layout_gravity="end" android:text="@string/battery_missing_link_message" android:textAppearance="?android:attr/textAppearanceSmall" - android:textColor="?android:attr/colorError" /> + android:textColor="@*android:color/material_red_A700" /> diff --git a/res/values/colors.xml b/res/values/colors.xml index 0aa309f92a3..fc79f25e770 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -117,6 +117,7 @@ #4caf50 #fdd835 #f44336 + #fce8e6 #ff00bcd4 From 8531d8795f5e6527b3bc675868992aa503d00cfb Mon Sep 17 00:00:00 2001 From: Jason Chiu Date: Mon, 3 May 2021 12:09:54 +0800 Subject: [PATCH 08/19] Fix the unaligned title of injected items Remove the summary space holder for the injected items that are not assigned a summary or a summary uri. Test: visual, robotest Fixes: 187006845 Bug: 182357397 Change-Id: I7b3d165f0ffd771dd0110962c9e3159c4977d6e3 --- .../settings/dashboard/DashboardFeatureProviderImpl.java | 2 -- .../settings/dashboard/DashboardFeatureProviderImplTest.java | 5 ++--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index a191e685a65..92f078ec88a 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -280,8 +280,6 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { METHOD_GET_DYNAMIC_SUMMARY); refreshSummary(uri, preference); return createDynamicDataObserver(METHOD_GET_DYNAMIC_SUMMARY, uri, preference); - } else { - preference.setSummary(R.string.summary_placeholder); } return null; } diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java index 1e6bc4114eb..fa1aaa8942e 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -285,7 +285,7 @@ public class DashboardFeatureProviderImplTest { } @Test - public void bindPreference_noSummary_shouldSetSummaryToPlaceholder() { + public void bindPreference_noSummary_shouldSetNullSummary() { final Preference preference = new Preference(RuntimeEnvironment.application); mActivityInfo.metaData.remove(META_DATA_PREFERENCE_SUMMARY); @@ -295,8 +295,7 @@ public class DashboardFeatureProviderImplTest { MetricsEvent.VIEW_UNKNOWN, preference, tile, null /*key */, Preference.DEFAULT_ORDER); - assertThat(preference.getSummary()) - .isEqualTo(RuntimeEnvironment.application.getString(R.string.summary_placeholder)); + assertThat(preference.getSummary()).isNull(); } @Test From a0d9c9186cc6db23e6f4b28213bf331dbde32c7e Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Mon, 3 May 2021 13:43:06 +0800 Subject: [PATCH 09/19] Update password & account settings icon size - Password app icon size should be 32dp Bug: 186609741 Test: visual Change-Id: Ifb86e568f8c073e3f27f1c17ea9dd94e9b47a5e4 --- .../applications/autofill/PasswordsPreferenceController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java b/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java index a9d1572b7e5..8e43853e21a 100644 --- a/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java +++ b/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java @@ -44,7 +44,6 @@ import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.OnLifecycleEvent; -import androidx.preference.Preference; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceScreen; @@ -53,6 +52,7 @@ import com.android.internal.os.IResultReceiver; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.widget.AppPreference; import java.lang.ref.WeakReference; import java.util.List; @@ -116,7 +116,7 @@ public class PasswordsPreferenceController extends BasePreferenceController Context prefContext, @UserIdInt int user, PreferenceGroup group) { for (int i = 0; i < mServices.size(); i++) { final AutofillServiceInfo service = mServices.get(i); - final Preference pref = new Preference(prefContext); + final AppPreference pref = new AppPreference(prefContext); final ServiceInfo serviceInfo = service.getServiceInfo(); pref.setTitle(serviceInfo.loadLabel(mPm)); final Drawable icon = From 95aa089858e75600d6425bba0fcf1537a8196dd1 Mon Sep 17 00:00:00 2001 From: menghanli Date: Mon, 3 May 2021 13:42:24 +0800 Subject: [PATCH 10/19] Hide the accessibility location preference when gesture navigation mode enabled. If it's grey out, users don't have the alternative way in that page to enable it. According to the UX design, we should hide it if it is needed. Bug: 186776534 Test: make RunSettingsRoboTests -j52 ROBOTEST_FILTER=AccessibilityButtonLocationPreferenceControllerTest Change-Id: If2f659da32345938e2930fde42365cd796571068 --- .../AccessibilityButtonLocationPreferenceController.java | 2 +- ...AccessibilityButtonLocationPreferenceControllerTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceController.java index e9ed19a4b59..ed7cb27bff6 100644 --- a/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceController.java +++ b/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceController.java @@ -43,7 +43,7 @@ public class AccessibilityButtonLocationPreferenceController extends BasePrefere @Override public int getAvailabilityStatus() { return AccessibilityUtil.isGestureNavigateEnabled(mContext) - ? DISABLED_DEPENDENT_SETTING : AVAILABLE; + ? CONDITIONALLY_UNAVAILABLE : AVAILABLE; } @Override diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceControllerTest.java index a67038a6b2d..4510d843ea9 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceControllerTest.java @@ -22,7 +22,7 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.settings.core.BasePreferenceController.AVAILABLE; -import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING; +import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE; import static com.google.common.truth.Truth.assertThat; @@ -69,11 +69,11 @@ public class AccessibilityButtonLocationPreferenceControllerTest { } @Test - public void getAvailabilityStatus_navigationGestureEnabled_returnDisabledDependentSetting() { + public void getAvailabilityStatus_navigationGestureEnabled_returnConditionallyUnavailable() { when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode)) .thenReturn(NAV_BAR_MODE_GESTURAL); - assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_DEPENDENT_SETTING); + assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); } @Test From b4a9916adf89cadf01ff6a7027708112673f632e Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Mon, 3 May 2021 15:30:03 +0800 Subject: [PATCH 11/19] Increasing the character limit We need to extend the character limit for some strings related to biometric settings, since it's too short to block the translating work. Fixes: 186427209 Test: build and verified Change-Id: I201276c7c9120cdbfcda6fd23f3d6f8a3e03d116 --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index cb921ae7395..8368b4647e8 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -980,9 +980,9 @@ Ways to unlock Use face and fingerprint to - + Unlocking your phone - + Authentication in apps From 503eac982be5afd57ec0a00468796758369c5c83 Mon Sep 17 00:00:00 2001 From: menghanli Date: Mon, 3 May 2021 16:43:47 +0800 Subject: [PATCH 12/19] [Material Next] Audio adjustment customized seekbar 1. Seekbar high: 48dp for the tappable area 2. Left aligned Bug: 186609598 Test: Manual testing Change-Id: I3546e3f39abe04480ca00d8068ff92a5546645ab --- res/layout/preference_balance_slider.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/res/layout/preference_balance_slider.xml b/res/layout/preference_balance_slider.xml index 80cb9962985..43cd86f5933 100644 --- a/res/layout/preference_balance_slider.xml +++ b/res/layout/preference_balance_slider.xml @@ -76,6 +76,9 @@ From a51dd978ee6e6a9a751a85914d8dd617d93ca117 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Mon, 3 May 2021 08:59:34 +0000 Subject: [PATCH 13/19] Revert "Refine battery help message layout" This reverts commit 2369167d63ee8a1bcd43aa16c3d316d2ada33bbc. Reason for revert: break Settings checking style Bug: 187023021 Change-Id: I4bb0f93e5d2a545af5e6004dfe24c7e87738036c --- res/layout/preference_battery_error.xml | 42 ++++++++++++------------- res/values/colors.xml | 1 - 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/res/layout/preference_battery_error.xml b/res/layout/preference_battery_error.xml index 4efd13af012..66ff96a71f2 100644 --- a/res/layout/preference_battery_error.xml +++ b/res/layout/preference_battery_error.xml @@ -1,20 +1,20 @@ - + + android:padding="16dp" + android:background="@color/homepage_emergency_background"> @@ -55,7 +53,7 @@ android:layout_gravity="end" android:text="@string/battery_missing_link_message" android:textAppearance="?android:attr/textAppearanceSmall" - android:textColor="@*android:color/material_red_A700" /> + android:textColor="?android:attr/colorError" /> diff --git a/res/values/colors.xml b/res/values/colors.xml index fc79f25e770..0aa309f92a3 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -117,7 +117,6 @@ #4caf50 #fdd835 #f44336 - #fce8e6 #ff00bcd4 From 37c15a371ccea64486068ba716b12b342b346cb2 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Mon, 3 May 2021 17:50:24 +0800 Subject: [PATCH 14/19] Remove reserved icon space for Safety > Wireless emergency alerts - remove iconSpaceReserved = true Bug: 186609856 Test: visual Change-Id: Ib6145e94e7a4f199b17e2e7f3b4c180b60e98900 --- res/xml/emergency_settings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/res/xml/emergency_settings.xml b/res/xml/emergency_settings.xml index 66c5fd1ef96..91b7525d9a5 100644 --- a/res/xml/emergency_settings.xml +++ b/res/xml/emergency_settings.xml @@ -41,7 +41,6 @@ android:key="app_and_notif_cell_broadcast_settings" android:title="@string/cell_broadcast_settings" android:order="200" - settings:iconSpaceReserved="true" settings:useAdminDisabledSummary="true"> Date: Mon, 3 May 2021 15:46:19 +0800 Subject: [PATCH 15/19] Add new field for data interpolation usage reference the decription in cl/371645876 Bug: 184807417 Test: make SettingsRoboTests Change-Id: I944399dc205cad9b96fe22e82e4c651b4ccc4e37 --- .../settings/fuelgauge/BatteryHistEntry.java | 9 ++- .../settings/fuelgauge/ConvertUtils.java | 43 ++++++----- .../fuelgauge/BatteryHistEntryTest.java | 13 ++-- .../settings/fuelgauge/ConvertUtilsTest.java | 72 +++++++++++-------- 4 files changed, 83 insertions(+), 54 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryHistEntry.java b/src/com/android/settings/fuelgauge/BatteryHistEntry.java index be8a845eebd..f5620000baf 100644 --- a/src/com/android/settings/fuelgauge/BatteryHistEntry.java +++ b/src/com/android/settings/fuelgauge/BatteryHistEntry.java @@ -30,6 +30,8 @@ public class BatteryHistEntry { public static final String KEY_APP_LABEL = "appLabel"; public static final String KEY_PACKAGE_NAME = "packageName"; public static final String KEY_IS_HIDDEN = "isHidden"; + // Device booting elapsed time from SystemClock.elapsedRealtime(). + public static final String KEY_BOOT_TIMESTAMP = "bootTimestamp"; public static final String KEY_TIMESTAMP = "timestamp"; public static final String KEY_ZONE_ID = "zoneId"; public static final String KEY_TOTAL_POWER = "totalPower"; @@ -50,6 +52,7 @@ public class BatteryHistEntry { // Whether the data is represented as system component or not? public final boolean mIsHidden; // Records the timestamp relative information. + public final long mBootTimestamp; public final long mTimestamp; public final String mZoneId; // Records the battery usage relative information. @@ -74,6 +77,7 @@ public class BatteryHistEntry { mAppLabel = getString(values, KEY_APP_LABEL); mPackageName = getString(values, KEY_PACKAGE_NAME); mIsHidden = getBoolean(values, KEY_IS_HIDDEN); + mBootTimestamp = getLong(values, KEY_BOOT_TIMESTAMP); mTimestamp = getLong(values, KEY_TIMESTAMP); mZoneId = getString(values, KEY_ZONE_ID); mTotalPower = getDouble(values, KEY_TOTAL_POWER); @@ -94,6 +98,7 @@ public class BatteryHistEntry { mAppLabel = getString(cursor, KEY_APP_LABEL); mPackageName = getString(cursor, KEY_PACKAGE_NAME); mIsHidden = getBoolean(cursor, KEY_IS_HIDDEN); + mBootTimestamp = getLong(cursor, KEY_BOOT_TIMESTAMP); mTimestamp = getLong(cursor, KEY_TIMESTAMP); mZoneId = getString(cursor, KEY_ZONE_ID); mTotalPower = getDouble(cursor, KEY_TOTAL_POWER); @@ -153,7 +158,8 @@ public class BatteryHistEntry { .append("\nBatteryHistEntry{") .append(String.format("\n\tpackage=%s|label=%s|uid=%d|userId=%d|isHidden=%b", mPackageName, mAppLabel, mUid, mUserId, mIsHidden)) - .append(String.format("\n\ttimestamp=%s|zoneId=%s", recordAtDateTime, mZoneId)) + .append(String.format("\n\ttimestamp=%s|zoneId=%s|bootTimestamp=%d", + recordAtDateTime, mZoneId, Duration.ofMillis(mBootTimestamp).getSeconds())) .append(String.format("\n\tusage=%f|total=%f|consume=%f|elapsedTime=%d|%d", mPercentOfTotal, mTotalPower, mConsumePower, Duration.ofMillis(mForegroundUsageTimeInMs).getSeconds(), @@ -249,5 +255,4 @@ public class BatteryHistEntry { mIsValidEntry = false; return false; } - } diff --git a/src/com/android/settings/fuelgauge/ConvertUtils.java b/src/com/android/settings/fuelgauge/ConvertUtils.java index 7c3ebef52e3..1d332a20e72 100644 --- a/src/com/android/settings/fuelgauge/ConvertUtils.java +++ b/src/com/android/settings/fuelgauge/ConvertUtils.java @@ -107,33 +107,40 @@ public final class ConvertUtils { int batteryLevel, int batteryStatus, int batteryHealth, + long bootTimestamp, long timestamp) { final ContentValues values = new ContentValues(); if (entry != null && batteryUsageStats != null) { - values.put("uid", Long.valueOf(entry.getUid())); - values.put("userId", + values.put(BatteryHistEntry.KEY_UID, Long.valueOf(entry.getUid())); + values.put(BatteryHistEntry.KEY_USER_ID, Long.valueOf(UserHandle.getUserId(entry.getUid()))); - values.put("appLabel", entry.getLabel()); - values.put("packageName", entry.getDefaultPackageName()); - values.put("isHidden", Boolean.valueOf(entry.isHidden())); - values.put("totalPower", + values.put(BatteryHistEntry.KEY_APP_LABEL, entry.getLabel()); + values.put(BatteryHistEntry.KEY_PACKAGE_NAME, + entry.getDefaultPackageName()); + values.put(BatteryHistEntry.KEY_IS_HIDDEN, Boolean.valueOf(entry.isHidden())); + values.put(BatteryHistEntry.KEY_TOTAL_POWER, Double.valueOf(batteryUsageStats.getConsumedPower())); - values.put("consumePower", Double.valueOf(entry.getConsumedPower())); - values.put("percentOfTotal", Double.valueOf(entry.percent)); - values.put("foregroundUsageTimeInMs", + values.put(BatteryHistEntry.KEY_CONSUME_POWER, + Double.valueOf(entry.getConsumedPower())); + values.put(BatteryHistEntry.KEY_PERCENT_OF_TOTAL, + Double.valueOf(entry.percent)); + values.put(BatteryHistEntry.KEY_FOREGROUND_USAGE_TIME, Long.valueOf(entry.getTimeInForegroundMs())); - values.put("backgroundUsageTimeInMs", + values.put(BatteryHistEntry.KEY_BACKGROUND_USAGE_TIME, Long.valueOf(entry.getTimeInBackgroundMs())); - values.put("drainType", getDrainType(entry.getBatteryConsumer())); - values.put("consumerType", getConsumerType(entry.getBatteryConsumer())); + values.put(BatteryHistEntry.KEY_DRAIN_TYPE, + getDrainType(entry.getBatteryConsumer())); + values.put(BatteryHistEntry.KEY_CONSUMER_TYPE, + getConsumerType(entry.getBatteryConsumer())); } else { - values.put("packageName", FAKE_PACKAGE_NAME); + values.put(BatteryHistEntry.KEY_PACKAGE_NAME, FAKE_PACKAGE_NAME); } - values.put("timestamp", Long.valueOf(timestamp)); - values.put("zoneId", TimeZone.getDefault().getID()); - values.put("batteryLevel", Integer.valueOf(batteryLevel)); - values.put("batteryStatus", Integer.valueOf(batteryStatus)); - values.put("batteryHealth", Integer.valueOf(batteryHealth)); + values.put(BatteryHistEntry.KEY_BOOT_TIMESTAMP, Long.valueOf(bootTimestamp)); + values.put(BatteryHistEntry.KEY_TIMESTAMP, Long.valueOf(timestamp)); + values.put(BatteryHistEntry.KEY_ZONE_ID, TimeZone.getDefault().getID()); + values.put(BatteryHistEntry.KEY_BATTERY_LEVEL, Integer.valueOf(batteryLevel)); + values.put(BatteryHistEntry.KEY_BATTERY_STATUS, Integer.valueOf(batteryStatus)); + values.put(BatteryHistEntry.KEY_BATTERY_HEALTH, Integer.valueOf(batteryHealth)); return values; } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java index e4a86b107d6..9a196cb1822 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java @@ -75,6 +75,7 @@ public final class BatteryHistEntryTest { /*batteryLevel=*/ 12, /*batteryStatus=*/ BatteryManager.BATTERY_STATUS_FULL, /*batteryHealth=*/ BatteryManager.BATTERY_HEALTH_COLD, + /*bootTimestamp=*/ 101L, /*timestamp=*/ 10001L); assertBatteryHistEntry( @@ -98,6 +99,7 @@ public final class BatteryHistEntryTest { BatteryHistEntry.KEY_APP_LABEL, BatteryHistEntry.KEY_PACKAGE_NAME, BatteryHistEntry.KEY_IS_HIDDEN, + BatteryHistEntry.KEY_BOOT_TIMESTAMP, BatteryHistEntry.KEY_TIMESTAMP, BatteryHistEntry.KEY_ZONE_ID, BatteryHistEntry.KEY_TOTAL_POWER, @@ -117,6 +119,7 @@ public final class BatteryHistEntryTest { "Settings", "com.google.android.settings.battery", Integer.valueOf(1), + Long.valueOf(101l), Long.valueOf(10001L), TimeZone.getDefault().getID(), Double.valueOf(5.1), @@ -141,7 +144,7 @@ public final class BatteryHistEntryTest { public void testGetKey_consumerUidType_returnExpectedString() { final ContentValues values = getContentValuesWithType( ConvertUtils.CONSUMER_TYPE_UID_BATTERY); - values.put("uid", 3); + values.put(BatteryHistEntry.KEY_UID, 3); final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values); assertThat(batteryHistEntry.getKey()).isEqualTo("3"); @@ -151,7 +154,7 @@ public final class BatteryHistEntryTest { public void testGetKey_consumerUserType_returnExpectedString() { final ContentValues values = getContentValuesWithType( ConvertUtils.CONSUMER_TYPE_USER_BATTERY); - values.put("userId", 2); + values.put(BatteryHistEntry.KEY_USER_ID, 2); final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values); assertThat(batteryHistEntry.getKey()).isEqualTo("U|2"); @@ -161,7 +164,7 @@ public final class BatteryHistEntryTest { public void testGetKey_consumerSystemType_returnExpectedString() { final ContentValues values = getContentValuesWithType( ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY); - values.put("drainType", 1); + values.put(BatteryHistEntry.KEY_DRAIN_TYPE, 1); final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values); assertThat(batteryHistEntry.getKey()).isEqualTo("S|1"); @@ -203,7 +206,8 @@ public final class BatteryHistEntryTest { private static ContentValues getContentValuesWithType(int consumerType) { final ContentValues values = new ContentValues(); - values.put("consumerType", Integer.valueOf(consumerType)); + values.put(BatteryHistEntry.KEY_CONSUMER_TYPE, + Integer.valueOf(consumerType)); return values; } @@ -216,6 +220,7 @@ public final class BatteryHistEntryTest { assertThat(entry.mPackageName) .isEqualTo("com.google.android.settings.battery"); assertThat(entry.mIsHidden).isTrue(); + assertThat(entry.mBootTimestamp).isEqualTo(101L); assertThat(entry.mTimestamp).isEqualTo(10001L); assertThat(entry.mZoneId).isEqualTo(TimeZone.getDefault().getID()); assertThat(entry.mTotalPower).isEqualTo(5.1); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java index c9c9f3b4a57..c993d6ff181 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java @@ -95,30 +95,36 @@ public final class ConvertUtilsTest { /*batteryLevel=*/ 12, /*batteryStatus=*/ BatteryManager.BATTERY_STATUS_FULL, /*batteryHealth=*/ BatteryManager.BATTERY_HEALTH_COLD, + /*bootTimestamp=*/ 101L, /*timestamp=*/ 10001L); - assertThat(values.getAsLong("uid")).isEqualTo(1001L); - assertThat(values.getAsLong("userId")) + assertThat(values.getAsLong(BatteryHistEntry.KEY_UID)).isEqualTo(1001L); + assertThat(values.getAsLong(BatteryHistEntry.KEY_USER_ID)) .isEqualTo(UserHandle.getUserId(1001)); - assertThat(values.getAsString("appLabel")).isEqualTo("Settings"); - assertThat(values.getAsString("packageName")) + assertThat(values.getAsString(BatteryHistEntry.KEY_APP_LABEL)) + .isEqualTo("Settings"); + assertThat(values.getAsString(BatteryHistEntry.KEY_PACKAGE_NAME)) .isEqualTo("com.google.android.settings.battery"); - assertThat(values.getAsBoolean("isHidden")).isTrue(); - assertThat(values.getAsLong("timestamp")).isEqualTo(10001L); - assertThat(values.getAsString("zoneId")) + assertThat(values.getAsBoolean(BatteryHistEntry.KEY_IS_HIDDEN)).isTrue(); + assertThat(values.getAsLong(BatteryHistEntry.KEY_BOOT_TIMESTAMP)) + .isEqualTo(101L); + assertThat(values.getAsLong(BatteryHistEntry.KEY_TIMESTAMP)).isEqualTo(10001L); + assertThat(values.getAsString(BatteryHistEntry.KEY_ZONE_ID)) .isEqualTo(TimeZone.getDefault().getID()); - assertThat(values.getAsDouble("totalPower")).isEqualTo(5.1); - assertThat(values.getAsDouble("consumePower")).isEqualTo(1.1); - assertThat(values.getAsDouble("percentOfTotal")).isEqualTo(0.3); - assertThat(values.getAsLong("foregroundUsageTimeInMs")).isEqualTo(1234L); - assertThat(values.getAsLong("backgroundUsageTimeInMs")).isEqualTo(5689L); - assertThat(values.getAsInteger("drainType")).isEqualTo(expectedType); - assertThat(values.getAsInteger("consumerType")) + assertThat(values.getAsDouble(BatteryHistEntry.KEY_TOTAL_POWER)).isEqualTo(5.1); + assertThat(values.getAsDouble(BatteryHistEntry.KEY_CONSUME_POWER)).isEqualTo(1.1); + assertThat(values.getAsDouble(BatteryHistEntry.KEY_PERCENT_OF_TOTAL)).isEqualTo(0.3); + assertThat(values.getAsLong(BatteryHistEntry.KEY_FOREGROUND_USAGE_TIME)) + .isEqualTo(1234L); + assertThat(values.getAsLong(BatteryHistEntry.KEY_BACKGROUND_USAGE_TIME)) + .isEqualTo(5689L); + assertThat(values.getAsInteger(BatteryHistEntry.KEY_DRAIN_TYPE)).isEqualTo(expectedType); + assertThat(values.getAsInteger(BatteryHistEntry.KEY_CONSUMER_TYPE)) .isEqualTo(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY); - assertThat(values.getAsInteger("batteryLevel")).isEqualTo(12); - assertThat(values.getAsInteger("batteryStatus")) + assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_LEVEL)).isEqualTo(12); + assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_STATUS)) .isEqualTo(BatteryManager.BATTERY_STATUS_FULL); - assertThat(values.getAsInteger("batteryHealth")) + assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_HEALTH)) .isEqualTo(BatteryManager.BATTERY_HEALTH_COLD); } @@ -131,17 +137,21 @@ public final class ConvertUtilsTest { /*batteryLevel=*/ 12, /*batteryStatus=*/ BatteryManager.BATTERY_STATUS_FULL, /*batteryHealth=*/ BatteryManager.BATTERY_HEALTH_COLD, + /*bootTimestamp=*/ 101L, /*timestamp=*/ 10001L); - assertThat(values.getAsLong("timestamp")).isEqualTo(10001L); - assertThat(values.getAsString("zoneId")) + assertThat(values.getAsLong(BatteryHistEntry.KEY_BOOT_TIMESTAMP)) + .isEqualTo(101L); + assertThat(values.getAsLong(BatteryHistEntry.KEY_TIMESTAMP)) + .isEqualTo(10001L); + assertThat(values.getAsString(BatteryHistEntry.KEY_ZONE_ID)) .isEqualTo(TimeZone.getDefault().getID()); - assertThat(values.getAsInteger("batteryLevel")).isEqualTo(12); - assertThat(values.getAsInteger("batteryStatus")) + assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_LEVEL)).isEqualTo(12); + assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_STATUS)) .isEqualTo(BatteryManager.BATTERY_STATUS_FULL); - assertThat(values.getAsInteger("batteryHealth")) + assertThat(values.getAsInteger(BatteryHistEntry.KEY_BATTERY_HEALTH)) .isEqualTo(BatteryManager.BATTERY_HEALTH_COLD); - assertThat(values.getAsString("packageName")) + assertThat(values.getAsString(BatteryHistEntry.KEY_PACKAGE_NAME)) .isEqualTo(ConvertUtils.FAKE_PACKAGE_NAME); } @@ -287,14 +297,16 @@ public final class ConvertUtilsTest { long uid, long foregroundUsageTimeInMs, long backgroundUsageTimeInMs) { // Only insert required fields. final ContentValues values = new ContentValues(); - values.put("packageName", packageName); - values.put("appLabel", appLabel); - values.put("uid", Long.valueOf(uid)); - values.put("consumerType", + values.put(BatteryHistEntry.KEY_PACKAGE_NAME, packageName); + values.put(BatteryHistEntry.KEY_APP_LABEL, appLabel); + values.put(BatteryHistEntry.KEY_UID, Long.valueOf(uid)); + values.put(BatteryHistEntry.KEY_CONSUMER_TYPE, Integer.valueOf(ConvertUtils.CONSUMER_TYPE_UID_BATTERY)); - values.put("consumePower", consumePower); - values.put("foregroundUsageTimeInMs", Long.valueOf(foregroundUsageTimeInMs)); - values.put("backgroundUsageTimeInMs", Long.valueOf(backgroundUsageTimeInMs)); + values.put(BatteryHistEntry.KEY_CONSUME_POWER, consumePower); + values.put(BatteryHistEntry.KEY_FOREGROUND_USAGE_TIME, + Long.valueOf(foregroundUsageTimeInMs)); + values.put(BatteryHistEntry.KEY_BACKGROUND_USAGE_TIME, + Long.valueOf(backgroundUsageTimeInMs)); return new BatteryHistEntry(values); } From 4cd89bb082ba2c8f6f38aeda35085b6cb862b087 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Wed, 28 Apr 2021 19:54:37 +0800 Subject: [PATCH 16/19] Storage Settings Apps category shows image/video/audio APPs There is AOSP built in file browser for image/video/audio file category, all APPs except games should be included in Apps category. - Shows image/video/audio APPs in APPs category. - Count Image/Video/Audio APPs storage size to Apps storage size. - Remove APP size & cache size for Images/Videos/Audios category. Bug: 170918505 Test: atest StorageAsyncLoaderTest.java Change-Id: I07e0a3a66a13f36b9e0cbde289d8ba90df4ae295 --- .../ManageApplications.java | 2 +- .../storage/StorageAsyncLoader.java | 23 +++++++++++++ .../storage/StorageAsyncLoaderTest.java | 32 ++++++++++++++++--- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index a92f5394da4..a08c5406535 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -511,7 +511,7 @@ public class ManageApplications extends InstrumentedFragment if (storageType == STORAGE_TYPE_MUSIC) { filter = new CompoundFilter(ApplicationsState.FILTER_AUDIO, filter); } else if (storageType == STORAGE_TYPE_DEFAULT) { - filter = new CompoundFilter(ApplicationsState.FILTER_OTHER_APPS, filter); + filter = new CompoundFilter(ApplicationsState.FILTER_APPS_EXCEPT_GAMES, filter); } return filter; } diff --git a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java index 9d10a1daf0e..f53b68fd1af 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java +++ b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java @@ -120,7 +120,9 @@ public class StorageAsyncLoader // This isn't quite right because it slams the first user by user id with the whole code // size, but this ensures that we count all apps seen once. + boolean isAddCodeBytesForFirstUserId = false; if (!mSeenPackages.contains(app.packageName)) { + isAddCodeBytesForFirstUserId = true; blamedSize += stats.getCodeBytes(); mSeenPackages.add(app.packageName); } @@ -130,13 +132,34 @@ public class StorageAsyncLoader result.gamesSize += blamedSize; break; case CATEGORY_AUDIO: + // TODO(b/170918505): Should revamp audio size calculation with the data + // from media provider. result.musicAppsSize += blamedSize; + if (isAddCodeBytesForFirstUserId) { + result.musicAppsSize -= stats.getCodeBytes(); + } + + result.otherAppsSize += blamedSize; break; case CATEGORY_VIDEO: + // TODO(b/170918505): Should revamp video size calculation with the data + // from media provider. result.videoAppsSize += blamedSize; + if (isAddCodeBytesForFirstUserId) { + result.videoAppsSize -= stats.getCodeBytes(); + } + + result.otherAppsSize += blamedSize; break; case CATEGORY_IMAGE: + // TODO(b/170918505): Should revamp image size calculation with the data + // from media provider. result.photosAppsSize += blamedSize; + if (isAddCodeBytesForFirstUserId) { + result.photosAppsSize -= stats.getCodeBytes(); + } + + result.otherAppsSize += blamedSize; break; default: // The deprecated game flag does not set the category. diff --git a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java index f2349bbf831..a271e9b9e99 100644 --- a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java +++ b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java @@ -22,7 +22,9 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; +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.content.Context; @@ -30,20 +32,22 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; +import android.content.res.Resources; import android.net.TrafficStats; import android.os.UserHandle; import android.os.UserManager; import android.util.SparseArray; +import androidx.test.core.app.ApplicationProvider; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import com.android.settings.R; import com.android.settingslib.applications.StorageStatsSource; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -57,11 +61,11 @@ public class StorageAsyncLoaderTest { private static final int SECONDARY_USER_ID = 10; private static final String PACKAGE_NAME_1 = "com.blah.test"; private static final String PACKAGE_NAME_2 = "com.blah.test2"; + private static final String PACKAGE_NAME_3 = "com.blah.test3"; private static final long DEFAULT_QUOTA = 64 * TrafficStats.MB_IN_BYTES; @Mock private StorageStatsSource mSource; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mContext; @Mock private PackageManager mPackageManager; @@ -76,6 +80,7 @@ public class StorageAsyncLoaderTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); + mContext = spy(ApplicationProvider.getApplicationContext()); mInfo = new ArrayList<>(); mLoader = new StorageAsyncLoader(mContext, mUserManager, "id", mSource, mPackageManager); when(mPackageManager.getInstalledApplicationsAsUser(eq(PRIMARY_USER_ID), anyInt())) @@ -85,6 +90,10 @@ public class StorageAsyncLoaderTest { mUsers.add(info); when(mUserManager.getUsers()).thenReturn(mUsers); when(mSource.getCacheQuotaBytes(anyString(), anyInt())).thenReturn(DEFAULT_QUOTA); + final Resources resources = spy(mContext.getResources()); + when(mContext.getResources()).thenReturn(resources); + doReturn("content://com.android.providers.media.documents/root/videos_root") + .when(resources).getString(R.string.config_videos_storage_category_uri); } @Test @@ -169,8 +178,8 @@ public class StorageAsyncLoaderTest { SparseArray result = mLoader.loadInBackground(); assertThat(result.size()).isEqualTo(1); - assertThat(result.get(PRIMARY_USER_ID).videoAppsSize).isEqualTo(11L); - assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(0); + // Code size is not included for file based video category. + assertThat(result.get(PRIMARY_USER_ID).videoAppsSize).isEqualTo(10L); } @Test @@ -206,7 +215,8 @@ public class StorageAsyncLoaderTest { SparseArray result = mLoader.loadInBackground(); assertThat(result.size()).isEqualTo(2); - assertThat(result.get(PRIMARY_USER_ID).videoAppsSize).isEqualTo(11L); + // Code size is not included for file based video category. + assertThat(result.get(PRIMARY_USER_ID).videoAppsSize).isEqualTo(10L); // No code size for the second user. assertThat(result.get(SECONDARY_USER_ID).videoAppsSize).isEqualTo(10L); } @@ -221,6 +231,18 @@ public class StorageAsyncLoaderTest { assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(DEFAULT_QUOTA + 11); } + @Test + public void testAppsAreFiltered() throws Exception { + addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_IMAGE); + addPackage(PACKAGE_NAME_2, 0, 1, 10, ApplicationInfo.CATEGORY_VIDEO); + addPackage(PACKAGE_NAME_3, 0, 1, 10, ApplicationInfo.CATEGORY_AUDIO); + + SparseArray result = mLoader.loadInBackground(); + + assertThat(result.size()).isEqualTo(1); + assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(33L); + } + private ApplicationInfo addPackage(String packageName, long cacheSize, long codeSize, long dataSize, int category) throws Exception { StorageStatsSource.AppStorageStats storageStats = From da4d4b2e3b55c55462d6c480d44fff1d0c4967db Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Tue, 4 May 2021 00:08:59 +0800 Subject: [PATCH 17/19] Update apps icon in Sound > Media page to correct size. - MediaSwitchPreference should inherit AppSwitchPreference Fix: 186609222 Test: visual Change-Id: I18a8c42a9eab9601acc792117928a121a3c4b436 --- .../android/settings/sound/ResumableMediaAppsController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/sound/ResumableMediaAppsController.java b/src/com/android/settings/sound/ResumableMediaAppsController.java index 383cd419d4a..3c6f8ddbdc6 100644 --- a/src/com/android/settings/sound/ResumableMediaAppsController.java +++ b/src/com/android/settings/sound/ResumableMediaAppsController.java @@ -29,9 +29,9 @@ import android.util.Log; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceScreen; -import androidx.preference.SwitchPreference; import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.widget.AppSwitchPreference; import java.util.Collections; import java.util.List; @@ -100,7 +100,7 @@ public class ResumableMediaAppsController extends BasePreferenceController { } } - class MediaSwitchPreference extends SwitchPreference { + class MediaSwitchPreference extends AppSwitchPreference { private String mPackageName; MediaSwitchPreference(Context context, String packageName) { From 30e9ba1e52f072dd73e18cbee10bb6e3adc5b1e0 Mon Sep 17 00:00:00 2001 From: bsears Date: Mon, 3 May 2021 17:59:11 +0000 Subject: [PATCH 18/19] Revert "Fixes 'no ripple effect' issue for screen attention setting" This reverts commit 20d1da2b6298ade2a2390a66f98a1d12381e5e8f. Reason for revert: Based on bisection, this is the likely root cause of b/186904496 Bug: 186904496 Change-Id: I0eaa026b52610d7ef4543c32791531971e68f8e6 --- ...veSleepPermissionPreferenceController.java | 29 ++++++-------- .../AdaptiveSleepPreferenceController.java | 39 ++++++++----------- .../display/ScreenTimeoutSettings.java | 18 +++------ ...AdaptiveSleepPreferenceControllerTest.java | 1 - .../display/ScreenTimeoutSettingsTest.java | 4 +- 5 files changed, 36 insertions(+), 55 deletions(-) diff --git a/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java b/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java index 8e4db0d26ad..0d21e9caf80 100644 --- a/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java +++ b/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java @@ -37,18 +37,26 @@ public class AdaptiveSleepPermissionPreferenceController { @VisibleForTesting BannerMessagePreference mPreference; private final PackageManager mPackageManager; - private final Context mContext; public AdaptiveSleepPermissionPreferenceController(Context context) { + final String packageName = context.getPackageManager().getAttentionServicePackageName(); mPackageManager = context.getPackageManager(); - mContext = context; + final Intent intent = new Intent( + android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.parse("package:" + packageName)); + mPreference = new BannerMessagePreference(context); + mPreference.setTitle(R.string.adaptive_sleep_title_no_permission); + mPreference.setSummary(R.string.adaptive_sleep_summary_no_permission); + mPreference.setPositiveButtonText(R.string.adaptive_sleep_manage_permission_button); + mPreference.setPositiveButtonOnClickListener(p -> { + context.startActivity(intent); + }); } /** * Adds the controlled preference to the provided preference screen. */ public void addToScreen(PreferenceScreen screen) { - initializePreference(); if (!hasSufficientPermission(mPackageManager)) { screen.addPreference(mPreference); } @@ -60,19 +68,4 @@ public class AdaptiveSleepPermissionPreferenceController { public void updateVisibility() { mPreference.setVisible(!hasSufficientPermission(mPackageManager)); } - - private void initializePreference() { - final String packageName = mContext.getPackageManager().getAttentionServicePackageName(); - final Intent intent = new Intent( - android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.setData(Uri.parse("package:" + packageName)); - mPreference = new BannerMessagePreference(mContext); - mPreference.setTitle(R.string.adaptive_sleep_title_no_permission); - mPreference.setSummary(R.string.adaptive_sleep_summary_no_permission); - mPreference.setPositiveButtonText(R.string.adaptive_sleep_manage_permission_button); - mPreference.setPositiveButtonOnClickListener(p -> { - mContext.startActivity(intent); - }); - } - } diff --git a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java index aa02ce51c81..70d8a79f390 100644 --- a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java +++ b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java @@ -49,10 +49,10 @@ public class AdaptiveSleepPreferenceController { public static final String PREFERENCE_KEY = "adaptive_sleep"; private static final int DEFAULT_VALUE = 0; private final SensorPrivacyManager mPrivacyManager; - private final RestrictionUtils mRestrictionUtils; - private final PackageManager mPackageManager; - private final Context mContext; - private final MetricsFeatureProvider mMetricsFeatureProvider; + private RestrictionUtils mRestrictionUtils; + private PackageManager mPackageManager; + private Context mContext; + private MetricsFeatureProvider mMetricsFeatureProvider; @VisibleForTesting RestrictedSwitchPreference mPreference; @@ -62,6 +62,19 @@ public class AdaptiveSleepPreferenceController { mRestrictionUtils = restrictionUtils; mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); mPrivacyManager = SensorPrivacyManager.getInstance(context); + mPreference = new RestrictedSwitchPreference(context); + mPreference.setTitle(R.string.adaptive_sleep_title); + mPreference.setSummary(R.string.adaptive_sleep_description); + mPreference.setChecked(isChecked()); + mPreference.setKey(PREFERENCE_KEY); + mPreference.setOnPreferenceClickListener(preference -> { + final boolean isChecked = ((RestrictedSwitchPreference) preference).isChecked(); + mMetricsFeatureProvider.action(context, SettingsEnums.ACTION_SCREEN_ATTENTION_CHANGED, + isChecked); + Settings.Secure.putInt(context.getContentResolver(), + Settings.Secure.ADAPTIVE_SLEEP, isChecked ? 1 : DEFAULT_VALUE); + return true; + }); mPackageManager = context.getPackageManager(); } @@ -73,7 +86,6 @@ public class AdaptiveSleepPreferenceController { * Adds the controlled preference to the provided preference screen. */ public void addToScreen(PreferenceScreen screen) { - initializePreference(); updatePreference(); screen.addPreference(mPreference); } @@ -91,23 +103,6 @@ public class AdaptiveSleepPreferenceController { } } - @VisibleForTesting - void initializePreference() { - mPreference = new RestrictedSwitchPreference(mContext); - mPreference.setTitle(R.string.adaptive_sleep_title); - mPreference.setSummary(R.string.adaptive_sleep_description); - mPreference.setChecked(isChecked()); - mPreference.setKey(PREFERENCE_KEY); - mPreference.setOnPreferenceChangeListener((preference, value) -> { - final boolean isChecked = (Boolean) value; - mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_SCREEN_ATTENTION_CHANGED, - isChecked); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ADAPTIVE_SLEEP, isChecked ? 1 : DEFAULT_VALUE); - return true; - }); - } - @VisibleForTesting boolean isChecked() { return hasSufficientPermission(mContext.getPackageManager()) && !isCameraLocked() diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java index 6dfb22529fe..27e1e1bfc45 100644 --- a/src/com/android/settings/display/ScreenTimeoutSettings.java +++ b/src/com/android/settings/display/ScreenTimeoutSettings.java @@ -71,15 +71,11 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements private CharSequence[] mInitialEntries; private CharSequence[] mInitialValues; private FooterPreference mPrivacyPreference; - private final MetricsFeatureProvider mMetricsFeatureProvider; + private MetricsFeatureProvider mMetricsFeatureProvider; private SensorPrivacyManager mPrivacyManager; - @VisibleForTesting - Context mContext; - @VisibleForTesting RestrictedLockUtils.EnforcedAdmin mAdmin; - @VisibleForTesting Preference mDisableOptionsPreference; @@ -101,7 +97,6 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements @Override public void onAttach(Context context) { super.onAttach(context); - mContext = context; mInitialEntries = getResources().getStringArray(R.array.screen_timeout_entries); mInitialValues = getResources().getStringArray(R.array.screen_timeout_values); mAdaptiveSleepController = new AdaptiveSleepPreferenceController(context); @@ -109,6 +104,11 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements context); mAdaptiveSleepCameraStatePreferenceController = new AdaptiveSleepCameraStatePreferenceController(context); + mPrivacyPreference = new FooterPreference(context); + mPrivacyPreference.setIcon(R.drawable.ic_privacy_shield_24dp); + mPrivacyPreference.setTitle(R.string.adaptive_sleep_privacy); + mPrivacyPreference.setSelectable(false); + mPrivacyPreference.setLayoutResource(R.layout.preference_footer); mPrivacyManager = SensorPrivacyManager.getInstance(context); mPrivacyManager.addSensorPrivacyListener(CAMERA, (sensor, enabled) -> mAdaptiveSleepController.updatePreference()); @@ -167,12 +167,6 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements preferenceWithLargestTimeout.setChecked(true); } - mPrivacyPreference = new FooterPreference(mContext); - mPrivacyPreference.setIcon(R.drawable.ic_privacy_shield_24dp); - mPrivacyPreference.setTitle(R.string.adaptive_sleep_privacy); - mPrivacyPreference.setSelectable(false); - mPrivacyPreference.setLayoutResource(R.layout.preference_footer); - if (isScreenAttentionAvailable(getContext())) { mAdaptiveSleepPermissionController.addToScreen(screen); mAdaptiveSleepCameraStatePreferenceController.addToScreen(screen); diff --git a/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java index 880f9ccdcaf..843870d0a9e 100644 --- a/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java @@ -84,7 +84,6 @@ public class AdaptiveSleepPreferenceControllerTest { eq(UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT))).thenReturn(null); mController = new AdaptiveSleepPreferenceController(mContext, mRestrictionUtils); - mController.initializePreference(); when(mController.isCameraLocked()).thenReturn(false); } diff --git a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java index 24bcde871e4..c4f55808870 100644 --- a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java +++ b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java @@ -60,6 +60,8 @@ public class ScreenTimeoutSettingsTest { private ScreenTimeoutSettings mSettings; private Context mContext; private ContentResolver mContentResolver; + + @Mock private Resources mResources; @Mock @@ -83,9 +85,7 @@ public class ScreenTimeoutSettingsTest { FakeFeatureFactory.setupForTest(); mContext = spy(getApplicationContext()); mSettings = spy(new ScreenTimeoutSettings()); - mSettings.mContext = mContext; mContentResolver = mContext.getContentResolver(); - mResources = spy(mContext.getResources()); doReturn(TIMEOUT_ENTRIES).when(mResources).getStringArray(R.array.screen_timeout_entries); doReturn(TIMEOUT_VALUES).when(mResources).getStringArray(R.array.screen_timeout_entries); From 6417493b299adfa56df8d5b0ecf78c5f90731844 Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Wed, 28 Apr 2021 17:03:30 -0700 Subject: [PATCH 19/19] Replace uses of SystemBatteryConsumer with aggregate BatteryConsumers Bug: 186006876 Test: make RunSettingsRoboTests Test: make RunSettingsGoogleRoboTests Change-Id: I2e240aa15c87b4b9dcbe993b4b0b1111285ec3ff --- .../BatteryAppListPreferenceController.java | 70 +++++++---- .../settings/fuelgauge/BatteryDiffEntry.java | 7 +- .../settings/fuelgauge/BatteryEntry.java | 115 +++++++++++------- .../settings/fuelgauge/BatteryHistEntry.java | 12 +- .../settings/fuelgauge/BatteryUtils.java | 32 +++-- .../settings/fuelgauge/ConvertUtils.java | 33 +---- .../fuelgauge/BatteryDiffEntryTest.java | 11 +- .../settings/fuelgauge/BatteryEntryTest.java | 59 +++++---- .../fuelgauge/BatteryHistEntryTest.java | 15 +-- .../settings/fuelgauge/BatteryUtilsTest.java | 46 +++---- .../settings/fuelgauge/ConvertUtilsTest.java | 57 +-------- 11 files changed, 224 insertions(+), 233 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java index b09dfd59faf..707a04b9d8a 100644 --- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java @@ -21,13 +21,13 @@ import android.app.Activity; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; +import android.os.AggregateBatteryConsumer; import android.os.BatteryConsumer; import android.os.BatteryUsageStats; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Process; -import android.os.SystemBatteryConsumer; import android.os.UidBatteryConsumer; import android.os.UserBatteryConsumer; import android.os.UserHandle; @@ -344,16 +344,38 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro } } - final List systemBatteryConsumers = - mBatteryUsageStats.getSystemBatteryConsumers(); - for (int i = 0, size = systemBatteryConsumers.size(); i < size; i++) { - final SystemBatteryConsumer consumer = systemBatteryConsumers.get(i); - if (!showAllApps && mBatteryUtils.shouldHideSystemBatteryConsumer(consumer)) { + final BatteryConsumer deviceConsumer = mBatteryUsageStats.getAggregateBatteryConsumer( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE); + final BatteryConsumer appsConsumer = mBatteryUsageStats.getAggregateBatteryConsumer( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS); + + for (int componentId = 0; componentId < BatteryConsumer.POWER_COMPONENT_COUNT; + componentId++) { + if (!showAllApps + && mBatteryUtils.shouldHideDevicePowerComponent(deviceConsumer, componentId)) { continue; } - results.add(new BatteryEntry(mContext, mHandler, mUserManager, - consumer, /* isHidden */ true, null, null, loadDataInBackground)); + results.add(new BatteryEntry(mContext, componentId, + deviceConsumer.getConsumedPower(componentId), + appsConsumer.getConsumedPower(componentId), + deviceConsumer.getUsageDurationMillis(componentId))); + } + + for (int componentId = BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID; + componentId < BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + + deviceConsumer.getCustomPowerComponentCount(); + componentId++) { + if (!showAllApps + && mBatteryUtils.shouldHideCustomDevicePowerComponent(deviceConsumer, + componentId)) { + continue; + } + + results.add(new BatteryEntry(mContext, componentId, + deviceConsumer.getCustomPowerComponentName(componentId), + deviceConsumer.getConsumedPowerForCustomComponent(componentId), + appsConsumer.getConsumedPowerForCustomComponent(componentId))); } if (showAllApps) { @@ -431,20 +453,26 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro .setDischargePercentage(100); float use = 500; - for (@SystemBatteryConsumer.DrainType int drainType : new int[]{ - SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY, - SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH, - SystemBatteryConsumer.DRAIN_TYPE_CAMERA, - SystemBatteryConsumer.DRAIN_TYPE_FLASHLIGHT, - SystemBatteryConsumer.DRAIN_TYPE_IDLE, - SystemBatteryConsumer.DRAIN_TYPE_MEMORY, - SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO, - SystemBatteryConsumer.DRAIN_TYPE_PHONE, - SystemBatteryConsumer.DRAIN_TYPE_SCREEN, - SystemBatteryConsumer.DRAIN_TYPE_WIFI, + final AggregateBatteryConsumer.Builder appsBatteryConsumerBuilder = + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS); + final AggregateBatteryConsumer.Builder deviceBatteryConsumerBuilder = + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE); + for (@BatteryConsumer.PowerComponent int componentId : new int[]{ + BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, + BatteryConsumer.POWER_COMPONENT_BLUETOOTH, + BatteryConsumer.POWER_COMPONENT_CAMERA, + BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, + BatteryConsumer.POWER_COMPONENT_IDLE, + BatteryConsumer.POWER_COMPONENT_MEMORY, + BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + BatteryConsumer.POWER_COMPONENT_PHONE, + BatteryConsumer.POWER_COMPONENT_SCREEN, + BatteryConsumer.POWER_COMPONENT_WIFI, }) { - builder.getOrCreateSystemBatteryConsumerBuilder(drainType) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, use); + appsBatteryConsumerBuilder.setConsumedPower(componentId, use); + deviceBatteryConsumerBuilder.setConsumedPower(componentId, use * 2); use += 5; } diff --git a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java index 9a199bf9cda..b1e17d11161 100644 --- a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java +++ b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java @@ -15,8 +15,6 @@ package com.android.settings.fuelgauge; import android.content.Context; import android.content.pm.ApplicationInfo; -import android.content.pm.IPackageManager; -import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.graphics.drawable.Drawable; @@ -29,7 +27,6 @@ import androidx.annotation.VisibleForTesting; import com.android.settingslib.utils.StringUtil; -import java.time.Duration; import java.util.Comparator; import java.util.HashMap; import java.util.Locale; @@ -158,8 +155,8 @@ public class BatteryDiffEntry { break; case ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY: final BatteryEntry.NameAndIcon nameAndIconForSystem = - BatteryEntry.getNameAndIconFromDrainType( - mContext, mBatteryHistEntry.mDrainType); + BatteryEntry.getNameAndIconFromPowerComponent( + mContext, mBatteryHistEntry.mPowerComponentId); if (nameAndIconForSystem != null) { mAppLabel = nameAndIconForSystem.name; if (nameAndIconForSystem.iconId != 0) { diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java index f9c4b288e89..25a66b6c34d 100644 --- a/src/com/android/settings/fuelgauge/BatteryEntry.java +++ b/src/com/android/settings/fuelgauge/BatteryEntry.java @@ -29,11 +29,11 @@ import android.os.BatteryConsumer; import android.os.Handler; import android.os.Process; import android.os.RemoteException; -import android.os.SystemBatteryConsumer; import android.os.UidBatteryConsumer; import android.os.UserBatteryConsumer; import android.os.UserHandle; import android.os.UserManager; +import android.util.DebugUtils; import android.util.Log; import androidx.annotation.NonNull; @@ -160,6 +160,11 @@ public class BatteryEntry { private final Context mContext; private final BatteryConsumer mBatteryConsumer; private final boolean mIsHidden; + @ConvertUtils.ConsumerType + private final int mConsumerType; + @BatteryConsumer.PowerComponent + private final int mPowerComponentId; + private long mUsageDurationMs; public String name; public Drawable icon; @@ -188,8 +193,10 @@ public class BatteryEntry { mBatteryConsumer = batteryConsumer; mIsHidden = isHidden; mDefaultPackageName = packageName; + mPowerComponentId = -1; if (batteryConsumer instanceof UidBatteryConsumer) { + mConsumerType = ConvertUtils.CONSUMER_TYPE_UID_BATTERY; mConsumedPower = batteryConsumer.getConsumedPower(); UidBatteryConsumer uidBatteryConsumer = (UidBatteryConsumer) batteryConsumer; @@ -215,27 +222,54 @@ public class BatteryEntry { } } getQuickNameIconForUid(uid, packages, loadDataInBackground); - return; - } else if (batteryConsumer instanceof SystemBatteryConsumer) { - mConsumedPower = batteryConsumer.getConsumedPower() - - ((SystemBatteryConsumer) batteryConsumer).getPowerConsumedByApps(); - final NameAndIcon nameAndIcon = getNameAndIconFromDrainType( - context, ((SystemBatteryConsumer) batteryConsumer).getDrainType()); - iconId = nameAndIcon.iconId; - name = nameAndIcon.name; } else if (batteryConsumer instanceof UserBatteryConsumer) { + mConsumerType = ConvertUtils.CONSUMER_TYPE_USER_BATTERY; mConsumedPower = batteryConsumer.getConsumedPower(); final NameAndIcon nameAndIcon = getNameAndIconFromUserId( context, ((UserBatteryConsumer) batteryConsumer).getUserId()); icon = nameAndIcon.icon; name = nameAndIcon.name; + } else { + throw new IllegalArgumentException("Unsupported battery consumer: " + batteryConsumer); } + } + /** Battery entry for a power component of AggregateBatteryConsumer */ + public BatteryEntry(Context context, int powerComponentId, double devicePowerMah, + double appsPowerMah, long usageDurationMs) { + mContext = context; + mBatteryConsumer = null; + mIsHidden = false; + mPowerComponentId = powerComponentId; + mConsumedPower = devicePowerMah - appsPowerMah; + mUsageDurationMs = usageDurationMs; + mConsumerType = ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY; + + final NameAndIcon nameAndIcon = getNameAndIconFromPowerComponent(context, powerComponentId); + iconId = nameAndIcon.iconId; + name = nameAndIcon.name; if (iconId != 0) { icon = context.getDrawable(iconId); } } + /** Battery entry for a custom power component of AggregateBatteryConsumer */ + public BatteryEntry(Context context, int powerComponentId, String powerComponentName, + double devicePowerMah, double appsPowerMah) { + mContext = context; + mBatteryConsumer = null; + mIsHidden = false; + mPowerComponentId = powerComponentId; + + iconId = R.drawable.ic_power_system; + icon = context.getDrawable(iconId); + name = powerComponentName; + + mConsumedPower = devicePowerMah - appsPowerMah; + mConsumerType = ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY; + } + + public Drawable getIcon() { return icon; } @@ -247,6 +281,16 @@ public class BatteryEntry { return name; } + @ConvertUtils.ConsumerType + public int getConsumerType() { + return mConsumerType; + } + + @BatteryConsumer.PowerComponent + public int getPowerComponentId() { + return mPowerComponentId; + } + void getQuickNameIconForUid( final int uid, final String[] packages, final boolean loadDataInBackground) { // Locale sync to system config in Settings @@ -395,13 +439,10 @@ public class BatteryEntry { public String getKey() { if (mBatteryConsumer instanceof UidBatteryConsumer) { return Integer.toString(((UidBatteryConsumer) mBatteryConsumer).getUid()); - } else if (mBatteryConsumer instanceof SystemBatteryConsumer) { - return "S|" + ((SystemBatteryConsumer) mBatteryConsumer).getDrainType(); } else if (mBatteryConsumer instanceof UserBatteryConsumer) { return "U|" + ((UserBatteryConsumer) mBatteryConsumer).getUserId(); } else { - Log.w(TAG, "Unsupported BatteryConsumer: " + mBatteryConsumer); - return ""; + return "S|" + mPowerComponentId; } } @@ -448,13 +489,6 @@ public class BatteryEntry { } } - /** - * Returns the BatteryConsumer of the app described by this entry. - */ - public BatteryConsumer getBatteryConsumer() { - return mBatteryConsumer; - } - /** * Returns foreground foreground time (in milliseconds) that is attributed to this entry. */ @@ -462,10 +496,8 @@ public class BatteryEntry { if (mBatteryConsumer instanceof UidBatteryConsumer) { return ((UidBatteryConsumer) mBatteryConsumer).getTimeInStateMs( UidBatteryConsumer.STATE_FOREGROUND); - } else if (mBatteryConsumer instanceof SystemBatteryConsumer) { - return ((SystemBatteryConsumer) mBatteryConsumer).getUsageDurationMillis(); } else { - return 0; + return mUsageDurationMs; } } @@ -537,52 +569,53 @@ public class BatteryEntry { } /** - * Gets name annd icon resource from SystemBatteryConsumer drain type. + * Gets name and icon resource from BatteryConsumer power component ID. */ - public static NameAndIcon getNameAndIconFromDrainType( - Context context, final int drainType) { - String name = null; - int iconId = 0; - switch (drainType) { - case SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY: + public static NameAndIcon getNameAndIconFromPowerComponent( + Context context, @BatteryConsumer.PowerComponent int powerComponentId) { + String name; + int iconId; + switch (powerComponentId) { + case BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY: name = context.getResources().getString(R.string.ambient_display_screen_title); iconId = R.drawable.ic_settings_aod; break; - case SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH: + case BatteryConsumer.POWER_COMPONENT_BLUETOOTH: name = context.getResources().getString(R.string.power_bluetooth); iconId = com.android.internal.R.drawable.ic_settings_bluetooth; break; - case SystemBatteryConsumer.DRAIN_TYPE_CAMERA: + case BatteryConsumer.POWER_COMPONENT_CAMERA: name = context.getResources().getString(R.string.power_camera); iconId = R.drawable.ic_settings_camera; break; - case SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO: + case BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO: name = context.getResources().getString(R.string.power_cell); iconId = R.drawable.ic_cellular_1_bar; break; - case SystemBatteryConsumer.DRAIN_TYPE_FLASHLIGHT: + case BatteryConsumer.POWER_COMPONENT_FLASHLIGHT: name = context.getResources().getString(R.string.power_flashlight); iconId = R.drawable.ic_settings_display; break; - case SystemBatteryConsumer.DRAIN_TYPE_PHONE: + case BatteryConsumer.POWER_COMPONENT_PHONE: name = context.getResources().getString(R.string.power_phone); iconId = R.drawable.ic_settings_voice_calls; break; - case SystemBatteryConsumer.DRAIN_TYPE_SCREEN: + case BatteryConsumer.POWER_COMPONENT_SCREEN: name = context.getResources().getString(R.string.power_screen); iconId = R.drawable.ic_settings_display; break; - case SystemBatteryConsumer.DRAIN_TYPE_WIFI: + case BatteryConsumer.POWER_COMPONENT_WIFI: name = context.getResources().getString(R.string.power_wifi); iconId = R.drawable.ic_settings_wireless; break; - case SystemBatteryConsumer.DRAIN_TYPE_IDLE: - case SystemBatteryConsumer.DRAIN_TYPE_MEMORY: + case BatteryConsumer.POWER_COMPONENT_IDLE: + case BatteryConsumer.POWER_COMPONENT_MEMORY: name = context.getResources().getString(R.string.power_idle); iconId = R.drawable.ic_settings_phone_idle; break; - case SystemBatteryConsumer.DRAIN_TYPE_CUSTOM: - name = null; + default: + name = DebugUtils.constantToString(BatteryConsumer.class, "POWER_COMPONENT_", + powerComponentId); iconId = R.drawable.ic_power_system; break; } diff --git a/src/com/android/settings/fuelgauge/BatteryHistEntry.java b/src/com/android/settings/fuelgauge/BatteryHistEntry.java index f5620000baf..e317bad1d33 100644 --- a/src/com/android/settings/fuelgauge/BatteryHistEntry.java +++ b/src/com/android/settings/fuelgauge/BatteryHistEntry.java @@ -15,10 +15,8 @@ package com.android.settings.fuelgauge; import android.content.ContentValues; import android.database.Cursor; -import android.util.Log; import java.time.Duration; -import java.util.TimeZone; /** A container class to carry data from {@link ContentValues}. */ public class BatteryHistEntry { @@ -61,7 +59,7 @@ public class BatteryHistEntry { public final double mPercentOfTotal; public final long mForegroundUsageTimeInMs; public final long mBackgroundUsageTimeInMs; - public final int mDrainType; + public final int mPowerComponentId; public final int mConsumerType; // Records the battery intent relative information. public final int mBatteryLevel; @@ -85,7 +83,7 @@ public class BatteryHistEntry { mPercentOfTotal = getDouble(values, KEY_PERCENT_OF_TOTAL); mForegroundUsageTimeInMs = getLong(values, KEY_FOREGROUND_USAGE_TIME); mBackgroundUsageTimeInMs = getLong(values, KEY_BACKGROUND_USAGE_TIME); - mDrainType = getInteger(values, KEY_DRAIN_TYPE); + mPowerComponentId = getInteger(values, KEY_DRAIN_TYPE); mConsumerType = getInteger(values, KEY_CONSUMER_TYPE); mBatteryLevel = getInteger(values, KEY_BATTERY_LEVEL); mBatteryStatus = getInteger(values, KEY_BATTERY_STATUS); @@ -106,7 +104,7 @@ public class BatteryHistEntry { mPercentOfTotal = getDouble(cursor, KEY_PERCENT_OF_TOTAL); mForegroundUsageTimeInMs = getLong(cursor, KEY_FOREGROUND_USAGE_TIME); mBackgroundUsageTimeInMs = getLong(cursor, KEY_BACKGROUND_USAGE_TIME); - mDrainType = getInteger(cursor, KEY_DRAIN_TYPE); + mPowerComponentId = getInteger(cursor, KEY_DRAIN_TYPE); mConsumerType = getInteger(cursor, KEY_CONSUMER_TYPE); mBatteryLevel = getInteger(cursor, KEY_BATTERY_LEVEL); mBatteryStatus = getInteger(cursor, KEY_BATTERY_STATUS); @@ -141,7 +139,7 @@ public class BatteryHistEntry { mKey = Long.toString(mUid); break; case ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY: - mKey = "S|" + mDrainType; + mKey = "S|" + mPowerComponentId; break; case ConvertUtils.CONSUMER_TYPE_USER_BATTERY: mKey = "U|" + mUserId; @@ -164,7 +162,7 @@ public class BatteryHistEntry { mPercentOfTotal, mTotalPower, mConsumePower, Duration.ofMillis(mForegroundUsageTimeInMs).getSeconds(), Duration.ofMillis(mBackgroundUsageTimeInMs).getSeconds())) - .append(String.format("\n\tdrain=%d|consumer=%d", mDrainType, mConsumerType)) + .append(String.format("\n\tdrain=%d|consumer=%d", mPowerComponentId, mConsumerType)) .append(String.format("\n\tbattery=%d|status=%d|health=%d\n}", mBatteryLevel, mBatteryStatus, mBatteryHealth)); return builder.toString(); diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java index 68a0b033f1a..df11ae150d5 100644 --- a/src/com/android/settings/fuelgauge/BatteryUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryUtils.java @@ -23,13 +23,13 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryStatsManager; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.Build; import android.os.Process; -import android.os.SystemBatteryConsumer; import android.os.SystemClock; import android.os.UidBatteryConsumer; import android.os.UserHandle; @@ -195,22 +195,34 @@ public class BatteryUtils { } /** - * Returns true if the specified battery consumer should be excluded from the summary + * Returns true if the specified device power component should be excluded from the summary * battery consumption list. */ - public boolean shouldHideSystemBatteryConsumer(SystemBatteryConsumer consumer) { - switch (consumer.getDrainType()) { - case SystemBatteryConsumer.DRAIN_TYPE_IDLE: - case SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO: - case SystemBatteryConsumer.DRAIN_TYPE_SCREEN: - case SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH: - case SystemBatteryConsumer.DRAIN_TYPE_WIFI: + public boolean shouldHideDevicePowerComponent(BatteryConsumer consumer, + @BatteryConsumer.PowerComponent int powerComponentId) { + switch (powerComponentId) { + case BatteryConsumer.POWER_COMPONENT_IDLE: + case BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO: + case BatteryConsumer.POWER_COMPONENT_SCREEN: + case BatteryConsumer.POWER_COMPONENT_BLUETOOTH: + case BatteryConsumer.POWER_COMPONENT_WIFI: return true; default: - return consumer.getConsumedPower() < MIN_POWER_THRESHOLD_MILLI_AMP_HOURS; + return consumer.getConsumedPower(powerComponentId) + < MIN_POWER_THRESHOLD_MILLI_AMP_HOURS; } } + /** + * Returns true if the specified device custom power component should be excluded from the + * summary battery consumption list. + */ + public boolean shouldHideCustomDevicePowerComponent(BatteryConsumer consumer, + int customPowerComponentId) { + return consumer.getConsumedPowerForCustomComponent(customPowerComponentId) + < MIN_POWER_THRESHOLD_MILLI_AMP_HOURS; + } + /** * Returns true if one the specified packages belongs to a hidden system module. */ diff --git a/src/com/android/settings/fuelgauge/ConvertUtils.java b/src/com/android/settings/fuelgauge/ConvertUtils.java index 1d332a20e72..e565567edd4 100644 --- a/src/com/android/settings/fuelgauge/ConvertUtils.java +++ b/src/com/android/settings/fuelgauge/ConvertUtils.java @@ -15,14 +15,9 @@ package com.android.settings.fuelgauge; import android.annotation.IntDef; import android.content.ContentValues; -import android.os.BatteryConsumer; -import android.os.BatteryUsageStats; import android.content.Context; -import android.os.SystemBatteryConsumer; -import android.os.UidBatteryConsumer; -import android.os.UserBatteryConsumer; +import android.os.BatteryUsageStats; import android.os.UserHandle; -import android.util.Log; import androidx.annotation.VisibleForTesting; @@ -79,28 +74,6 @@ public final class ConvertUtils { private ConvertUtils() {} - /** Gets consumer type from {@link BatteryConsumer}. */ - @ConsumerType - public static int getConsumerType(BatteryConsumer consumer) { - if (consumer instanceof UidBatteryConsumer) { - return CONSUMER_TYPE_UID_BATTERY; - } else if (consumer instanceof UserBatteryConsumer) { - return CONSUMER_TYPE_USER_BATTERY; - } else if (consumer instanceof SystemBatteryConsumer) { - return CONSUMER_TYPE_SYSTEM_BATTERY; - } else { - return CONSUMER_TYPE_UNKNOWN; - } - } - - /** Gets battery drain type for {@link SystemBatteryConsumer}. */ - public static int getDrainType(BatteryConsumer consumer) { - if (consumer instanceof SystemBatteryConsumer) { - return ((SystemBatteryConsumer) consumer).getDrainType(); - } - return INVALID_DRAIN_TYPE; - } - public static ContentValues convert( BatteryEntry entry, BatteryUsageStats batteryUsageStats, @@ -129,9 +102,9 @@ public final class ConvertUtils { values.put(BatteryHistEntry.KEY_BACKGROUND_USAGE_TIME, Long.valueOf(entry.getTimeInBackgroundMs())); values.put(BatteryHistEntry.KEY_DRAIN_TYPE, - getDrainType(entry.getBatteryConsumer())); + entry.getPowerComponentId()); values.put(BatteryHistEntry.KEY_CONSUMER_TYPE, - getConsumerType(entry.getBatteryConsumer())); + entry.getConsumerType()); } else { values.put(BatteryHistEntry.KEY_PACKAGE_NAME, FAKE_PACKAGE_NAME); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java index c536b061e24..73a8b7af5cc 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java @@ -17,18 +17,17 @@ package com.android.settings.fuelgauge; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; -import android.content.Context; import android.content.ContentValues; +import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; -import android.os.SystemBatteryConsumer; -import android.os.UserManager; +import android.os.BatteryConsumer; import android.os.UserHandle; +import android.os.UserManager; import com.android.settings.R; @@ -112,9 +111,9 @@ public final class BatteryDiffEntryTest { public void testLoadLabelAndIcon_forSystemBattery_returnExpectedResult() { // Generates fake testing data. final ContentValues values = getContentValuesWithType( - ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY); + ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY); values.put("drainType", - Integer.valueOf(SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY)); + Integer.valueOf(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY)); final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values); final BatteryDiffEntry entry = createBatteryDiffEntry(10, batteryHistEntry); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java index 87d4c74c9f6..e0f8ba70578 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java @@ -28,9 +28,9 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.os.BatteryConsumer; import android.os.Handler; import android.os.Process; -import android.os.SystemBatteryConsumer; import android.os.UidBatteryConsumer; import android.os.UserBatteryConsumer; import android.os.UserManager; @@ -68,7 +68,6 @@ public class BatteryEntryTest { @Mock private PackageManager mockPackageManager; @Mock private UserManager mockUserManager; @Mock private UidBatteryConsumer mUidBatteryConsumer; - @Mock private SystemBatteryConsumer mSystemBatteryConsumer; @Before public void stubContextToReturnMockPackageManager() { @@ -97,11 +96,12 @@ public class BatteryEntryTest { consumer, false, packages, packageName); } - private BatteryEntry createSystemBatteryEntry(int drainType) { - SystemBatteryConsumer consumer = mock(SystemBatteryConsumer.class); - when(consumer.getDrainType()).thenReturn(drainType); - return new BatteryEntry(mMockContext, mockHandler, mockUserManager, - consumer, false, null, null); + private BatteryEntry createAggregateBatteryEntry(int powerComponentId) { + return new BatteryEntry(mMockContext, powerComponentId, 200, 100, 1000); + } + + private BatteryEntry createCustomAggregateBatteryEntry(int powerComponentId) { + return new BatteryEntry(mMockContext, powerComponentId, "CUSTOM", 200, 100); } private BatteryEntry createUserBatteryConsumer(int userId) { @@ -151,16 +151,22 @@ public class BatteryEntryTest { @Test public void batteryEntryForAOD_containCorrectInfo() { - final SystemBatteryConsumer systemBatteryConsumer = mock(SystemBatteryConsumer.class); - when(systemBatteryConsumer.getDrainType()) - .thenReturn(SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY); - final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, mockHandler, - mockUserManager, systemBatteryConsumer, false, null, null); + final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, + BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, 200, 100, 1000); assertThat(entry.iconId).isEqualTo(R.drawable.ic_settings_aod); assertThat(entry.name).isEqualTo("Ambient display"); } + @Test + public void batteryEntryForCustomComponent_containCorrectInfo() { + final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, + BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 42, "ABC", 200, 100); + + assertThat(entry.iconId).isEqualTo(R.drawable.ic_power_system); + assertThat(entry.name).isEqualTo("ABC"); + } + @Test public void getTimeInForegroundMs_app() { final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, mockHandler, @@ -173,11 +179,9 @@ public class BatteryEntryTest { } @Test - public void getTimeInForegroundMs_systemConsumer() { - final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, mockHandler, - mockUserManager, mSystemBatteryConsumer, false, null, null); - - when(mSystemBatteryConsumer.getUsageDurationMillis()).thenReturn(100L); + public void getTimeInForegroundMs_aggregateBatteryConsumer() { + final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, + BatteryConsumer.POWER_COMPONENT_BLUETOOTH, 10, 20, 100); assertThat(entry.getTimeInForegroundMs()).isEqualTo(100L); } @@ -195,11 +199,8 @@ public class BatteryEntryTest { @Test public void getTimeInBackgroundMs_systemConsumer() { - final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, mockHandler, - mockUserManager, mSystemBatteryConsumer, false, null, null); - - when(mSystemBatteryConsumer.getUsageDurationMillis()) - .thenReturn(100L); + final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, + BatteryConsumer.POWER_COMPONENT_BLUETOOTH, 100, 200, 1000); assertThat(entry.getTimeInBackgroundMs()).isEqualTo(0); } @@ -225,13 +226,21 @@ public class BatteryEntryTest { } @Test - public void getKey_SystemBatteryConsumer_returnDrainType() { - final BatteryEntry entry = - createSystemBatteryEntry(SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH); + public void getKey_AggregateBatteryConsumer_returnComponentId() { + final BatteryEntry entry = createAggregateBatteryEntry( + BatteryConsumer.POWER_COMPONENT_BLUETOOTH); final String key = entry.getKey(); assertThat(key).isEqualTo("S|2"); } + @Test + public void getKey_CustomAggregateBatteryConsumer_returnComponentId() { + final BatteryEntry entry = createCustomAggregateBatteryEntry( + BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 42); + final String key = entry.getKey(); + assertThat(key).isEqualTo("S|1042"); + } + @Test public void getKey_UserBatteryConsumer_returnUserId() { doReturn(mockUserManager).when(mMockContext).getSystemService(UserManager.class); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java index 9a196cb1822..f6cbb9cf8d7 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHistEntryTest.java @@ -17,15 +17,12 @@ package com.android.settings.fuelgauge; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; -import android.database.MatrixCursor; import android.content.ContentValues; -import android.os.BatteryConsumer; +import android.database.MatrixCursor; import android.os.BatteryManager; import android.os.BatteryUsageStats; -import android.os.SystemBatteryConsumer; import android.os.UserHandle; import org.junit.Before; @@ -44,8 +41,6 @@ public final class BatteryHistEntryTest { private BatteryEntry mockBatteryEntry; @Mock private BatteryUsageStats mBatteryUsageStats; - @Mock - private SystemBatteryConsumer mockSystemBatteryConsumer; @Before public void setUp() { @@ -65,9 +60,9 @@ public final class BatteryHistEntryTest { mockBatteryEntry.percent = 0.3; when(mockBatteryEntry.getTimeInForegroundMs()).thenReturn(1234L); when(mockBatteryEntry.getTimeInBackgroundMs()).thenReturn(5689L); - when(mockBatteryEntry.getBatteryConsumer()) - .thenReturn(mockSystemBatteryConsumer); - when(mockSystemBatteryConsumer.getDrainType()).thenReturn(expectedType); + when(mockBatteryEntry.getPowerComponentId()).thenReturn(expectedType); + when(mockBatteryEntry.getConsumerType()) + .thenReturn(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY); final ContentValues values = ConvertUtils.convert( mockBatteryEntry, @@ -228,7 +223,7 @@ public final class BatteryHistEntryTest { assertThat(entry.mPercentOfTotal).isEqualTo(percentOfTotal); assertThat(entry.mForegroundUsageTimeInMs).isEqualTo(1234L); assertThat(entry.mBackgroundUsageTimeInMs).isEqualTo(5689L); - assertThat(entry.mDrainType).isEqualTo(drainType); + assertThat(entry.mPowerComponentId).isEqualTo(drainType); assertThat(entry.mConsumerType) .isEqualTo(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY); assertThat(entry.mBatteryLevel).isEqualTo(12); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java index 744db8c4e97..1259cdd5713 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java @@ -44,12 +44,12 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryStatsManager; import android.os.BatteryUsageStats; import android.os.Build; import android.os.Process; -import android.os.SystemBatteryConsumer; import android.os.SystemClock; import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper; @@ -113,7 +113,7 @@ public class BatteryUtilsTest { @Mock private BatteryUsageStats mBatteryUsageStats; @Mock - private SystemBatteryConsumer mSystemBatteryConsumer; + private BatteryConsumer mAggregateBatteryConsumer; @Mock private BatteryInfo mBatteryInfo; @Mock @@ -218,53 +218,47 @@ public class BatteryUtilsTest { @Test public void testShouldHideSystemConsumer_TypeIdle_ReturnTrue() { - when(mSystemBatteryConsumer.getDrainType()) - .thenReturn(SystemBatteryConsumer.DRAIN_TYPE_IDLE); - assertThat(mBatteryUtils.shouldHideSystemBatteryConsumer(mSystemBatteryConsumer)).isTrue(); + assertThat(mBatteryUtils.shouldHideDevicePowerComponent(mAggregateBatteryConsumer, + BatteryConsumer.POWER_COMPONENT_IDLE)).isTrue(); } @Test public void testShouldHideSystemConsumer_TypeMobileRadio_ReturnTrue() { - when(mSystemBatteryConsumer.getDrainType()) - .thenReturn(SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO); - assertThat(mBatteryUtils.shouldHideSystemBatteryConsumer(mSystemBatteryConsumer)).isTrue(); + assertThat(mBatteryUtils.shouldHideDevicePowerComponent(mAggregateBatteryConsumer, + BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)).isTrue(); } @Test public void testShouldHideSystemConsumer_TypeScreen_ReturnTrue() { - when(mSystemBatteryConsumer.getDrainType()) - .thenReturn(SystemBatteryConsumer.DRAIN_TYPE_SCREEN); - assertThat(mBatteryUtils.shouldHideSystemBatteryConsumer(mSystemBatteryConsumer)).isTrue(); + assertThat(mBatteryUtils.shouldHideDevicePowerComponent(mAggregateBatteryConsumer, + BatteryConsumer.POWER_COMPONENT_SCREEN)).isTrue(); } @Test public void testShouldHideSystemConsumer_TypeBluetooth_ReturnTrue() { - when(mSystemBatteryConsumer.getDrainType()) - .thenReturn(SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH); - assertThat(mBatteryUtils.shouldHideSystemBatteryConsumer(mSystemBatteryConsumer)).isTrue(); - } + assertThat(mBatteryUtils.shouldHideDevicePowerComponent(mAggregateBatteryConsumer, + BatteryConsumer.POWER_COMPONENT_BLUETOOTH)).isTrue(); } @Test public void testShouldHideSystemConsumer_TypeWifi_ReturnTrue() { - when(mSystemBatteryConsumer.getDrainType()) - .thenReturn(SystemBatteryConsumer.DRAIN_TYPE_WIFI); - assertThat(mBatteryUtils.shouldHideSystemBatteryConsumer(mSystemBatteryConsumer)).isTrue(); + assertThat(mBatteryUtils.shouldHideDevicePowerComponent(mAggregateBatteryConsumer, + BatteryConsumer.POWER_COMPONENT_WIFI)).isTrue(); } @Test public void testShouldHideSystemConsumer_LowPower_ReturnTrue() { - when(mSystemBatteryConsumer.getDrainType()) - .thenReturn(SystemBatteryConsumer.DRAIN_TYPE_FLASHLIGHT); - when(mSystemBatteryConsumer.getConsumedPower()).thenReturn(0.0005); - assertThat(mBatteryUtils.shouldHideSystemBatteryConsumer(mSystemBatteryConsumer)).isTrue(); + when(mAggregateBatteryConsumer.getConsumedPower( + BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)).thenReturn(0.0005); + assertThat(mBatteryUtils.shouldHideDevicePowerComponent(mAggregateBatteryConsumer, + BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)).isTrue(); } @Test public void testShouldHideSystemConsumer_HighPower_ReturnFalse() { - when(mSystemBatteryConsumer.getDrainType()) - .thenReturn(SystemBatteryConsumer.DRAIN_TYPE_FLASHLIGHT); - when(mSystemBatteryConsumer.getConsumedPower()).thenReturn(0.5); - assertThat(mBatteryUtils.shouldHideSystemBatteryConsumer(mSystemBatteryConsumer)).isFalse(); + when(mAggregateBatteryConsumer.getConsumedPower( + BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)).thenReturn(0.5); + assertThat(mBatteryUtils.shouldHideDevicePowerComponent(mAggregateBatteryConsumer, + BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)).isFalse(); } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java index c993d6ff181..8acdb8b713b 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java @@ -17,18 +17,13 @@ package com.android.settings.fuelgauge; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.when; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; import android.content.ContentValues; import android.content.Context; -import android.os.BatteryConsumer; import android.os.BatteryManager; import android.os.BatteryUsageStats; -import android.os.SystemBatteryConsumer; -import android.os.UidBatteryConsumer; -import android.os.UserBatteryConsumer; import android.os.UserHandle; import org.junit.Before; @@ -39,12 +34,10 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import java.text.SimpleDateFormat; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.TimeZone; @@ -56,14 +49,6 @@ public final class ConvertUtilsTest { private BatteryUsageStats mBatteryUsageStats; @Mock private BatteryEntry mockBatteryEntry; - @Mock - private BatteryConsumer mockBatteryConsumer; - @Mock - private UidBatteryConsumer mockUidBatteryConsumer; - @Mock - private UserBatteryConsumer mockUserBatteryConsumer; - @Mock - private SystemBatteryConsumer mockSystemBatteryConsumer; @Before public void setUp() { @@ -84,9 +69,9 @@ public final class ConvertUtilsTest { mockBatteryEntry.percent = 0.3; when(mockBatteryEntry.getTimeInForegroundMs()).thenReturn(1234L); when(mockBatteryEntry.getTimeInBackgroundMs()).thenReturn(5689L); - when(mockBatteryEntry.getBatteryConsumer()) - .thenReturn(mockSystemBatteryConsumer); - when(mockSystemBatteryConsumer.getDrainType()).thenReturn(expectedType); + when(mockBatteryEntry.getPowerComponentId()).thenReturn(expectedType); + when(mockBatteryEntry.getConsumerType()) + .thenReturn(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY); final ContentValues values = ConvertUtils.convert( @@ -155,38 +140,6 @@ public final class ConvertUtilsTest { .isEqualTo(ConvertUtils.FAKE_PACKAGE_NAME); } - @Test - public void testGetDrainType_returnsExpetcedResult() { - final int expectedType = 3; - when(mockSystemBatteryConsumer.getDrainType()) - .thenReturn(expectedType); - - assertThat(ConvertUtils.getDrainType(mockSystemBatteryConsumer)) - .isEqualTo(expectedType); - } - - @Test - public void testGetDrainType_notValidConsumer_returnsInvalidTypeValue() { - assertThat(ConvertUtils.getDrainType(mockUserBatteryConsumer)) - .isEqualTo(ConvertUtils.INVALID_DRAIN_TYPE); - } - - @Test - public void testGetConsumerType_returnsExpetcedResult() { - assertThat(ConvertUtils.getConsumerType(mockUidBatteryConsumer)) - .isEqualTo(ConvertUtils.CONSUMER_TYPE_UID_BATTERY); - assertThat(ConvertUtils.getConsumerType(mockUserBatteryConsumer)) - .isEqualTo(ConvertUtils.CONSUMER_TYPE_USER_BATTERY); - assertThat(ConvertUtils.getConsumerType(mockSystemBatteryConsumer)) - .isEqualTo(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY); - } - - @Test - public void testGetConsumeType_invalidConsumer_returnsInvalidType() { - assertThat(ConvertUtils.getConsumerType(mockBatteryConsumer)) - .isEqualTo(ConvertUtils.CONSUMER_TYPE_UNKNOWN); - } - @Test public void testGetIndexedUsageMap_returnsExpectedResult() { // Creates the fake testing data.