diff --git a/src/com/android/settings/deviceinfo/batteryinfo/BatteryInfoFeatureProvider.java b/src/com/android/settings/deviceinfo/batteryinfo/BatteryInfoFeatureProvider.java new file mode 100644 index 00000000000..1c8fd12ec42 --- /dev/null +++ b/src/com/android/settings/deviceinfo/batteryinfo/BatteryInfoFeatureProvider.java @@ -0,0 +1,35 @@ +/* + * 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; + +/** + * Feature Provider used for getting battery information. + */ +public interface BatteryInfoFeatureProvider { + + /** Returns true if Manufacture date should be shown */ + boolean isManufactureDateAvailable(); + + /** Returns true if First use date should be shown */ + boolean isFirstUseDateAvailable(); + + /** Returns the summary of battery manufacture date */ + CharSequence getManufactureDateSummary(); + + /** Returns the summary of battery first use date */ + CharSequence getFirstUseDateSummary(); +} diff --git a/src/com/android/settings/deviceinfo/batteryinfo/BatteryInfoFeatureProviderImpl.java b/src/com/android/settings/deviceinfo/batteryinfo/BatteryInfoFeatureProviderImpl.java new file mode 100644 index 00000000000..36ddad7d158 --- /dev/null +++ b/src/com/android/settings/deviceinfo/batteryinfo/BatteryInfoFeatureProviderImpl.java @@ -0,0 +1,91 @@ +/* + * 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.os.BatteryManager; + +import java.text.DateFormat; +import java.util.Date; + +/** Implementation of {@code BatteryInfoFeatureProvider} */ +public class BatteryInfoFeatureProviderImpl implements BatteryInfoFeatureProvider { + + private BatteryManager mBatteryManager; + private Context mContext; + private long mManufactureDateInSec; + private long mFirstUseDateInSec; + + public BatteryInfoFeatureProviderImpl(Context context) { + mContext = context; + mBatteryManager = mContext.getSystemService(BatteryManager.class); + } + + @Override + public boolean isManufactureDateAvailable() { + return false; + } + + @Override + public boolean isFirstUseDateAvailable() { + return false; + } + + @Override + public CharSequence getManufactureDateSummary() { + if (!isManufactureDateAvailable()) { + return null; + } + final long manufactureDateInSec = getManufactureDate(); + + return getFormattedDate(manufactureDateInSec * 1000L); + } + + @Override + public CharSequence getFirstUseDateSummary() { + if (!isFirstUseDateAvailable()) { + return null; + } + final long firstUseDateInSec = getFirstUseDate(); + + return getFormattedDate(firstUseDateInSec * 1000L); + } + + protected long getManufactureDate() { + if (mManufactureDateInSec == 0L) { + mManufactureDateInSec = mBatteryManager.getLongProperty( + BatteryManager.BATTERY_PROPERTY_MANUFACTURING_DATE); + } + return mManufactureDateInSec; + } + + protected long getFirstUseDate() { + if (mFirstUseDateInSec == 0L) { + mFirstUseDateInSec = mBatteryManager.getLongProperty( + BatteryManager.BATTERY_PROPERTY_FIRST_USAGE_DATE); + } + return mFirstUseDateInSec; + } + + private CharSequence getFormattedDate(long dateInMs) { + final Date date = new Date(dateInMs); + final CharSequence formattedDate = + DateFormat.getDateInstance(DateFormat.LONG).format(date.getTime()); + + return formattedDate; + } +} diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java index 9d81baa9bca..d7c2c34ba70 100644 --- a/src/com/android/settings/overlay/FeatureFactory.java +++ b/src/com/android/settings/overlay/FeatureFactory.java @@ -33,6 +33,7 @@ import com.android.settings.biometrics2.factory.BiometricsRepositoryProvider; import com.android.settings.bluetooth.BluetoothFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; +import com.android.settings.deviceinfo.batteryinfo.BatteryInfoFeatureProvider; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.fuelgauge.BatterySettingsFeatureProvider; import com.android.settings.fuelgauge.BatteryStatusFeatureProvider; @@ -204,6 +205,11 @@ public abstract class FeatureFactory { */ public abstract KeyboardSettingsFeatureProvider getKeyboardSettingsFeatureProvider(); + /** + * Retrieves implementation for Battery information feature. + */ + public abstract BatteryInfoFeatureProvider getBatteryInfoFeatureProvider(); + public static final class FactoryNotFoundException extends RuntimeException { public FactoryNotFoundException(Throwable throwable) { super("Unable to create factory. Did you misconfigure Proguard?", throwable); diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index d4f18782c05..10135f2687f 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -47,6 +47,8 @@ import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProviderImpl; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl; +import com.android.settings.deviceinfo.batteryinfo.BatteryInfoFeatureProvider; +import com.android.settings.deviceinfo.batteryinfo.BatteryInfoFeatureProviderImpl; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.enterprise.EnterprisePrivacyFeatureProviderImpl; import com.android.settings.fuelgauge.BatterySettingsFeatureProvider; @@ -117,6 +119,7 @@ public class FeatureFactoryImpl extends FeatureFactory { private AdvancedVpnFeatureProvider mAdvancedVpnFeatureProvider; private WifiFeatureProvider mWifiFeatureProvider; private KeyboardSettingsFeatureProvider mKeyboardSettingsFeatureProvider; + private BatteryInfoFeatureProvider mBatteryInfoFeatureProvider; @Override public SupportFeatureProvider getSupportFeatureProvider(Context context) { @@ -376,4 +379,12 @@ public class FeatureFactoryImpl extends FeatureFactory { } return mKeyboardSettingsFeatureProvider; } + + @Override + public BatteryInfoFeatureProvider getBatteryInfoFeatureProvider() { + if (mBatteryInfoFeatureProvider == null) { + mBatteryInfoFeatureProvider = new BatteryInfoFeatureProviderImpl(getAppContext()); + } + return mBatteryInfoFeatureProvider; + } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/batteryinfo/BatteryInfoFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/deviceinfo/batteryinfo/BatteryInfoFeatureProviderImplTest.java new file mode 100644 index 00000000000..6c149774e9d --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/batteryinfo/BatteryInfoFeatureProviderImplTest.java @@ -0,0 +1,97 @@ +/* + * 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.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.os.BatteryManager; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; + + +@RunWith(RobolectricTestRunner.class) +public class BatteryInfoFeatureProviderImplTest { + @Mock + private BatteryManager mBatteryManager; + + private Context mContext; + private BatteryInfoFeatureProviderImpl mImpl; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = spy(org.robolectric.RuntimeEnvironment.application); + doReturn(mBatteryManager).when(mContext).getSystemService(BatteryManager.class); + mImpl = spy(new BatteryInfoFeatureProviderImpl(mContext)); + } + + @Test + public void isManufactureDateAvailable_returnFalse() { + assertThat(mImpl.isManufactureDateAvailable()).isFalse(); + } + + @Test + public void isFirstUseDateAvailable_returnFalse() { + assertThat(mImpl.isFirstUseDateAvailable()).isFalse(); + } + + @Test + public void getManufactureDateSummary_available_returnExpectedDate() { + doReturn(true).when(mImpl).isManufactureDateAvailable(); + when(mBatteryManager.getLongProperty(BatteryManager.BATTERY_PROPERTY_MANUFACTURING_DATE)) + .thenReturn(1669680000L); + + final CharSequence result = mImpl.getManufactureDateSummary(); + + assertThat(result).isEqualTo("November 29, 2022"); + } + + @Test + public void getManufactureDateSummary_unavailable_returnNull() { + doReturn(false).when(mImpl).isManufactureDateAvailable(); + + assertThat(mImpl.getManufactureDateSummary()).isNull(); + } + + @Test + public void getFirstUseDateSummary_available_returnExpectedDate() { + doReturn(true).when(mImpl).isFirstUseDateAvailable(); + when(mBatteryManager.getLongProperty(BatteryManager.BATTERY_PROPERTY_FIRST_USAGE_DATE)) + .thenReturn(1669680000L); + + final CharSequence result = mImpl.getFirstUseDateSummary(); + + assertThat(result).isEqualTo("November 29, 2022"); + } + + @Test + public void getFirstUseDateSummary_unavailable_returnNull() { + doReturn(false).when(mImpl).isFirstUseDateAvailable(); + + assertThat(mImpl.getFirstUseDateSummary()).isNull(); + } +} diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java index 47053802e39..e77229f35fa 100644 --- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java +++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java @@ -31,6 +31,7 @@ import com.android.settings.biometrics2.factory.BiometricsRepositoryProvider; import com.android.settings.bluetooth.BluetoothFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; +import com.android.settings.deviceinfo.batteryinfo.BatteryInfoFeatureProvider; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.fuelgauge.BatterySettingsFeatureProvider; import com.android.settings.fuelgauge.BatteryStatusFeatureProvider; @@ -82,6 +83,7 @@ public class FakeFeatureFactory extends FeatureFactory { public final AwareFeatureProvider mAwareFeatureProvider; public final FaceFeatureProvider mFaceFeatureProvider; public final BiometricsRepositoryProvider mBiometricsRepositoryProvider; + public final BatteryInfoFeatureProvider mBatteryInfoFeatureProvider; public PanelFeatureProvider panelFeatureProvider; public SlicesFeatureProvider slicesFeatureProvider; @@ -148,6 +150,7 @@ public class FakeFeatureFactory extends FeatureFactory { mAdvancedVpnFeatureProvider = mock(AdvancedVpnFeatureProvider.class); mWifiFeatureProvider = mock(WifiFeatureProvider.class); mKeyboardSettingsFeatureProvider = mock(KeyboardSettingsFeatureProvider.class); + mBatteryInfoFeatureProvider = mock(BatteryInfoFeatureProvider.class); } @Override @@ -304,4 +307,9 @@ public class FakeFeatureFactory extends FeatureFactory { public KeyboardSettingsFeatureProvider getKeyboardSettingsFeatureProvider() { return mKeyboardSettingsFeatureProvider; } + + @Override + public BatteryInfoFeatureProvider getBatteryInfoFeatureProvider() { + return mBatteryInfoFeatureProvider; + } } diff --git a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt index 50589ac67e0..801b52e0f2e 100644 --- a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt +++ b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt @@ -27,6 +27,7 @@ import com.android.settings.biometrics2.factory.BiometricsRepositoryProvider import com.android.settings.bluetooth.BluetoothFeatureProvider import com.android.settings.dashboard.DashboardFeatureProvider import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider +import com.android.settings.deviceinfo.batteryinfo.BatteryInfoFeatureProvider import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider import com.android.settings.fuelgauge.BatterySettingsFeatureProvider import com.android.settings.fuelgauge.BatteryStatusFeatureProvider @@ -187,4 +188,8 @@ class FakeFeatureFactory : FeatureFactory() { override fun getKeyboardSettingsFeatureProvider(): KeyboardSettingsFeatureProvider { TODO("Not yet implemented") } + + override fun getBatteryInfoFeatureProvider(): BatteryInfoFeatureProvider { + TODO("Not yet implemented") + } } diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java index d7490100990..ae5f5f5272c 100644 --- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java +++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java @@ -29,6 +29,7 @@ import com.android.settings.biometrics2.factory.BiometricsRepositoryProvider; import com.android.settings.bluetooth.BluetoothFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; +import com.android.settings.deviceinfo.batteryinfo.BatteryInfoFeatureProvider; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.fuelgauge.BatterySettingsFeatureProvider; import com.android.settings.fuelgauge.BatteryStatusFeatureProvider; @@ -77,6 +78,7 @@ public class FakeFeatureFactory extends FeatureFactory { public final AwareFeatureProvider mAwareFeatureProvider; public final FaceFeatureProvider mFaceFeatureProvider; public final BiometricsRepositoryProvider mBiometricsRepositoryProvider; + public final BatteryInfoFeatureProvider mBatteryInfoFeatureProvider; public PanelFeatureProvider panelFeatureProvider; public SlicesFeatureProvider slicesFeatureProvider; @@ -134,6 +136,7 @@ public class FakeFeatureFactory extends FeatureFactory { mAdvancedVpnFeatureProvider = mock(AdvancedVpnFeatureProvider.class); mWifiFeatureProvider = mock(WifiFeatureProvider.class); mKeyboardSettingsFeatureProvider = mock(KeyboardSettingsFeatureProvider.class); + mBatteryInfoFeatureProvider = mock(BatteryInfoFeatureProvider.class); } @Override @@ -290,4 +293,9 @@ public class FakeFeatureFactory extends FeatureFactory { public KeyboardSettingsFeatureProvider getKeyboardSettingsFeatureProvider() { return mKeyboardSettingsFeatureProvider; } + + @Override + public BatteryInfoFeatureProvider getBatteryInfoFeatureProvider() { + return mBatteryInfoFeatureProvider; + } }