diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e280b8394f9..1b69a58b0fd 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -131,7 +131,8 @@ android:usesCleartextTraffic="true" android:defaultToDeviceProtectedStorage="true" android:directBootAware="true" - android:appComponentFactory="androidx.core.app.CoreComponentFactory"> + android:appComponentFactory="androidx.core.app.CoreComponentFactory" + android:enableOnBackInvokedCallback="true"> diff --git a/res/drawable/ic_cellular_1_bar.xml b/res/drawable/ic_cellular_1_bar.xml index 23caacc2244..a07e25752fe 100644 --- a/res/drawable/ic_cellular_1_bar.xml +++ b/res/drawable/ic_cellular_1_bar.xml @@ -1,5 +1,5 @@ + + + diff --git a/res/drawable/ic_settings_camera.xml b/res/drawable/ic_settings_camera.xml index 3c855323183..278d29508ce 100644 --- a/res/drawable/ic_settings_camera.xml +++ b/res/drawable/ic_settings_camera.xml @@ -1,5 +1,5 @@ + + + + diff --git a/res/layout/battery_chart_graph.xml b/res/layout/battery_chart_graph.xml index b95c6604be2..f116c8ee313 100644 --- a/res/layout/battery_chart_graph.xml +++ b/res/layout/battery_chart_graph.xml @@ -31,25 +31,33 @@ android:textColor="?android:attr/textColorSecondary" android:text="@string/battery_usage_chart_graph_hint_last_full_charge" /> - + android:layout_height="wrap_content" + android:orientation="vertical" + android:alpha="0"> + + + + - @*android:color/ripple_material_light + + + @android:color/white diff --git a/res/values/colors.xml b/res/values/colors.xml index e818a285fe6..7ca1ab2451c 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -209,4 +209,7 @@ ?androidprv:attr/colorSurface + + + ?android:attr/textColorPrimary diff --git a/res/values/strings.xml b/res/values/strings.xml index 083064f75fc..921cb5227fe 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6790,6 +6790,10 @@ Battery usage data will be available after you use your phone for a few hours Battery usage chart + + Daily battery usage chart + + Hourly battery usage chart diff --git a/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java b/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java index dd06b679910..62a66cf1d5a 100644 --- a/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java +++ b/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java @@ -74,12 +74,12 @@ public class BluetoothBroadcastDialog extends InstrumentedDialogFragment { TextView title = layout.findViewById(com.android.settingslib.R.id.dialog_title); TextView subTitle = layout.findViewById(com.android.settingslib.R.id.dialog_subtitle); - title.setText(mContext.getString(R.string.bluetooth_broadcast_dialog_title)); - subTitle.setText( - mContext.getString(R.string.bluetooth_broadcast_dialog_broadcast_message)); Button broadcastBtn = layout.findViewById(com.android.settingslib.R.id.positive_btn); if (isBroadcastSupported() && mIsMediaStreaming) { + title.setText(mContext.getString(R.string.bluetooth_broadcast_dialog_title)); + subTitle.setText( + mContext.getString(R.string.bluetooth_broadcast_dialog_broadcast_message)); broadcastBtn.setVisibility(View.VISIBLE); if (TextUtils.isEmpty(mCurrentAppLabel)) { broadcastBtn.setText(mContext.getString(R.string.bluetooth_broadcast_dialog_title)); @@ -92,6 +92,9 @@ public class BluetoothBroadcastDialog extends InstrumentedDialogFragment { launchMediaOutputBroadcastDialog(); }); } else { + title.setText(mContext.getString(R.string.bluetooth_find_broadcast)); + subTitle.setText( + mContext.getString(R.string.bluetooth_broadcast_dialog_find_message)); broadcastBtn.setVisibility(View.GONE); } diff --git a/src/com/android/settings/datausage/BillingCyclePreference.java b/src/com/android/settings/datausage/BillingCyclePreference.java index 116ed89b3c7..1bd2be8f078 100644 --- a/src/com/android/settings/datausage/BillingCyclePreference.java +++ b/src/com/android/settings/datausage/BillingCyclePreference.java @@ -20,6 +20,7 @@ import android.content.Intent; import android.net.NetworkTemplate; import android.os.Bundle; import android.os.RemoteException; +import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.util.AttributeSet; @@ -78,7 +79,7 @@ public class BillingCyclePreference extends Preference try { setEnabled(mServices.mNetworkService.isBandwidthControlEnabled() && mServices.mTelephonyManager.createForSubscriptionId(mSubId) - .isDataEnabledForApn(ApnSetting.TYPE_DEFAULT) + .isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER) && mServices.mUserManager.isAdminUser()); } catch (RemoteException e) { setEnabled(false); diff --git a/src/com/android/settings/dream/DreamComplicationPreferenceController.java b/src/com/android/settings/dream/DreamComplicationPreferenceController.java index d9c4fb3512a..596fe20f2de 100644 --- a/src/com/android/settings/dream/DreamComplicationPreferenceController.java +++ b/src/com/android/settings/dream/DreamComplicationPreferenceController.java @@ -42,14 +42,12 @@ public class DreamComplicationPreferenceController extends TogglePreferenceContr @Override public boolean isChecked() { - return mBackend.getEnabledComplications().containsAll(mBackend.getSupportedComplications()); + return mBackend.getComplicationsEnabled(); } @Override public boolean setChecked(boolean isChecked) { - for (int complication : mBackend.getSupportedComplications()) { - mBackend.setComplicationEnabled(complication, isChecked); - } + mBackend.setComplicationsEnabled(isChecked); return true; } diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java index ea493a38f6b..95145ba8216 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java @@ -31,7 +31,6 @@ import com.android.settings.fuelgauge.batterytip.detectors.SmartBatteryDetector; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip; import com.android.settings.fuelgauge.batterytip.tips.SummaryTip; -import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.fuelgauge.EstimateKt; import com.android.settingslib.utils.AsyncLoaderCompat; @@ -67,16 +66,14 @@ public class BatteryTipLoader extends AsyncLoaderCompat> { final BatteryTipPolicy policy = new BatteryTipPolicy(getContext()); final BatteryInfo batteryInfo = mBatteryUtils.getBatteryInfo(TAG); final Context context = getContext(); - final boolean extraDefend = FeatureFactory.getFactory(context) - .getPowerUsageFeatureProvider(context) - .isExtraDefend(); tips.add(new LowBatteryDetector(context, policy, batteryInfo).detect()); tips.add(new HighUsageDetector(context, policy, mBatteryUsageStats, batteryInfo).detect()); tips.add(new SmartBatteryDetector( context, policy, batteryInfo, context.getContentResolver()).detect()); tips.add(new EarlyWarningDetector(policy, context).detect()); - tips.add(new BatteryDefenderDetector(batteryInfo, extraDefend).detect()); + tips.add(new BatteryDefenderDetector( + batteryInfo, context.getApplicationContext()).detect()); Collections.sort(tips); return tips; } diff --git a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java index 367b2b1f5a3..87d4a0b44a5 100644 --- a/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java +++ b/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetector.java @@ -16,28 +16,33 @@ package com.android.settings.fuelgauge.batterytip.detectors; +import android.content.Context; + import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.batterytip.tips.BatteryDefenderTip; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; +import com.android.settings.overlay.FeatureFactory; /** * Detect whether the battery is overheated */ public class BatteryDefenderDetector implements BatteryTipDetector { private final BatteryInfo mBatteryInfo; - private final boolean mExtraDefend; + private final Context mContext; - public BatteryDefenderDetector(BatteryInfo batteryInfo, boolean extraDefend) { + public BatteryDefenderDetector(BatteryInfo batteryInfo, Context context) { mBatteryInfo = batteryInfo; - mExtraDefend = extraDefend; + mContext = context; } @Override public BatteryTip detect() { - final int state = - mBatteryInfo.isOverheated - ? BatteryTip.StateType.NEW - : BatteryTip.StateType.INVISIBLE; - return new BatteryDefenderTip(state, mExtraDefend); + if (mBatteryInfo.isOverheated) { + final boolean extraDefend = FeatureFactory.getFactory(mContext) + .getPowerUsageFeatureProvider(mContext) + .isExtraDefend(); + return new BatteryDefenderTip(BatteryTip.StateType.NEW, extraDefend); + } + return new BatteryDefenderTip(BatteryTip.StateType.INVISIBLE); } } diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java index 0a133bbe42e..5c0fc58f0fa 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java @@ -108,7 +108,7 @@ public class BatteryDefenderTip extends BatteryTip { }); cardPreference.setPrimaryButtonVisible(isPluggedIn(context)); - cardPreference.setSecondaryButtonText(context.getString(R.string.see_more)); + cardPreference.setSecondaryButtonText(context.getString(R.string.learn_more)); cardPreference.setSecondaryButtonClickListener(unused -> cardPreference.performClick()); cardPreference.setSecondaryButtonVisible(true); } diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java index 88bec0d9d05..45ae8c595bf 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java @@ -65,7 +65,10 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll private static final String TAG = "BatteryChartPreferenceController"; private static final String KEY_FOOTER_PREF = "battery_graph_footer"; private static final String PACKAGE_NAME_NONE = "none"; + private static final int ENABLED_ICON_ALPHA = 255; + private static final int DISABLED_ICON_ALPHA = 255 / 3; + private static final long FADE_ANIMATION_DURATION = 350L; private static final long VALID_USAGE_TIME_DURATION = DateUtils.HOUR_IN_MILLIS * 2; private static final long VALID_DIFF_DURATION = DateUtils.MINUTE_IN_MILLIS * 3; @@ -102,6 +105,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll private boolean mIs24HourFormat; private boolean mIsFooterPrefAdded = false; + private View mBatteryChartViewGroup; private PreferenceScreen mPreferenceScreen; private FooterPreference mFooterPreference; // Daily view model only saves abbreviated day of week texts (e.g. MON). This field saves the @@ -202,7 +206,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mPrefContext = screen.getContext(); mAppListPrefGroup = screen.findPreference(mPreferenceKey); mAppListPrefGroup.setOrderingAsAdded(false); - mAppListPrefGroup.setTitle(mPrefContext.getString(R.string.battery_app_usage)); + mAppListPrefGroup.setTitle(""); mFooterPreference = screen.findPreference(KEY_FOOTER_PREF); // Removes footer first until usage data is loaded to avoid flashing. if (mFooterPreference != null) { @@ -260,6 +264,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll final Map> batteryHistoryMap) { Log.d(TAG, "setBatteryHistoryMap() " + (batteryHistoryMap == null ? "null" : ("size=" + batteryHistoryMap.size()))); + // Ensure the battery chart group is visible for users. + animateBatteryChartViewGroup(); final BatteryLevelData batteryLevelData = DataProcessor.getBatteryLevelData(mContext, mHandler, batteryHistoryMap, batteryUsageMap -> { @@ -267,6 +273,11 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll refreshUi(); }); Log.d(TAG, "getBatteryLevelData: " + batteryLevelData); + mMetricsFeatureProvider.action( + mPrefContext, + SettingsEnums.ACTION_BATTERY_HISTORY_LOADED, + getTotalHours(batteryLevelData)); + if (batteryLevelData == null) { mDailyTimestampFullTexts = null; mDailyViewModel = null; @@ -297,8 +308,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll void setBatteryChartView(@NonNull final BatteryChartView dailyChartView, @NonNull final BatteryChartView hourlyChartView) { + final View parentView = (View) dailyChartView.getParent(); + if (parentView != null && parentView.getId() == R.id.battery_chart_group) { + mBatteryChartViewGroup = (View) dailyChartView.getParent(); + } if (mDailyChartView != dailyChartView || mHourlyChartView != hourlyChartView) { mHandler.post(() -> setBatteryChartViewInner(dailyChartView, hourlyChartView)); + animateBatteryChartViewGroup(); } } @@ -313,7 +329,12 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mDailyChartIndex = trapezoidIndex; mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL; refreshUi(); - // TODO: Change to log daily data. + mMetricsFeatureProvider.action( + mPrefContext, + trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL + ? SettingsEnums.ACTION_BATTERY_USAGE_DAILY_SHOW_ALL + : SettingsEnums.ACTION_BATTERY_USAGE_DAILY_TIME_SLOT, + mDailyChartIndex); }); mHourlyChartView = hourlyChartView; mHourlyChartView.setOnSelectListener(trapezoidIndex -> { @@ -327,7 +348,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mPrefContext, trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL ? SettingsEnums.ACTION_BATTERY_USAGE_SHOW_ALL - : SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT); + : SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT, + mHourlyChartIndex); }); refreshUi(); } @@ -452,6 +474,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll if (!isAdded) { mAppListPrefGroup.addPreference(pref); } + appIcon.setAlpha(pref.isEnabled() ? ENABLED_ICON_ALPHA : DISABLED_ICON_ALPHA); prefIndex++; } } @@ -601,6 +624,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll return !DataProcessor.contains(packageName, mNotAllowShowSummaryPackages); } + private void animateBatteryChartViewGroup() { + if (mBatteryChartViewGroup != null && mBatteryChartViewGroup.getAlpha() == 0) { + mBatteryChartViewGroup.animate().alpha(1f).setDuration(FADE_ANIMATION_DURATION) + .start(); + } + } + private void addFooterPreferenceIfNeeded(boolean containAppItems) { if (mIsFooterPrefAdded || mFooterPreference == null) { return; @@ -623,6 +653,16 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll && mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL; } + @VisibleForTesting + static int getTotalHours(final BatteryLevelData batteryLevelData) { + if (batteryLevelData == null) { + return 0; + } + List dailyTimestamps = batteryLevelData.getDailyBatteryLevels().getTimestamps(); + return (int) ((dailyTimestamps.get(dailyTimestamps.size() - 1) - dailyTimestamps.get(0)) + / DateUtils.HOUR_IN_MILLIS); + } + private static List generateTimestampDayOfWeekTexts(@NonNull final Context context, @NonNull final List timestamps, final boolean isAbbreviation) { final ArrayList texts = new ArrayList<>(); diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java index 24d6dad8f88..ccb2fb786eb 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java @@ -574,7 +574,7 @@ public class BatteryEntry { break; case BatteryConsumer.POWER_COMPONENT_BLUETOOTH: name = context.getResources().getString(R.string.power_bluetooth); - iconId = com.android.internal.R.drawable.ic_settings_bluetooth; + iconId = R.drawable.ic_settings_bluetooth; break; case BatteryConsumer.POWER_COMPONENT_CAMERA: name = context.getResources().getString(R.string.power_camera); @@ -598,7 +598,7 @@ public class BatteryEntry { break; case BatteryConsumer.POWER_COMPONENT_WIFI: name = context.getResources().getString(R.string.power_wifi); - iconId = R.drawable.ic_settings_wireless; + iconId = R.drawable.ic_settings_wireless_no_theme; break; case BatteryConsumer.POWER_COMPONENT_IDLE: case BatteryConsumer.POWER_COMPONENT_MEMORY: diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java index 71fd26ce95c..674822359be 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java @@ -106,12 +106,11 @@ public class BatteryHistoryPreference extends Preference { return; } if (mIsChartGraphEnabled) { + final TextView companionTextView = (TextView) view.findViewById(R.id.companion_text); mDailyChartView = (BatteryChartView) view.findViewById(R.id.daily_battery_chart); - mDailyChartView.setCompanionTextView( - (TextView) view.findViewById(R.id.companion_text)); + mDailyChartView.setCompanionTextView(companionTextView); mHourlyChartView = (BatteryChartView) view.findViewById(R.id.hourly_battery_chart); - mHourlyChartView.setCompanionTextView( - (TextView) view.findViewById(R.id.companion_text)); + mHourlyChartView.setCompanionTextView(companionTextView); if (mChartPreferenceController != null) { mChartPreferenceController.setBatteryChartView(mDailyChartView, mHourlyChartView); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java index 3309f597d71..90e7ad762a8 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/BatteryDefenderDetectorTest.java @@ -18,6 +18,8 @@ package com.android.settings.fuelgauge.batterytip.detectors; import static com.google.common.truth.Truth.assertThat; +import androidx.test.core.app.ApplicationProvider; + import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; @@ -42,7 +44,7 @@ public class BatteryDefenderDetectorTest { mBatteryInfo.discharging = false; mBatteryDefenderDetector = new BatteryDefenderDetector( - mBatteryInfo, /* extraDefend= */ false); + mBatteryInfo, ApplicationProvider.getApplicationContext()); } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java index c1ec7c6cb5a..6bd6b26b78c 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java @@ -125,7 +125,7 @@ public class BatteryDefenderTipTest { @Test public void updatePreference_shouldSetSecondaryButtonText() { - String expected = mContext.getString(R.string.see_more); + String expected = mContext.getString(R.string.learn_more); mBatteryDefenderTip.updatePreference(mCardPreference); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java index 016287e2f87..1eead821372 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java @@ -630,6 +630,18 @@ public final class BatteryChartPreferenceControllerTest { .isFalse(); } + @Test + public void getTotalHours_getExpectedResult() { + Map> batteryHistoryMap = createBatteryHistoryMap(60); + BatteryLevelData batteryLevelData = DataProcessor.getBatteryLevelData(mContext, null, + batteryHistoryMap, null); + + final int totalHour = BatteryChartPreferenceController.getTotalHours(batteryLevelData); + + // Only calculate the even hours. + assertThat(totalHour).isEqualTo(58); + } + private static Long generateTimestamp(int index) { // "2021-04-23 07:00:00 UTC" + index hours return 1619247600000L + index * DateUtils.HOUR_IN_MILLIS; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java index 5ca3aca189f..ffc6d9a02e6 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java @@ -307,7 +307,7 @@ public class BatteryEntryTest { R.drawable.ic_settings_aod); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, R.string.power_bluetooth, - com.android.internal.R.drawable.ic_settings_bluetooth); + R.drawable.ic_settings_bluetooth); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_CAMERA, R.string.power_camera, R.drawable.ic_settings_camera); @@ -325,7 +325,7 @@ public class BatteryEntryTest { R.drawable.ic_settings_display); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_WIFI, R.string.power_wifi, - R.drawable.ic_settings_wireless); + R.drawable.ic_settings_wireless_no_theme); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_IDLE, R.string.power_idle, R.drawable.ic_settings_phone_idle); diff --git a/tests/unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.java b/tests/unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.java new file mode 100644 index 00000000000..f74768fdda6 --- /dev/null +++ b/tests/unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2022 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.datausage; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.os.INetworkManagementService; +import android.os.RemoteException; +import android.os.UserManager; +import android.telephony.TelephonyManager; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@RunWith(AndroidJUnit4.class) +public class BillingCyclePreferenceTest { + + private Context mContext; + private BillingCyclePreference mPreference; + private TemplatePreference.NetworkServices mServices; + @Mock + private INetworkManagementService mNetManageSerice; + @Mock + private TelephonyManager mTelephonyManager; + @Mock + private UserManager mUserManager; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = spy(ApplicationProvider.getApplicationContext()); + + mServices = new TemplatePreference.NetworkServices(); + mServices.mNetworkService = mNetManageSerice; + mServices.mTelephonyManager = mTelephonyManager; + mServices.mUserManager = mUserManager; + + doReturn(mTelephonyManager).when(mTelephonyManager) + .createForSubscriptionId(anyInt()); + + mPreference = spy(new BillingCyclePreference(mContext, null /* attrs */)); + mPreference.setTemplate(null, 0, mServices); + } + + @Test + public void testPreferenceUpdate_onMobileDataEnabledChange_accessDataEnabledApi() { + try { + doReturn(true).when(mNetManageSerice).isBandwidthControlEnabled(); + } catch (RemoteException exception) {} + doReturn(true).when(mUserManager).isAdminUser(); + mPreference.onMobileDataEnabledChange(); + + verify(mTelephonyManager) + .isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER); + } +} \ No newline at end of file