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/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/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/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); + } } 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 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