From 6ce608787b18f78cf379a3f844dae5529463d6af Mon Sep 17 00:00:00 2001 From: Zoey Chen Date: Thu, 1 Jul 2021 00:16:22 +0800 Subject: [PATCH 1/3] [Provider Model] Redirect Settings Internet panel request to SystemUI. From QPR, the panel should be launched from SystemUI, so redirect the panel to SystemUI Test: make Bug: 187779230 Change-Id: I5b4131c4d986399944c038f8bce0723fcb5ba3b3 (cherry picked from commit ab8a922f778ae96fe1bc4d9fd4f3878507f68b57) Merged-In: I5b4131c4d986399944c038f8bce0723fcb5ba3b3 --- .../panel/InternetConnectivityPanel.java | 425 ------------------ .../panel/PanelFeatureProviderImpl.java | 10 +- .../panel/InternetConnectivityPanelTest.java | 341 -------------- .../panel/PanelFeatureProviderImplTest.java | 18 +- 4 files changed, 22 insertions(+), 772 deletions(-) delete mode 100644 src/com/android/settings/panel/InternetConnectivityPanel.java delete mode 100644 tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java diff --git a/src/com/android/settings/panel/InternetConnectivityPanel.java b/src/com/android/settings/panel/InternetConnectivityPanel.java deleted file mode 100644 index ae6f2e0f59e..00000000000 --- a/src/com/android/settings/panel/InternetConnectivityPanel.java +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (C) 2018 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.panel; - -import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE; -import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; - -import android.app.settings.SettingsEnums; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.net.Uri; -import android.net.wifi.ScanResult; -import android.net.wifi.WifiManager; -import android.os.Handler; -import android.os.HandlerExecutor; -import android.os.Looper; -import android.provider.Settings; -import android.telephony.ServiceState; -import android.telephony.SubscriptionManager; -import android.telephony.TelephonyCallback; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import android.util.Log; - -import androidx.annotation.VisibleForTesting; -import androidx.lifecycle.LifecycleObserver; -import androidx.lifecycle.OnLifecycleEvent; - -import com.android.settings.R; -import com.android.settings.Utils; -import com.android.settings.network.AirplaneModePreferenceController; -import com.android.settings.network.InternetUpdater; -import com.android.settings.network.ProviderModelSliceHelper; -import com.android.settings.network.SubscriptionsChangeListener; -import com.android.settings.network.telephony.DataConnectivityListener; -import com.android.settings.slices.CustomSliceRegistry; - -import java.util.ArrayList; -import java.util.List; - -/** - * Represents the Internet Connectivity Panel. - */ -public class InternetConnectivityPanel implements PanelContent, LifecycleObserver, - InternetUpdater.InternetChangeListener, DataConnectivityListener.Client, - SubscriptionsChangeListener.SubscriptionsChangeListenerClient { - private static final String TAG = "InternetConnectivityPanel"; - private static final int SUBTITLE_TEXT_NONE = -1; - private static final int SUBTITLE_TEXT_WIFI_IS_OFF = R.string.wifi_is_off; - private static final int SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT = - R.string.tap_a_network_to_connect; - private static final int SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS = - R.string.wifi_empty_list_wifi_on; - private static final int SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE = - R.string.non_carrier_network_unavailable; - private static final int SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE = - R.string.all_network_unavailable; - - private final Context mContext; - private final WifiManager mWifiManager; - private final IntentFilter mWifiStateFilter; - private final NetworkProviderTelephonyCallback mTelephonyCallback; - private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent == null) { - return; - } - - if (TextUtils.equals(intent.getAction(), WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { - updateProgressBar(); - updatePanelTitle(); - return; - } - - if (TextUtils.equals(intent.getAction(), WifiManager.NETWORK_STATE_CHANGED_ACTION)) { - updateProgressBar(); - updatePanelTitle(); - } - } - }; - - @VisibleForTesting - boolean mIsProviderModelEnabled; - @VisibleForTesting - InternetUpdater mInternetUpdater; - @VisibleForTesting - ProviderModelSliceHelper mProviderModelSliceHelper; - - private int mSubtitle = SUBTITLE_TEXT_NONE; - private PanelContentCallback mCallback; - private TelephonyManager mTelephonyManager; - private SubscriptionsChangeListener mSubscriptionsListener; - private DataConnectivityListener mConnectivityListener; - private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID; - - // Wi-Fi scanning progress bar - protected HandlerInjector mHandlerInjector; - protected boolean mIsProgressBarVisible; - protected boolean mIsScanningSubTitleShownOnce; - protected Runnable mHideProgressBarRunnable = () -> { - setProgressBarVisible(false); - }; - protected Runnable mHideScanningSubTitleRunnable = () -> { - mIsScanningSubTitleShownOnce = true; - updatePanelTitle(); - }; - - /** - * Wrapper for testing compatibility. - */ - @VisibleForTesting - static class HandlerInjector { - protected final Handler mHandler; - - HandlerInjector(Context context) { - mHandler = context.getMainThreadHandler(); - } - - public void postDelay(Runnable runnable) { - mHandler.postDelayed(runnable, 2000 /* delay millis */); - } - - public void removeCallbacks(Runnable runnable) { - mHandler.removeCallbacks(runnable); - } - } - - private InternetConnectivityPanel(Context context) { - mContext = context.getApplicationContext(); - mHandlerInjector = new HandlerInjector(context); - mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext); - mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this); - - mSubscriptionsListener = new SubscriptionsChangeListener(context, this); - mConnectivityListener = new DataConnectivityListener(context, this); - mTelephonyCallback = new NetworkProviderTelephonyCallback(); - mDefaultDataSubid = getDefaultDataSubscriptionId(); - mTelephonyManager = mContext.getSystemService(TelephonyManager.class); - - mWifiManager = mContext.getSystemService(WifiManager.class); - mWifiStateFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION); - mWifiStateFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); - - mProviderModelSliceHelper = new ProviderModelSliceHelper(mContext, null); - } - - /** create the panel */ - public static InternetConnectivityPanel create(Context context) { - return new InternetConnectivityPanel(context); - } - - /** @OnLifecycleEvent(ON_RESUME) */ - @OnLifecycleEvent(ON_RESUME) - public void onResume() { - if (!mIsProviderModelEnabled) { - return; - } - mInternetUpdater.onResume(); - mSubscriptionsListener.start(); - mConnectivityListener.start(); - mTelephonyManager.registerTelephonyCallback( - new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback); - mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter); - updateProgressBar(); - updatePanelTitle(); - } - - /** @OnLifecycleEvent(ON_PAUSE) */ - @OnLifecycleEvent(ON_PAUSE) - public void onPause() { - if (!mIsProviderModelEnabled) { - return; - } - mInternetUpdater.onPause(); - mSubscriptionsListener.stop(); - mConnectivityListener.stop(); - mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); - mContext.unregisterReceiver(mWifiStateReceiver); - mHandlerInjector.removeCallbacks(mHideProgressBarRunnable); - mHandlerInjector.removeCallbacks(mHideScanningSubTitleRunnable); - } - - /** - * @return a string for the title of the Panel. - */ - @Override - public CharSequence getTitle() { - if (mIsProviderModelEnabled) { - return mContext.getText(mInternetUpdater.isAirplaneModeOn() - ? R.string.airplane_mode : R.string.provider_internet_settings); - } - return mContext.getText(R.string.internet_connectivity_panel_title); - } - - /** - * @return a string for the subtitle of the Panel. - */ - @Override - public CharSequence getSubTitle() { - if (mIsProviderModelEnabled && mSubtitle != SUBTITLE_TEXT_NONE) { - return mContext.getText(mSubtitle); - } - return null; - } - - @Override - public List getSlices() { - final List uris = new ArrayList<>(); - if (mIsProviderModelEnabled) { - uris.add(CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI); - } else { - uris.add(CustomSliceRegistry.WIFI_SLICE_URI); - uris.add(CustomSliceRegistry.MOBILE_DATA_SLICE_URI); - uris.add(AirplaneModePreferenceController.SLICE_URI); - } - return uris; - } - - @Override - public Intent getSeeMoreIntent() { - // Disable the see more button for provider model design. - if (mIsProviderModelEnabled) { - return null; - } - - // Don't remove the see more intent for non-provider model design. This intent will be - // used when isCustomizedButtonUsed() returns false. - return new Intent(Settings.ACTION_WIRELESS_SETTINGS) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - } - - @Override - public boolean isProgressBarVisible() { - return mIsProgressBarVisible; - } - - @Override - public int getMetricsCategory() { - return SettingsEnums.PANEL_INTERNET_CONNECTIVITY; - } - - @Override - public void registerCallback(PanelContentCallback callback) { - mCallback = callback; - } - - /** - * Called when airplane mode state is changed. - */ - @Override - public void onAirplaneModeChanged(boolean isAirplaneModeOn) { - log("onAirplaneModeChanged: isAirplaneModeOn:" + isAirplaneModeOn); - updatePanelTitle(); - } - - /** - * Called when Wi-Fi enabled is changed. - */ - @Override - public void onWifiEnabledChanged(boolean enabled) { - log("onWifiEnabledChanged: enabled:" + enabled); - updatePanelTitle(); - } - - @Override - public void onSubscriptionsChanged() { - final int defaultDataSubId = getDefaultDataSubscriptionId(); - log("onSubscriptionsChanged: defaultDataSubId:" + defaultDataSubId); - if (mDefaultDataSubid == defaultDataSubId) { - return; - } - if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) { - mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); - mTelephonyManager.registerTelephonyCallback( - new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback); - } - updatePanelTitle(); - } - - @Override - public void onDataConnectivityChange() { - log("onDataConnectivityChange"); - updatePanelTitle(); - } - - @VisibleForTesting - void updatePanelTitle() { - if (mCallback == null) { - return; - } - updateSubtitleText(); - mCallback.onHeaderChanged(); - } - - @VisibleForTesting - int getDefaultDataSubscriptionId() { - return SubscriptionManager.getDefaultDataSubscriptionId(); - } - - private void updateSubtitleText() { - mSubtitle = SUBTITLE_TEXT_NONE; - if (!mInternetUpdater.isWifiEnabled()) { - if (!mInternetUpdater.isAirplaneModeOn()) { - // When the airplane mode is off and Wi-Fi is disabled. - // Sub-Title: Wi-Fi is off - log("Airplane mode off + Wi-Fi off."); - mSubtitle = SUBTITLE_TEXT_WIFI_IS_OFF; - } - return; - } - - if (mInternetUpdater.isAirplaneModeOn()) { - return; - } - - final List wifiList = mWifiManager.getScanResults(); - if (wifiList != null && wifiList.size() != 0) { - // When the Wi-Fi scan result is not empty - // Sub-Title: Tap a network to connect - mSubtitle = SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT; - return; - } - - if (!mIsScanningSubTitleShownOnce && mIsProgressBarVisible) { - // When the Wi-Fi scan result callback is received - // Sub-Title: Searching for networks... - mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS; - return; - } - - // Sub-Title: - // show non_carrier_network_unavailable - // - while Wi-Fi on + no Wi-Fi item - // - while Wi-Fi on + no Wi-Fi item + mobile data off - // show all_network_unavailable: - // - while Wi-Fi on + no Wi-Fi item + no carrier item - // - while Wi-Fi on + no Wi-Fi item + service is out of service - // - while Wi-Fi on + no Wi-Fi item + mobile data on + no carrier data. - log("No Wi-Fi item."); - if (!mProviderModelSliceHelper.hasCarrier() - || (!mProviderModelSliceHelper.isVoiceStateInService() - && !mProviderModelSliceHelper.isDataStateInService())) { - log("no carrier or service is out of service."); - mSubtitle = SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE; - return; - } - if (!mProviderModelSliceHelper.isMobileDataEnabled()) { - log("mobile data off"); - mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE; - return; - } - if (!mProviderModelSliceHelper.isDataSimActive()) { - log("no carrier data."); - mSubtitle = SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE; - return; - } - mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE; - } - - protected void updateProgressBar() { - if (mWifiManager == null || !mInternetUpdater.isWifiEnabled()) { - setProgressBarVisible(false); - return; - } - - setProgressBarVisible(true); - List wifiScanResults = mWifiManager.getScanResults(); - if (wifiScanResults != null && wifiScanResults.size() > 0) { - mHandlerInjector.postDelay(mHideProgressBarRunnable); - } else if (!mIsScanningSubTitleShownOnce) { - mHandlerInjector.postDelay(mHideScanningSubTitleRunnable); - } - } - - protected void setProgressBarVisible(boolean visible) { - if (mIsProgressBarVisible == visible) { - return; - } - mIsProgressBarVisible = visible; - - if (mCallback == null) { - return; - } - mCallback.onProgressBarVisibleChanged(); - updatePanelTitle(); - } - - private class NetworkProviderTelephonyCallback extends TelephonyCallback implements - TelephonyCallback.DataConnectionStateListener, - TelephonyCallback.ServiceStateListener { - @Override - public void onServiceStateChanged(ServiceState state) { - log("onServiceStateChanged voiceState=" + state.getState() - + " dataState=" + state.getDataRegistrationState()); - updatePanelTitle(); - } - - @Override - public void onDataConnectionStateChanged(int state, int networkType) { - log("onDataConnectionStateChanged: networkType=" + networkType + " state=" + state); - updatePanelTitle(); - } - } - - private static void log(String s) { - Log.d(TAG, s); - } -} diff --git a/src/com/android/settings/panel/PanelFeatureProviderImpl.java b/src/com/android/settings/panel/PanelFeatureProviderImpl.java index ca30952a72d..a73881b4cc1 100644 --- a/src/com/android/settings/panel/PanelFeatureProviderImpl.java +++ b/src/com/android/settings/panel/PanelFeatureProviderImpl.java @@ -17,11 +17,14 @@ package com.android.settings.panel; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.provider.Settings; public class PanelFeatureProviderImpl implements PanelFeatureProvider { + private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui"; + @Override public PanelContent getPanel(Context context, Bundle bundle) { if (context == null) { @@ -35,7 +38,12 @@ public class PanelFeatureProviderImpl implements PanelFeatureProvider { switch (panelType) { case Settings.Panel.ACTION_INTERNET_CONNECTIVITY: - return InternetConnectivityPanel.create(context); + // Redirect to the internet dialog in SystemUI. + Intent intent = new Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND) + .setPackage(SYSTEMUI_PACKAGE_NAME); + context.sendBroadcast(intent); + return null; case Settings.Panel.ACTION_NFC: return NfcPanel.create(context); case Settings.Panel.ACTION_WIFI: diff --git a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java deleted file mode 100644 index 30a272950f5..00000000000 --- a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java +++ /dev/null @@ -1,341 +0,0 @@ -/* - * Copyright (C) 2021 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.panel; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.clearInvocations; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.content.Context; -import android.net.Uri; -import android.net.wifi.ScanResult; -import android.net.wifi.WifiManager; -import android.os.Handler; - -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import com.android.settings.network.AirplaneModePreferenceController; -import com.android.settings.network.InternetUpdater; -import com.android.settings.network.ProviderModelSliceHelper; -import com.android.settings.slices.CustomSliceRegistry; -import com.android.settings.testutils.ResourcesUtils; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -import java.util.ArrayList; -import java.util.List; - -@RunWith(AndroidJUnit4.class) -public class InternetConnectivityPanelTest { - - public static final String TITLE_INTERNET = ResourcesUtils.getResourcesString( - ApplicationProvider.getApplicationContext(), "provider_internet_settings"); - public static final String TITLE_APM = ResourcesUtils.getResourcesString( - ApplicationProvider.getApplicationContext(), "airplane_mode"); - public static final String SUBTITLE_TEXT_WIFI_IS_OFF = - ResourcesUtils.getResourcesString(ApplicationProvider.getApplicationContext(), - "wifi_is_off"); - public static final String SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT = - ResourcesUtils.getResourcesString(ApplicationProvider.getApplicationContext(), - "tap_a_network_to_connect"); - public static final String SUBTITLE_NON_CARRIER_NETWORK_UNAVAILABLE = - ResourcesUtils.getResourcesString(ApplicationProvider.getApplicationContext(), - "non_carrier_network_unavailable"); - public static final String SUBTITLE_ALL_NETWORK_UNAVAILABLE = - ResourcesUtils.getResourcesString(ApplicationProvider.getApplicationContext(), - "all_network_unavailable"); - public static final String BUTTON_TURN_ON_WIFI = ResourcesUtils.getResourcesString( - ApplicationProvider.getApplicationContext(), "turn_on_wifi"); - public static final String BUTTON_TURN_OFF_WIFI = ResourcesUtils.getResourcesString( - ApplicationProvider.getApplicationContext(), "turn_off_wifi"); - - @Rule - public final MockitoRule mMocks = MockitoJUnit.rule(); - @Mock - Handler mMainThreadHandler; - @Mock - PanelContentCallback mPanelContentCallback; - @Mock - InternetUpdater mInternetUpdater; - @Mock - private WifiManager mWifiManager; - @Mock - private ProviderModelSliceHelper mProviderModelSliceHelper; - - private Context mContext; - private FakeHandlerInjector mFakeHandlerInjector; - private InternetConnectivityPanel mPanel; - - private class FakeHandlerInjector extends InternetConnectivityPanel.HandlerInjector { - - private Runnable mRunnable; - - FakeHandlerInjector(Context context) { - super(context); - } - - @Override - public void postDelay(Runnable runnable) { - mRunnable = runnable; - } - - public Runnable getRunnable() { - return mRunnable; - } - } - - @Before - public void setUp() { - mContext = spy(ApplicationProvider.getApplicationContext()); - mFakeHandlerInjector = new FakeHandlerInjector(mContext); - when(mContext.getApplicationContext()).thenReturn(mContext); - when(mContext.getMainThreadHandler()).thenReturn(mMainThreadHandler); - when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager); - - mPanel = InternetConnectivityPanel.create(mContext); - mPanel.registerCallback(mPanelContentCallback); - mPanel.mIsProviderModelEnabled = true; - mPanel.mInternetUpdater = mInternetUpdater; - mPanel.mProviderModelSliceHelper = mProviderModelSliceHelper; - mPanel.mHandlerInjector = mFakeHandlerInjector; - } - - @Test - public void getTitle_apmOff_shouldBeInternet() { - doReturn(false).when(mInternetUpdater).isAirplaneModeOn(); - - assertThat(mPanel.getTitle()).isEqualTo(TITLE_INTERNET); - } - - @Test - public void getTitle_apmOn_shouldBeApm() { - doReturn(true).when(mInternetUpdater).isAirplaneModeOn(); - - assertThat(mPanel.getTitle()).isEqualTo(TITLE_APM); - } - - @Test - public void getSubTitle_apmOnWifiOff_shouldBeNull() { - doReturn(true).when(mInternetUpdater).isAirplaneModeOn(); - doReturn(false).when(mInternetUpdater).isWifiEnabled(); - - assertThat(mPanel.getSubTitle()).isNull(); - } - - @Test - public void getSubTitle_apmOnWifiOn_shouldBeNull() { - doReturn(true).when(mInternetUpdater).isAirplaneModeOn(); - doReturn(true).when(mInternetUpdater).isWifiEnabled(); - - assertThat(mPanel.getSubTitle()).isNull(); - } - - @Test - public void getSubTitle_apmOffWifiOff_wifiIsOn() { - doReturn(false).when(mInternetUpdater).isAirplaneModeOn(); - doReturn(false).when(mInternetUpdater).isWifiEnabled(); - - mPanel.updatePanelTitle(); - - assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_TEXT_WIFI_IS_OFF); - } - - @Test - public void getSubTitle_apmOffWifiOnNoWifiListHasCarrierData_NonCarrierNetworkUnavailable() { - List wifiList = new ArrayList(); - mockCondition(false, true, true, true, true, true, wifiList); - - mPanel.updatePanelTitle(); - - assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_NON_CARRIER_NETWORK_UNAVAILABLE); - } - - @Test - public void getSubTitle_apmOffWifiOnNoWifiListNoCarrierItem_AllNetworkUnavailable() { - List wifiList = new ArrayList(); - mockCondition(false, false, false, false, false, true, wifiList); - - mPanel.updatePanelTitle(); - - assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_ALL_NETWORK_UNAVAILABLE); - } - - @Test - public void getSubTitle_apmOffWifiOnNoWifiListNoDataSimActive_AllNetworkUnavailable() { - List wifiList = new ArrayList(); - mockCondition(false, true, false, true, true, true, wifiList); - - mPanel.updatePanelTitle(); - - assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_ALL_NETWORK_UNAVAILABLE); - } - - @Test - public void getSubTitle_apmOffWifiOnNoWifiListNoService_AllNetworkUnavailable() { - List wifiList = new ArrayList(); - mockCondition(false, true, false, true, false, true, wifiList); - - mPanel.updatePanelTitle(); - - assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_ALL_NETWORK_UNAVAILABLE); - } - - @Test - public void getSubTitle_apmOffWifiOnTwoWifiItemsNoCarrierData_tapANetworkToConnect() { - List wifiList = new ArrayList(); - wifiList.add(new ScanResult()); - wifiList.add(new ScanResult()); - mockCondition(false, true, false, true, true, true, wifiList); - - mPanel.updatePanelTitle(); - - assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT); - } - - @Test - public void getSlices_providerModelDisabled_containsNecessarySlices() { - mPanel.mIsProviderModelEnabled = false; - List uris = mPanel.getSlices(); - - assertThat(uris).containsExactly( - AirplaneModePreferenceController.SLICE_URI, - CustomSliceRegistry.MOBILE_DATA_SLICE_URI, - CustomSliceRegistry.WIFI_SLICE_URI); - } - - @Test - public void getSlices_providerModelEnabled_containsNecessarySlices() { - List uris = mPanel.getSlices(); - - assertThat(uris).containsExactly(CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI); - } - - @Test - public void getSeeMoreIntent_providerModelDisabled_shouldNotNull() { - mPanel.mIsProviderModelEnabled = false; - - assertThat(mPanel.getSeeMoreIntent()).isNotNull(); - } - - @Test - public void getSeeMoreIntent_providerModelEnabled_shouldBeNull() { - mPanel.mIsProviderModelEnabled = true; - - assertThat(mPanel.getSeeMoreIntent()).isNull(); - } - - @Test - public void updatePanelTitle_onHeaderChanged() { - clearInvocations(mPanelContentCallback); - - mPanel.updatePanelTitle(); - - verify(mPanelContentCallback).onHeaderChanged(); - } - - @Test - public void updateProgressBar_wifiDisabled_hideProgress() { - mPanel.mIsProgressBarVisible = true; - doReturn(false).when(mInternetUpdater).isWifiEnabled(); - clearInvocations(mPanelContentCallback); - - mPanel.updateProgressBar(); - - assertThat(mPanel.isProgressBarVisible()).isFalse(); - verify(mPanelContentCallback).onProgressBarVisibleChanged(); - } - - @Test - public void updateProgressBar_noWifiScanResults_showProgressForever() { - mPanel.mIsScanningSubTitleShownOnce = false; - mPanel.mIsProgressBarVisible = false; - doReturn(true).when(mInternetUpdater).isWifiEnabled(); - List noWifiScanResults = new ArrayList<>(); - doReturn(noWifiScanResults).when(mWifiManager).getScanResults(); - clearInvocations(mPanelContentCallback); - - mPanel.updateProgressBar(); - - assertThat(mPanel.mIsProgressBarVisible).isTrue(); - verify(mPanelContentCallback).onProgressBarVisibleChanged(); - verify(mPanelContentCallback).onHeaderChanged(); - - assertThat(mFakeHandlerInjector.getRunnable()) - .isEqualTo(mPanel.mHideScanningSubTitleRunnable); - mFakeHandlerInjector.getRunnable().run(); - assertThat(mPanel.mIsScanningSubTitleShownOnce).isTrue(); - assertThat(mPanel.mIsProgressBarVisible).isTrue(); - } - - @Test - public void updateProgressBar_hasWifiScanResults_showProgressDelayedHide() { - mPanel.mIsProgressBarVisible = false; - doReturn(true).when(mInternetUpdater).isWifiEnabled(); - List hasWifiScanResults = mock(ArrayList.class); - doReturn(1).when(hasWifiScanResults).size(); - doReturn(hasWifiScanResults).when(mWifiManager).getScanResults(); - clearInvocations(mPanelContentCallback); - - mPanel.updateProgressBar(); - - assertThat(mPanel.isProgressBarVisible()).isTrue(); - verify(mPanelContentCallback).onProgressBarVisibleChanged(); - - assertThat(mFakeHandlerInjector.getRunnable()) - .isEqualTo(mPanel.mHideProgressBarRunnable); - mFakeHandlerInjector.getRunnable().run(); - assertThat(mPanel.mIsProgressBarVisible).isFalse(); - } - - @Test - public void setProgressBarVisible_onProgressBarVisibleChanged() { - mPanel.mIsProgressBarVisible = false; - doReturn(true).when(mInternetUpdater).isWifiEnabled(); - clearInvocations(mPanelContentCallback); - - mPanel.setProgressBarVisible(true); - - assertThat(mPanel.mIsProgressBarVisible).isTrue(); - verify(mPanelContentCallback).onProgressBarVisibleChanged(); - verify(mPanelContentCallback).onHeaderChanged(); - } - - private void mockCondition(boolean airplaneMode, boolean hasCarrier, - boolean isDataSimActive, boolean isMobileDataEnabled, boolean isServiceInService, - boolean isWifiEnabled, List wifiItems) { - doReturn(airplaneMode).when(mInternetUpdater).isAirplaneModeOn(); - when(mProviderModelSliceHelper.hasCarrier()).thenReturn(hasCarrier); - when(mProviderModelSliceHelper.isDataSimActive()).thenReturn(isDataSimActive); - when(mProviderModelSliceHelper.isMobileDataEnabled()).thenReturn(isMobileDataEnabled); - when(mProviderModelSliceHelper.isDataStateInService()).thenReturn(isServiceInService); - when(mProviderModelSliceHelper.isVoiceStateInService()).thenReturn(isServiceInService); - doReturn(isWifiEnabled).when(mInternetUpdater).isWifiEnabled(); - doReturn(wifiItems).when(mWifiManager).getScanResults(); - } -} diff --git a/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java b/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java index 3b61a734af1..a02c054237f 100644 --- a/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java +++ b/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java @@ -20,7 +20,12 @@ import static com.android.settings.panel.SettingsPanelActivity.KEY_PANEL_TYPE_AR import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.provider.Settings; @@ -36,25 +41,28 @@ public class PanelFeatureProviderImplTest { private static final String TEST_PACKAGENAME = "com.test.packagename"; + private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui"; private Context mContext; private PanelFeatureProviderImpl mProvider; private Bundle mBundle; @Before public void setUp() { - mContext = ApplicationProvider.getApplicationContext(); + mContext = spy(ApplicationProvider.getApplicationContext()); mProvider = new PanelFeatureProviderImpl(); mBundle = new Bundle(); mBundle.putString(KEY_MEDIA_PACKAGE_NAME, TEST_PACKAGENAME); } @Test - public void getPanel_internetConnectivityKey_returnsCorrectPanel() { + public void getPanel_internetConnectivityKey_sendsCorrectBroadcast() { mBundle.putString(KEY_PANEL_TYPE_ARGUMENT, Settings.Panel.ACTION_INTERNET_CONNECTIVITY); + mProvider.getPanel(mContext, mBundle); + Intent intent = new Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND) + .setPackage(SYSTEMUI_PACKAGE_NAME); - final PanelContent panel = mProvider.getPanel(mContext, mBundle); - - assertThat(panel).isInstanceOf(InternetConnectivityPanel.class); + verify(mContext, never()).sendBroadcast(intent); } @Test From 0ab0a3af56dd83905b06cd2bb3b8d68a985006a2 Mon Sep 17 00:00:00 2001 From: ykhung Date: Tue, 24 Aug 2021 14:37:05 +0800 Subject: [PATCH 2/3] Refactor BatteryOptimizeUtils from enum to @IntDef Based on the Android API Council guideline, we should avoid using the Enum structure to define the constant definition. go/android-api-guidelines#avoid-enum Bug: 197595292 Test: make SettingsRoboTests Change-Id: I4b22f0abde7f4ce2c3a0b076db786e619783d93e Merged-In: I4b22f0abde7f4ce2c3a0b076db786e619783d93e --- .../fuelgauge/BatteryBackupHelper.java | 11 ++-- .../fuelgauge/BatteryOptimizeUtils.java | 61 +++++++++++-------- .../OptimizedPreferenceController.java | 7 +-- .../RestrictedPreferenceController.java | 7 +-- .../UnrestrictedPreferenceController.java | 7 +-- .../fuelgauge/BatteryBackupHelperTest.java | 4 +- .../fuelgauge/BatteryOptimizeUtilsTest.java | 33 +++++----- .../OptimizedPreferenceControllerTest.java | 8 +-- .../RestrictedPreferenceControllerTest.java | 8 +-- .../UnrestrictedPreferenceControllerTest.java | 8 +-- 10 files changed, 84 insertions(+), 70 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java index 44990ffa3ef..eebfaf7d360 100644 --- a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java +++ b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java @@ -37,8 +37,6 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; -import com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -135,13 +133,16 @@ public final class BatteryBackupHelper implements BackupHelper { for (ApplicationInfo info : applications) { final int mode = appOps.checkOpNoThrow( AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, info.uid, info.packageName); - final AppUsageState state = BatteryOptimizeUtils.getAppUsageState( + @BatteryOptimizeUtils.OptimizationMode + final int optimizationMode = BatteryOptimizeUtils.getAppOptimizationMode( mode, allowlistedApps.contains(info.packageName)); // Ignores default optimized or unknown state. - if (state == AppUsageState.OPTIMIZED || state == AppUsageState.UNKNOWN) { + if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED + || optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN) { continue; } - final String packageOptimizeMode = info.packageName + DELIMITER_MODE + state; + final String packageOptimizeMode = + info.packageName + DELIMITER_MODE + optimizationMode; builder.append(packageOptimizeMode + DELIMITER); debugLog(packageOptimizeMode); } diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java index 0be90600ba7..76c1ca79ac8 100644 --- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java @@ -16,6 +16,7 @@ package com.android.settings.fuelgauge; +import android.annotation.IntDef; import android.app.AppOpsManager; import android.content.Context; import android.util.Log; @@ -24,6 +25,9 @@ import androidx.annotation.VisibleForTesting; import com.android.settingslib.fuelgauge.PowerAllowlistBackend; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** A utility class for application usage operation. */ public class BatteryOptimizeUtils { private static final String TAG = "BatteryOptimizeUtils"; @@ -32,21 +36,27 @@ public class BatteryOptimizeUtils { @VisibleForTesting AppOpsManager mAppOpsManager; @VisibleForTesting BatteryUtils mBatteryUtils; @VisibleForTesting PowerAllowlistBackend mPowerAllowListBackend; + private final String mPackageName; private final int mUid; private int mMode; private boolean mAllowListed; - /** - * Usage type of application. - */ - public enum AppUsageState { - UNKNOWN, - RESTRICTED, - UNRESTRICTED, - OPTIMIZED, - } + // Optimization modes. + static final int MODE_UNKNOWN = 0; + static final int MODE_RESTRICTED = 1; + static final int MODE_UNRESTRICTED = 2; + static final int MODE_OPTIMIZED = 3; + + @IntDef(prefix = {"MODE_"}, value = { + MODE_UNKNOWN, + MODE_RESTRICTED, + MODE_UNRESTRICTED, + MODE_OPTIMIZED, + }) + @Retention(RetentionPolicy.SOURCE) + static @interface OptimizationMode {} public BatteryOptimizeUtils(Context context, int uid, String packageName) { mUid = uid; @@ -59,41 +69,44 @@ public class BatteryOptimizeUtils { mAllowListed = mPowerAllowListBackend.isAllowlisted(mPackageName); } - /** Gets the {@link AppUsageState} based on mode and allowed list. */ - public static AppUsageState getAppUsageState(int mode, boolean isAllowListed) { + /** Gets the {@link OptimizationMode} based on mode and allowed list. */ + @OptimizationMode + public static int getAppOptimizationMode(int mode, boolean isAllowListed) { if (!isAllowListed && mode == AppOpsManager.MODE_IGNORED) { - return AppUsageState.RESTRICTED; + return MODE_RESTRICTED; } else if (isAllowListed && mode == AppOpsManager.MODE_ALLOWED) { - return AppUsageState.UNRESTRICTED; + return MODE_UNRESTRICTED; } else if (!isAllowListed && mode == AppOpsManager.MODE_ALLOWED) { - return AppUsageState.OPTIMIZED; + return MODE_OPTIMIZED; } else { - return AppUsageState.UNKNOWN; + return MODE_UNKNOWN; } } - /** Gets the current {@link AppUsageState}. */ - public AppUsageState getAppUsageState() { + /** Gets the {@link OptimizationMode} for associated app. */ + @OptimizationMode + public int getAppOptimizationMode() { refreshState(); - return getAppUsageState(mMode, mAllowListed); + return getAppOptimizationMode(mMode, mAllowListed); } - public void setAppUsageState(AppUsageState state) { - switch (state) { - case RESTRICTED: + /** Sets the {@link OptimizationMode} for associated app. */ + public void setAppOptimizationMode(@OptimizationMode int mode) { + switch (mode) { + case MODE_RESTRICTED: mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_IGNORED); mPowerAllowListBackend.removeApp(mPackageName); break; - case UNRESTRICTED: + case MODE_UNRESTRICTED: mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_ALLOWED); mPowerAllowListBackend.addApp(mPackageName); break; - case OPTIMIZED: + case MODE_OPTIMIZED: mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_ALLOWED); mPowerAllowListBackend.removeApp(mPackageName); break; default: - Log.d(TAG, "set unknown app usage state."); + Log.d(TAG, "set unknown app optimization mode."); } } diff --git a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java index b2da35632ea..ffec50d4f53 100644 --- a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java +++ b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java @@ -16,8 +16,6 @@ package com.android.settings.fuelgauge; -import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.OPTIMIZED; - import android.content.Context; import android.util.Log; @@ -59,7 +57,8 @@ public class OptimizedPreferenceController extends AbstractPreferenceController Log.d(TAG, "is system or default app, disable pref"); ((RadioButtonPreference) preference).setChecked(false); preference.setEnabled(false); - } else if (mBatteryOptimizeUtils.getAppUsageState() == OPTIMIZED) { + } else if (mBatteryOptimizeUtils.getAppOptimizationMode() + == BatteryOptimizeUtils.MODE_OPTIMIZED) { Log.d(TAG, "is optimized states"); ((RadioButtonPreference) preference).setChecked(true); } else { @@ -78,7 +77,7 @@ public class OptimizedPreferenceController extends AbstractPreferenceController return false; } - mBatteryOptimizeUtils.setAppUsageState(OPTIMIZED); + mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_OPTIMIZED); Log.d(TAG, "Set optimized"); return true; } diff --git a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java index b52af578e13..d50926e6177 100644 --- a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java +++ b/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java @@ -17,8 +17,6 @@ package com.android.settings.fuelgauge; -import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.RESTRICTED; - import android.content.Context; import android.util.Log; @@ -57,7 +55,8 @@ public class RestrictedPreferenceController extends AbstractPreferenceController Log.d(TAG, "is system or default app, disable pref"); ((RadioButtonPreference) preference).setChecked(false); preference.setEnabled(false); - } else if (mBatteryOptimizeUtils.getAppUsageState() == RESTRICTED) { + } else if (mBatteryOptimizeUtils.getAppOptimizationMode() + == BatteryOptimizeUtils.MODE_RESTRICTED) { Log.d(TAG, "is restricted states"); ((RadioButtonPreference) preference).setChecked(true); } else { @@ -81,7 +80,7 @@ public class RestrictedPreferenceController extends AbstractPreferenceController return false; } - mBatteryOptimizeUtils.setAppUsageState(RESTRICTED); + mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_RESTRICTED); Log.d(TAG, "Set restricted"); return true; } diff --git a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java index 36141c52abd..1d66c6c6cdd 100644 --- a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java +++ b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java @@ -16,8 +16,6 @@ package com.android.settings.fuelgauge; -import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.UNRESTRICTED; - import android.content.Context; import android.util.Log; @@ -55,7 +53,8 @@ public class UnrestrictedPreferenceController extends AbstractPreferenceControll if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) { Log.d(TAG, "is system or default app, unrestricted states only"); ((RadioButtonPreference) preference).setChecked(true); - } else if (mBatteryOptimizeUtils.getAppUsageState() == UNRESTRICTED) { + } else if (mBatteryOptimizeUtils.getAppOptimizationMode() + == BatteryOptimizeUtils.MODE_UNRESTRICTED) { Log.d(TAG, "is unrestricted states"); ((RadioButtonPreference) preference).setChecked(true); } else { @@ -79,7 +78,7 @@ public class UnrestrictedPreferenceController extends AbstractPreferenceControll return false; } - mBatteryOptimizeUtils.setAppUsageState(UNRESTRICTED); + mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_UNRESTRICTED); Log.d(TAG, "Set unrestricted"); return true; } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java index 47fa59e6271..90e9405ba03 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java @@ -180,8 +180,8 @@ public final class BatteryBackupHelperTest { mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps); - final String expectedResult = - packageName1 + "|UNRESTRICTED," + packageName2 + "|RESTRICTED,"; + // 2 for UNRESTRICTED mode and 1 for RESTRICTED mode. + final String expectedResult = packageName1 + "|2," + packageName2 + "|1,"; final byte[] expectedBytes = expectedResult.getBytes(); verify(mBackupDataOutput).writeEntityHeader( BatteryBackupHelper.KEY_OPTIMIZATION_LIST, expectedBytes.length); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java index 89d66be187b..c1603b803fd 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java @@ -16,9 +16,9 @@ package com.android.settings.fuelgauge; -import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.OPTIMIZED; -import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.RESTRICTED; -import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.UNRESTRICTED; +import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_OPTIMIZED; +import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_RESTRICTED; +import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_UNRESTRICTED; import static com.google.common.truth.Truth.assertThat; @@ -65,30 +65,33 @@ public class BatteryOptimizeUtilsTest { } @Test - public void testGetAppUsageState_returnRestricted() { + public void testGetAppOptimizationMode_returnRestricted() { when(mockBackend.isAllowlisted(anyString())).thenReturn(false); when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) .thenReturn(AppOpsManager.MODE_IGNORED); - assertThat(mBatteryOptimizeUtils.getAppUsageState()).isEqualTo(RESTRICTED); + assertThat(mBatteryOptimizeUtils.getAppOptimizationMode()) + .isEqualTo(MODE_RESTRICTED); } @Test - public void testGetAppUsageState_returnUnrestricted() { + public void testGetAppOptimizationMode_returnUnrestricted() { when(mockBackend.isAllowlisted(anyString())).thenReturn(true); when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) .thenReturn(AppOpsManager.MODE_ALLOWED); - assertThat(mBatteryOptimizeUtils.getAppUsageState()).isEqualTo(UNRESTRICTED); + assertThat(mBatteryOptimizeUtils.getAppOptimizationMode()) + .isEqualTo(MODE_UNRESTRICTED); } @Test - public void testGetAppUsageState_returnOptimized() { + public void testGetAppOptimizationMode_returnOptimized() { when(mockBackend.isAllowlisted(anyString())).thenReturn(false); when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) .thenReturn(AppOpsManager.MODE_ALLOWED); - assertThat(mBatteryOptimizeUtils.getAppUsageState()).isEqualTo(OPTIMIZED); + assertThat(mBatteryOptimizeUtils.getAppOptimizationMode()) + .isEqualTo(MODE_OPTIMIZED); } @Test @@ -118,8 +121,8 @@ public class BatteryOptimizeUtilsTest { } @Test - public void testSetAppUsageState_Restricted_verifyAction() { - mBatteryOptimizeUtils.setAppUsageState(RESTRICTED); + public void testSetAppOptimizationMode_Restricted_verifyAction() { + mBatteryOptimizeUtils.setAppOptimizationMode(MODE_RESTRICTED); verify(mockBatteryUtils).setForceAppStandby(UID, PACKAGE_NAME, AppOpsManager.MODE_IGNORED); @@ -127,8 +130,8 @@ public class BatteryOptimizeUtilsTest { } @Test - public void testSetAppUsageState_Unrestricted_verifyAction() { - mBatteryOptimizeUtils.setAppUsageState(UNRESTRICTED); + public void testSetAppOptimizationMode_Unrestricted_verifyAction() { + mBatteryOptimizeUtils.setAppOptimizationMode(MODE_UNRESTRICTED); verify(mockBatteryUtils).setForceAppStandby(UID, PACKAGE_NAME, AppOpsManager.MODE_ALLOWED); @@ -136,8 +139,8 @@ public class BatteryOptimizeUtilsTest { } @Test - public void testSetAppUsageState_Optimized_verifyAction() { - mBatteryOptimizeUtils.setAppUsageState(OPTIMIZED); + public void testSetAppOptimizationMode_Optimized_verifyAction() { + mBatteryOptimizeUtils.setAppOptimizationMode(MODE_OPTIMIZED); verify(mockBatteryUtils).setForceAppStandby(UID, PACKAGE_NAME, AppOpsManager.MODE_ALLOWED); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java index 874618db00b..9df3ac90cb4 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java @@ -76,8 +76,8 @@ public class OptimizedPreferenceControllerTest { @Test public void testUpdateState_isOptimizedStates_prefChecked() { when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); - when(mockBatteryOptimizeUtils.getAppUsageState()).thenReturn( - BatteryOptimizeUtils.AppUsageState.OPTIMIZED); + when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn( + BatteryOptimizeUtils.MODE_OPTIMIZED); mController.updateState(mPreference); @@ -98,8 +98,8 @@ public class OptimizedPreferenceControllerTest { mPreference.setKey(mController.KEY_OPTIMIZED_PREF); mController.handlePreferenceTreeClick(mPreference); - verify(mockBatteryOptimizeUtils).setAppUsageState( - BatteryOptimizeUtils.AppUsageState.OPTIMIZED); + verify(mockBatteryOptimizeUtils).setAppOptimizationMode( + BatteryOptimizeUtils.MODE_OPTIMIZED); } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java index 2e17404f675..09861536edd 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java @@ -84,8 +84,8 @@ public class RestrictedPreferenceControllerTest { @Test public void testUpdateState_isRestrictedStates_prefChecked() { when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); - when(mockBatteryOptimizeUtils.getAppUsageState()).thenReturn( - BatteryOptimizeUtils.AppUsageState.RESTRICTED); + when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn( + BatteryOptimizeUtils.MODE_RESTRICTED); mController.updateState(mPreference); @@ -106,8 +106,8 @@ public class RestrictedPreferenceControllerTest { mPreference.setKey(mController.KEY_RESTRICTED_PREF); mController.handlePreferenceTreeClick(mPreference); - verify(mockBatteryOptimizeUtils).setAppUsageState( - BatteryOptimizeUtils.AppUsageState.RESTRICTED); + verify(mockBatteryOptimizeUtils).setAppOptimizationMode( + BatteryOptimizeUtils.MODE_RESTRICTED); } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java index 63cf760a2f6..004e97ce6fe 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java @@ -84,8 +84,8 @@ public class UnrestrictedPreferenceControllerTest { @Test public void testUpdateState_isUnrestrictedStates_prefChecked() { when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true); - when(mockBatteryOptimizeUtils.getAppUsageState()).thenReturn( - BatteryOptimizeUtils.AppUsageState.UNRESTRICTED); + when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn( + BatteryOptimizeUtils.MODE_UNRESTRICTED); mController.updateState(mPreference); @@ -106,8 +106,8 @@ public class UnrestrictedPreferenceControllerTest { mPreference.setKey(mController.KEY_UNRESTRICTED_PREF); mController.handlePreferenceTreeClick(mPreference); - verify(mockBatteryOptimizeUtils).setAppUsageState( - BatteryOptimizeUtils.AppUsageState.UNRESTRICTED); + verify(mockBatteryOptimizeUtils).setAppOptimizationMode( + BatteryOptimizeUtils.MODE_UNRESTRICTED); } @Test From 935a9321b5b4387f178f75a4e99256424c7c272d Mon Sep 17 00:00:00 2001 From: ykhung Date: Wed, 25 Aug 2021 01:24:19 +0800 Subject: [PATCH 3/3] [B&R] notify BackupManager when app optimization mode is changed Invoke BackupManager.dataChanged() when app optimization mode is changed to notify BackupManager to execute Settings agent to backup data in the next backup session, when performing the partial backup event. Bug: 192523697 Bug: 197608038 Bug: 194633034 Test: make SettingsRoboTests Change-Id: I456acc2594d22503763e4ce286435148ae0644a4 --- res/values/strings.xml | 2 +- .../fuelgauge/AdvancedPowerUsageDetail.java | 35 ++++++++++++--- .../AdvancedPowerUsageDetailTest.java | 44 ++++++++++++++++++- 3 files changed, 72 insertions(+), 9 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index f193a3180f9..a33a6bca061 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6143,7 +6143,7 @@ History details - Battery Usage + Battery usage View usage for past 24 hours diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index 3319e1b1492..be1ea31169f 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -20,6 +20,7 @@ import android.annotation.UserIdInt; import android.app.Activity; import android.app.ActivityManager; import android.app.settings.SettingsEnums; +import android.app.backup.BackupManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -113,7 +114,12 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements @VisibleForTesting RadioButtonPreference mUnrestrictedPreference; @VisibleForTesting - boolean enableTriState = true; + boolean mEnableTriState = true; + @VisibleForTesting + @BatteryOptimizeUtils.OptimizationMode + int mOptimizationMode = BatteryOptimizeUtils.MODE_UNKNOWN; + @VisibleForTesting + BackupManager mBackupManager; private AppButtonsPreferenceController mAppButtonsPreferenceController; private BackgroundActivityPreferenceController mBackgroundActivityPreferenceController; @@ -245,7 +251,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements super.onCreate(icicle); final String packageName = getArguments().getString(EXTRA_PACKAGE_NAME); - if (enableTriState) { + if (mEnableTriState) { onCreateForTriState(packageName); } else { mForegroundPreference = findPreference(KEY_PREF_FOREGROUND); @@ -263,7 +269,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements super.onResume(); initHeader(); - if (enableTriState) { + if (mEnableTriState) { initPreferenceForTriState(getContext()); final String packageName = mBatteryOptimizeUtils.getPackageName(); FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider() @@ -276,6 +282,22 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements } } + @Override + public void onDestroy() { + super.onDestroy(); + notifyBackupManager(); + } + + @VisibleForTesting + void notifyBackupManager() { + if (mEnableTriState + && mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) { + final BackupManager backupManager = mBackupManager != null + ? mBackupManager : new BackupManager(getContext()); + backupManager.dataChanged(); + } + } + @VisibleForTesting void initHeader() { final View appSnippet = mHeaderPreference.findViewById(R.id.entity_header); @@ -303,7 +325,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements controller.setIsInstantApp(AppUtils.isInstant(mAppEntry.info)); } - if (enableTriState) { + if (mEnableTriState) { final long foregroundTimeMs = bundle.getLong(EXTRA_FOREGROUND_TIME); final long backgroundTimeMs = bundle.getLong(EXTRA_BACKGROUND_TIME); final String slotTime = bundle.getString(EXTRA_SLOT_TIME, null); @@ -374,7 +396,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements @Override protected int getPreferenceScreenResId() { - return enableTriState ? R.xml.power_usage_detail : R.xml.power_usage_detail_legacy; + return mEnableTriState ? R.xml.power_usage_detail : R.xml.power_usage_detail_legacy; } @Override @@ -388,7 +410,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements (SettingsActivity) getActivity(), this, getSettingsLifecycle(), packageName, mState, REQUEST_UNINSTALL, REQUEST_REMOVE_DEVICE_ADMIN); controllers.add(mAppButtonsPreferenceController); - if (enableTriState) { + if (mEnableTriState) { controllers.add(new UnrestrictedPreferenceController(context, uid, packageName)); controllers.add(new OptimizedPreferenceController(context, uid, packageName)); controllers.add(new RestrictedPreferenceController(context, uid, packageName)); @@ -467,6 +489,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements mBatteryOptimizeUtils = new BatteryOptimizeUtils( getContext(), getArguments().getInt(EXTRA_UID), packageName); + mOptimizationMode = mBatteryOptimizeUtils.getAppOptimizationMode(); } private CharSequence getAppActiveTime( diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index b50e0832ec0..a2e78c3a2b5 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -30,9 +30,11 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.app.AppOpsManager; +import android.app.backup.BackupManager; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; @@ -123,6 +125,9 @@ public class AdvancedPowerUsageDetailTest { private BatteryUtils mBatteryUtils; @Mock private BatteryOptimizeUtils mBatteryOptimizeUtils; + @Mock + private BackupManager mBackupManager; + private Context mContext; private Preference mForegroundPreference; private Preference mBackgroundPreference; @@ -180,9 +185,10 @@ public class AdvancedPowerUsageDetailTest { mFragment.mHeaderPreference = mHeaderPreference; mFragment.mState = mState; - mFragment.enableTriState = true; + mFragment.mEnableTriState = true; mFragment.mBatteryUtils = new BatteryUtils(RuntimeEnvironment.application); mFragment.mBatteryOptimizeUtils = mBatteryOptimizeUtils; + mFragment.mBackupManager = mBackupManager; mAppEntry.info = mock(ApplicationInfo.class); mTestActivity = spy(new SettingsActivity()); @@ -231,7 +237,7 @@ public class AdvancedPowerUsageDetailTest { @Test public void testGetPreferenceScreenResId_disableTriState_returnLegacyLayout() { - mFragment.enableTriState = false; + mFragment.mEnableTriState = false; assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(R.xml.power_usage_detail_legacy); } @@ -780,4 +786,38 @@ public class AdvancedPowerUsageDetailTest { new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, "app label") }); } + + @Test + public void notifyBackupManager_optimizationModeIsNotChanged_notInvokeDataChanged() { + final int mode = BatteryOptimizeUtils.MODE_RESTRICTED; + mFragment.mOptimizationMode = mode; + when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode); + + mFragment.notifyBackupManager(); + + verifyZeroInteractions(mBackupManager); + } + + @Test + public void notifyBackupManager_optimizationModeIsChanged_invokeDataChanged() { + mFragment.mOptimizationMode = BatteryOptimizeUtils.MODE_RESTRICTED; + when(mBatteryOptimizeUtils.getAppOptimizationMode()) + .thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED); + + mFragment.notifyBackupManager(); + + verify(mBackupManager).dataChanged(); + } + + @Test + public void notifyBackupManager_triStateIsNotEnabled_notInvokeDataChanged() { + mFragment.mOptimizationMode = BatteryOptimizeUtils.MODE_RESTRICTED; + when(mBatteryOptimizeUtils.getAppOptimizationMode()) + .thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED); + mFragment.mEnableTriState = false; + + mFragment.notifyBackupManager(); + + verifyZeroInteractions(mBackupManager); + } }