Merge "Add Battery Information page" into udc-qpr-dev

This commit is contained in:
Treehugger Robot
2023-05-22 01:34:11 +00:00
committed by Android (Google) Code Review
11 changed files with 455 additions and 1 deletions

View File

@@ -2644,6 +2644,8 @@
<string name="build_number">Build number</string>
<!-- About phone screen, tapping this button will take user to a seperate UI to check Google Play system update [CHAR LIMIT=60] -->
<string name="module_version">Google Play system update</string>
<!-- About phone screen, show a list of battery information [CHAR LIMIT=60] -->
<string name="battery_info">Battery information</string>
<!-- About phone screen, show when a value of some status item is unavailable. -->
<string name="device_info_not_available">Not available</string>
@@ -2715,6 +2717,14 @@
<string name="status_serial_number">Serial number</string>
<!-- About phone, status item title. How long the device has been running since its last reboot. -->
<string name="status_up_time">Up time</string>
<!-- About phone, status item title. The battery manufacture date. [CHAR LIMIT=60]-->
<string name="battery_manufacture_date">Manufacture date</string>
<!-- About phone, status item title. Date of first use of the battery. [CHAR LIMIT=60]-->
<string name="battery_first_use_date">Date of first use</string>
<!-- About phone, status item title. Count of battery full charge/discharge cycles [CHAR LIMIT=60]-->
<string name="battery_cycle_count">Cycle count</string>
<!-- SD card & phone storage settings summary. Displayed when the total memory usage is being calculated. Will be replaced with a number like "12.3 GB" when finished calucating. [CHAR LIMIT=30] -->
<string name="memory_calculating_size">Calculating\u2026</string>
@@ -7008,6 +7018,7 @@
<string name="keywords_sim_status_iccid_esim">network, mobile network state, service state, signal strength, mobile network type, roaming, iccid, eid</string>
<string name="keywords_esim_eid">eid</string>
<string name="keywords_model_and_hardware">serial number, hardware version</string>
<string name="keywords_battery_info">battery info, manufacture date, cycle count, first use</string>
<string name="keywords_android_version">android security patch level, baseband version, kernel version</string>
<!-- Search keywords for dark mode settings [CHAR LIMIT=NONE] -->
<string name="keywords_dark_ui_mode">theme, light, dark, mode, light sensitivity, photophobia, make darker, darken, dark mode, migraine</string>

45
res/xml/battery_info.xml Normal file
View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2023 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/battery_info"
settings:keywords="@string/keywords_battery_info">
<Preference
android:key="battery_info_manufacture_date"
android:title="@string/battery_manufacture_date"
android:summary="@string/summary_placeholder"
settings:controller="com.android.settings.deviceinfo.batteryinfo.BatteryManufactureDatePreferenceController"
settings:enableCopying="true"/>
<Preference
android:key="battery_info_first_use_date"
android:title="@string/battery_first_use_date"
android:summary="@string/summary_placeholder"
settings:controller="com.android.settings.deviceinfo.batteryinfo.BatteryFirstUseDatePreferenceController"
settings:enableCopying="true"/>
<Preference
android:key="battery_info_cycle_count"
android:title="@string/battery_cycle_count"
android:summary="@string/summary_placeholder"
settings:controller="com.android.settings.deviceinfo.batteryinfo.BatteryCycleCountPreferenceController"
settings:enableCopying="true"/>
</PreferenceScreen>

View File

@@ -144,6 +144,14 @@
android:summary="@string/summary_placeholder"
android:fragment="com.android.settings.deviceinfo.firmwareversion.FirmwareVersionSettings"
settings:controller="com.android.settings.deviceinfo.firmwareversion.FirmwareVersionPreferenceController"/>
<!-- Battery information -->
<Preference
android:key="battery_info"
android:order="43"
android:title="@string/battery_info"
android:fragment="com.android.settings.deviceinfo.batteryinfo.BatteryInfoFragment"
settings:keywords="@string/keywords_battery_info"/>
</PreferenceCategory>
<PreferenceCategory

View File

@@ -94,6 +94,7 @@ import com.android.settings.deviceinfo.PrivateVolumeForget;
import com.android.settings.deviceinfo.PublicVolumeSettings;
import com.android.settings.deviceinfo.StorageDashboardFragment;
import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
import com.android.settings.deviceinfo.batteryinfo.BatteryInfoFragment;
import com.android.settings.deviceinfo.firmwareversion.FirmwareVersionSettings;
import com.android.settings.deviceinfo.legal.ModuleLicensesDashboard;
import com.android.settings.display.AutoBrightnessSettings;
@@ -371,7 +372,8 @@ public class SettingsGateway {
NfcAndPaymentFragment.class.getName(),
ColorAndMotionFragment.class.getName(),
LongBackgroundTasksDetails.class.getName(),
RegionalPreferencesEntriesFragment.class.getName()
RegionalPreferencesEntriesFragment.class.getName(),
BatteryInfoFragment.class.getName()
};
public static final String[] SETTINGS_FOR_RESTRICTED = {

View File

@@ -0,0 +1,49 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.deviceinfo.batteryinfo;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import com.android.settings.core.BasePreferenceController;
/**
* A controller that manages the information about battery cycle count.
*/
public class BatteryCycleCountPreferenceController extends BasePreferenceController {
public BatteryCycleCountPreferenceController(Context context,
String preferenceKey) {
super(context, preferenceKey);
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
public CharSequence getSummary() {
final IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
final Intent batteryStatus = mContext.registerReceiver(null, intentFilter);
final int cycleCount = batteryStatus.getIntExtra(BatteryManager.EXTRA_CYCLE_COUNT, -1);
return Integer.toString(cycleCount);
}
}

View File

@@ -0,0 +1,47 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.deviceinfo.batteryinfo;
import android.content.Context;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
/**
* A controller that manages the information about battery first use date.
*/
public class BatteryFirstUseDatePreferenceController extends BasePreferenceController {
private BatteryInfoFeatureProvider mBatteryInfoFeatureProvider;
public BatteryFirstUseDatePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mBatteryInfoFeatureProvider = FeatureFactory.getFactory(
context).getBatteryInfoFeatureProvider();
}
@Override
public int getAvailabilityStatus() {
return mBatteryInfoFeatureProvider.isFirstUseDateAvailable()
? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
public CharSequence getSummary() {
return mBatteryInfoFeatureProvider.getFirstUseDateSummary();
}
}

View File

@@ -0,0 +1,51 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.deviceinfo.batteryinfo;
import android.app.settings.SettingsEnums;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
/**
* A fragment that shows battery hardware information.
*/
@SearchIndexable
public class BatteryInfoFragment extends DashboardFragment {
public static final String TAG = "BatteryInfo";
@Override
public int getMetricsCategory() {
return SettingsEnums.SETTINGS_BATTERY_INFORMATION;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.battery_info;
}
@Override
protected String getLogTag() {
return TAG;
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.battery_info);
}

View File

@@ -0,0 +1,47 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.deviceinfo.batteryinfo;
import android.content.Context;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
/**
* A controller that manages the information about battery manufacture date.
*/
public class BatteryManufactureDatePreferenceController extends BasePreferenceController {
private BatteryInfoFeatureProvider mBatteryInfoFeatureProvider;
public BatteryManufactureDatePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mBatteryInfoFeatureProvider = FeatureFactory.getFactory(
context).getBatteryInfoFeatureProvider();
}
@Override
public int getAvailabilityStatus() {
return mBatteryInfoFeatureProvider.isManufactureDateAvailable()
? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
public CharSequence getSummary() {
return mBatteryInfoFeatureProvider.getManufactureDateSummary();
}
}

View File

@@ -0,0 +1,65 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.deviceinfo.batteryinfo;
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
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.Intent;
import android.os.BatteryManager;
import androidx.test.core.app.ApplicationProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class BatteryCycleCountPreferenceControllerTest {
private BatteryCycleCountPreferenceController mController;
private Context mContext;
@Before
public void setUp() {
mContext = spy(ApplicationProvider.getApplicationContext());
mController = new BatteryCycleCountPreferenceController(mContext,
"battery_info_cycle_count");
}
@Test
public void getAvailabilityStatus_returnAvailable() {
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
public void getSummary_returnExpectedResult() {
final Intent batteryIntent = new Intent();
batteryIntent.putExtra(BatteryManager.EXTRA_CYCLE_COUNT, 10);
doReturn(batteryIntent).when(mContext).registerReceiver(any(), any());
assertThat(mController.getSummary()).isEqualTo("10");
}
}

View File

@@ -0,0 +1,64 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.deviceinfo.batteryinfo;
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class BatteryFirstUseDatePreferenceControllerTest {
private BatteryFirstUseDatePreferenceController mController;
private Context mContext;
private FakeFeatureFactory mFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
mFactory = FakeFeatureFactory.setupForTest();
mController = new BatteryFirstUseDatePreferenceController(mContext,
"battery_info_first_use_date");
}
@Test
public void getAvailabilityStatus_dateAvailable_returnAvailable() {
when(mFactory.mBatteryInfoFeatureProvider.isFirstUseDateAvailable()).thenReturn(true);
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
public void getAvailabilityStatus_dateUnavailable_returnNotAvailable() {
when(mFactory.mBatteryInfoFeatureProvider.isFirstUseDateAvailable()).thenReturn(false);
assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
}
}

View File

@@ -0,0 +1,65 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.deviceinfo.batteryinfo;
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class BatteryManufactureDatePreferenceControllerTest {
private BatteryManufactureDatePreferenceController mController;
private Context mContext;
private FakeFeatureFactory mFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
mFactory = FakeFeatureFactory.setupForTest();
mController = new BatteryManufactureDatePreferenceController(mContext,
"battery_info_manufacture_date");
}
@Test
public void getAvailabilityStatus_dateAvailable_returnAvailable() {
when(mFactory.mBatteryInfoFeatureProvider.isManufactureDateAvailable()).thenReturn(true);
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
public void getAvailabilityStatus_dateUnavailable_returnNotAvailable() {
when(mFactory.mBatteryInfoFeatureProvider.isManufactureDateAvailable()).thenReturn(false);
assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
}
}