diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 56ada59a03a..cb53a02865e 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1490,6 +1490,7 @@ diff --git a/res/layout-land/udfps_enroll_enrolling_land.xml b/res/layout-land/udfps_enroll_enrolling_land.xml new file mode 100644 index 00000000000..7ccd396936b --- /dev/null +++ b/res/layout-land/udfps_enroll_enrolling_land.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout-land/udfps_enroll_find_sensor_land.xml b/res/layout-land/udfps_enroll_find_sensor_land.xml new file mode 100644 index 00000000000..6335afb2485 --- /dev/null +++ b/res/layout-land/udfps_enroll_find_sensor_land.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index e65806bb3d6..2e98ec57de3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5843,6 +5843,8 @@ History details View battery usage + + View usage for past 24 hours Battery usage @@ -5979,7 +5981,7 @@ Detect when apps drain battery - On / Detecting when apps drain battery + Detecting when apps drain battery Off @@ -6245,6 +6247,9 @@ Based on your routine + + Will turn on based on your routine + Based on percentage @@ -6612,7 +6617,7 @@ Other options are disabled by your admin - More details + Learn more Notification log Notification history @@ -12804,6 +12809,12 @@ To use, first set a screen lock + + Hold for Assistant + + + Trigger the Assistant by holding the power button + Show device controls diff --git a/res/xml/power_menu_settings.xml b/res/xml/power_menu_settings.xml index c7fba713183..bfe9c20679b 100644 --- a/res/xml/power_menu_settings.xml +++ b/res/xml/power_menu_settings.xml @@ -20,6 +20,13 @@ xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/power_menu_setting_name"> + + - + settings:searchable="false"/> diff --git a/src/com/android/settings/applications/intentpicker/ProgressDialogFragment.java b/src/com/android/settings/applications/intentpicker/ProgressDialogFragment.java index 53a6b04e66e..f99775e27dd 100644 --- a/src/com/android/settings/applications/intentpicker/ProgressDialogFragment.java +++ b/src/com/android/settings/applications/intentpicker/ProgressDialogFragment.java @@ -34,19 +34,19 @@ import android.widget.ProgressBar; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentManager; import androidx.lifecycle.ViewModelProviders; import com.android.settings.R; +import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settingslib.utils.ThreadUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; -/** A customized {@link DialogFragment} with a progress bar. */ -public class ProgressDialogFragment extends DialogFragment { +/** A customized {@link InstrumentedDialogFragment} with a progress bar. */ +public class ProgressDialogFragment extends InstrumentedDialogFragment { private static final String TAG = "ProgressDialogFragment"; private static final String DLG_ID = "ProgressDialog"; private static final int PROGRESS_BAR_STEPPING_TIME = 20; @@ -110,6 +110,11 @@ public class ProgressDialogFragment extends DialogFragment { } } + @Override + public int getMetricsCategory() { + return 0; + } + /** * To generate a progress alter dialog and invoke the supported links dialog. */ diff --git a/src/com/android/settings/applications/intentpicker/SupportedLinksDialogFragment.java b/src/com/android/settings/applications/intentpicker/SupportedLinksDialogFragment.java index 52511c9540c..db93df2cd96 100644 --- a/src/com/android/settings/applications/intentpicker/SupportedLinksDialogFragment.java +++ b/src/com/android/settings/applications/intentpicker/SupportedLinksDialogFragment.java @@ -26,19 +26,19 @@ import android.util.ArraySet; import android.util.Log; import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.lifecycle.ViewModelProviders; import com.android.settings.R; +import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import java.util.List; import java.util.Set; import java.util.UUID; -/** A customized {@link DialogFragment} with multiple checkboxes. */ -public class SupportedLinksDialogFragment extends DialogFragment { +/** A customized {@link InstrumentedDialogFragment} with multiple checkboxes. */ +public class SupportedLinksDialogFragment extends InstrumentedDialogFragment { private static final String TAG = "SupportedLinksDialogFrg"; private static final String DLG_ID = "SupportedLinksDialog"; @@ -54,11 +54,6 @@ public class SupportedLinksDialogFragment extends DialogFragment { mSupportedLinkWrapperList = mViewModel.getSupportedLinkWrapperList(); } - @Override - public void onDestroy() { - super.onDestroy(); - } - @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Context context = getActivity(); @@ -70,13 +65,17 @@ public class SupportedLinksDialogFragment extends DialogFragment { .setAdapter(adapter, /* listener= */ null) .setCancelable(true) .setPositiveButton(R.string.app_launch_supported_links_add, (dialog, id) -> { - // addSelectedItems(((AlertDialog) dialog).getListView()); doSelectedAction(); }) .setNegativeButton(R.string.app_launch_dialog_cancel, /* listener= */ null); return builder.create(); } + @Override + public int getMetricsCategory() { + return 0; + } + /** Display the dialog. */ public void showDialog(FragmentManager manager) { show(manager, DLG_ID); diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java index 1fe3f177b69..0625bbbfc39 100644 --- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java +++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java @@ -71,6 +71,7 @@ import com.android.settings.users.UserDialogs; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedLockUtilsInternal; +import com.android.settingslib.collapsingtoolbar.CollapsingToolbarBaseActivity; import org.xmlpull.v1.XmlPullParserException; @@ -79,7 +80,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; -public class DeviceAdminAdd extends Activity { +/** + * A confirmation screen for enabling administractor. + */ +public class DeviceAdminAdd extends CollapsingToolbarBaseActivity { static final String TAG = "DeviceAdminAdd"; static final int DIALOG_WARNING = 1; diff --git a/src/com/android/settings/biometrics/BiometricUtils.java b/src/com/android/settings/biometrics/BiometricUtils.java index d93a321cacb..f338eb592b1 100644 --- a/src/com/android/settings/biometrics/BiometricUtils.java +++ b/src/com/android/settings/biometrics/BiometricUtils.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.content.IntentSender; import android.os.storage.StorageManager; import android.util.Log; +import android.view.Surface; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -241,4 +242,14 @@ public class BiometricUtils { } return false; } + + /** + * Returns {@code true} if the screen is going into a landscape mode and the angle is equal to + * 270. + * @param context Context that we use to get the display this context is associated with + * @return True if the angle of the rotation is equal to 270. + */ + public static boolean isReverseLandscape(@NonNull Context context) { + return context.getDisplay().getRotation() == Surface.ROTATION_270; + } } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index 10b31e331b9..8def63d2c73 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -47,6 +47,7 @@ import androidx.appcompat.app.AlertDialog; import com.android.settings.R; import com.android.settings.biometrics.BiometricEnrollSidecar; import com.android.settings.biometrics.BiometricErrorDialog; +import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.BiometricsEnrollEnrolling; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; @@ -98,6 +99,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { private boolean mCanAssumeUdfps; @Nullable private ProgressBar mProgressBar; private ObjectAnimator mProgressAnim; + private TextView mDescriptionText; private TextView mErrorText; private Interpolator mFastOutSlowInInterpolator; private Interpolator mLinearOutSlowInInterpolator; @@ -145,7 +147,11 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { mCanAssumeUdfps = props.size() == 1 && props.get(0).isAnyUdfpsType(); if (mCanAssumeUdfps) { - setContentView(R.layout.udfps_enroll_enrolling); + if (BiometricUtils.isReverseLandscape(getApplicationContext())) { + setContentView(R.layout.udfps_enroll_enrolling_land); + } else { + setContentView(R.layout.udfps_enroll_enrolling); + } setDescriptionText(R.string.security_settings_udfps_enroll_start_message); } else { setContentView(R.layout.fingerprint_enroll_enrolling); diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java index 94eb2780bee..8bc03acb4f9 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java @@ -112,7 +112,11 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase { protected int getContentView() { if (mCanAssumeUdfps) { - return R.layout.udfps_enroll_find_sensor_layout; + if (BiometricUtils.isReverseLandscape(getApplicationContext())) { + return R.layout.udfps_enroll_find_sensor_land; + } else { + return R.layout.udfps_enroll_find_sensor_layout; + } } return R.layout.fingerprint_enroll_find_sensor; } diff --git a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java index e0527f9d32b..c16b95c7e11 100644 --- a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java +++ b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java @@ -60,7 +60,6 @@ public class AdaptiveSleepPreferenceController { mPreference = new RestrictedSwitchPreference(context); mPreference.setTitle(R.string.adaptive_sleep_title); mPreference.setSummary(R.string.adaptive_sleep_description); - mPreference.setIcon(R.drawable.empty_icon); mPreference.setChecked(isChecked()); mPreference.setKey(PREFERENCE_KEY); mPreference.setOnPreferenceClickListener(preference -> { diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java index 3b0d333d5d2..a15a7a03f6b 100644 --- a/src/com/android/settings/display/ScreenTimeoutSettings.java +++ b/src/com/android/settings/display/ScreenTimeoutSettings.java @@ -164,7 +164,8 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements final String textMoreDetails = getResources().getString(R.string.admin_more_details); final SpannableString spannableString = new SpannableString( - textDisabledByAdmin + System.lineSeparator() + textMoreDetails); + textDisabledByAdmin + System.lineSeparator() + + System.lineSeparator() + textMoreDetails); final ClickableSpan clickableSpan = new ClickableSpan() { @Override public void onClick(@NonNull View widget) { @@ -174,7 +175,7 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements if (textDisabledByAdmin != null && textMoreDetails != null) { spannableString.setSpan(clickableSpan, textDisabledByAdmin.length() + 1, - textDisabledByAdmin.length() + textMoreDetails.length() + 1, + textDisabledByAdmin.length() + textMoreDetails.length() + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } diff --git a/src/com/android/settings/fuelgauge/BatterySaverController.java b/src/com/android/settings/fuelgauge/BatterySaverController.java index fba163dd223..15070c3e8d2 100644 --- a/src/com/android/settings/fuelgauge/BatterySaverController.java +++ b/src/com/android/settings/fuelgauge/BatterySaverController.java @@ -111,7 +111,7 @@ public class BatterySaverController extends BasePreferenceController Utils.formatPercentage(percent)) : mContext.getString(R.string.battery_saver_off_summary); } else { - return mContext.getString(R.string.battery_saver_auto_routine); + return mContext.getString(R.string.battery_saver_pref_auto_routine_summary); } } diff --git a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java index 73b875bb575..11f28b7895e 100644 --- a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java +++ b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProvider.java @@ -24,6 +24,6 @@ public interface BatterySettingsFeatureProvider { /** * Get replacement activity for a given activity or fragment path. */ - String getReplacingActivityName(String activity); + String getReplacingActivityName(String originalActivity); } diff --git a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java index e4106959846..218d0969560 100644 --- a/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/BatterySettingsFeatureProviderImpl.java @@ -16,13 +16,21 @@ package com.android.settings.fuelgauge; +import android.content.Context; + /** * Feature provider implementation for battery settings usage. */ public class BatterySettingsFeatureProviderImpl implements BatterySettingsFeatureProvider { + protected Context mContext; + + public BatterySettingsFeatureProviderImpl(Context context) { + mContext = context.getApplicationContext(); + } + @Override - public String getReplacingActivityName(String activity) { + public String getReplacingActivityName(String originalActivity) { return null; } } diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java index 9565036bfc8..790264cf313 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java @@ -19,7 +19,6 @@ package com.android.settings.fuelgauge.batterytip; import android.app.AppOpsManager; import android.content.Context; import android.os.UserManager; -import android.provider.Settings; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; @@ -34,7 +33,6 @@ import com.android.settings.overlay.FeatureFactory; */ public class BatteryManagerPreferenceController extends BasePreferenceController { private static final String KEY_BATTERY_MANAGER = "smart_battery_manager"; - private static final int ON = 1; private PowerUsageFeatureProvider mPowerUsageFeatureProvider; private AppOpsManager mAppOpsManager; private UserManager mUserManager; @@ -56,24 +54,17 @@ public class BatteryManagerPreferenceController extends BasePreferenceController public void updateState(Preference preference) { super.updateState(preference); final int num = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager, mUserManager).size(); - final String setting = mPowerUsageFeatureProvider.isSmartBatterySupported() - ? Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED - : Settings.Global.APP_AUTO_RESTRICTION_ENABLED; - final boolean featureOn = - Settings.Global.getInt(mContext.getContentResolver(), setting, ON) == ON; - updateSummary(preference, featureOn, num); + updateSummary(preference, num); } @VisibleForTesting - void updateSummary(Preference preference, boolean featureOn, int num) { + void updateSummary(Preference preference, int num) { if (num > 0) { preference.setSummary(mContext.getResources().getQuantityString( R.plurals.battery_manager_app_restricted, num, num)); - } else if (featureOn) { - preference.setSummary(R.string.battery_manager_on); } else { - preference.setSummary(R.string.battery_manager_off); + preference.setSummary(R.string.battery_manager_summary); } } } diff --git a/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java b/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java new file mode 100644 index 00000000000..7a456023614 --- /dev/null +++ b/src/com/android/settings/gestures/LongPressPowerButtonPreferenceController.java @@ -0,0 +1,188 @@ +/* + * 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.gestures; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.pm.PackageManager; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; +import android.provider.Settings; + +import androidx.annotation.Nullable; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleObserver; +import androidx.lifecycle.OnLifecycleEvent; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.internal.R; +import com.android.internal.annotations.VisibleForTesting; +import com.android.settings.core.TogglePreferenceController; + +/** + * Configures the behaviour of long press power button action. + */ +public class LongPressPowerButtonPreferenceController extends TogglePreferenceController implements + LifecycleObserver { + + private static final String POWER_BUTTON_LONG_PRESS_SETTING = + Settings.Global.POWER_BUTTON_LONG_PRESS; + private static final Uri POWER_BUTTON_LONG_PRESS_SETTING_URI = + Settings.Global.getUriFor(POWER_BUTTON_LONG_PRESS_SETTING); + + // Used for fallback to global actions if necessary. + @VisibleForTesting + static final String CARDS_AVAILABLE_KEY = + Settings.Secure.GLOBAL_ACTIONS_PANEL_AVAILABLE; + @VisibleForTesting + static final String CARDS_ENABLED_KEY = Settings.Secure.GLOBAL_ACTIONS_PANEL_ENABLED; + + /** + * Value used for long press power button behaviour when Assist setting is enabled. + * + * {@link com.android.server.policy.PhoneWindowManager#LONG_PRESS_POWER_GLOBAL_ACTIONS} for + * source of the value. + */ + @VisibleForTesting + static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1; + @VisibleForTesting + static final int LONG_PRESS_POWER_SHUT_OFF = 2; + @VisibleForTesting + static final int LONG_PRESS_POWER_ASSISTANT_VALUE = 5; // Settings.Secure.ASSISTANT + + /** + * Value used for long press power button behaviour when the Assist setting is disabled. + * + * If this value matches Assist setting, then it falls back to Global Actions panel or + * power menu, depending on their respective settings. + */ + private static final int POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE = + R.integer.config_longPressOnPowerBehavior; + + @Nullable + private SettingObserver mSettingsObserver; + + public LongPressPowerButtonPreferenceController(Context context, String key) { + super(context, key); + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mSettingsObserver = new SettingObserver(screen.findPreference(getPreferenceKey())); + } + + /** + * Called when the settings pages resumes. + */ + @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) + public void onResume() { + if (mSettingsObserver != null) { + mSettingsObserver.register(); + } + } + + /** + * Called when the settings page pauses. + */ + @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) + public void onPause() { + if (mSettingsObserver != null) { + mSettingsObserver.unregister(); + } + } + + @Override + public int getAvailabilityStatus() { + final boolean enabled = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable); + return enabled ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + } + + @Override + public boolean isChecked() { + final int powerButtonValue = Settings.Global.getInt(mContext.getContentResolver(), + POWER_BUTTON_LONG_PRESS_SETTING, + mContext.getResources().getInteger(POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE)); + return powerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE; + } + + @Override + public boolean setChecked(boolean isChecked) { + if (isChecked) { + return Settings.Global.putInt(mContext.getContentResolver(), + POWER_BUTTON_LONG_PRESS_SETTING, LONG_PRESS_POWER_ASSISTANT_VALUE); + } + + // We need to determine the right disabled value - we set it to device default + // if it's different than Assist, otherwise we fallback to either global actions or power + //menu. + final int defaultPowerButtonValue = mContext.getResources().getInteger( + POWER_BUTTON_LONG_PRESS_DEFAULT_VALUE_RESOURCE); + if (defaultPowerButtonValue == LONG_PRESS_POWER_ASSISTANT_VALUE) { + final int fallbackValue = isCardsOrControlsAvailable() ? LONG_PRESS_POWER_GLOBAL_ACTIONS + : LONG_PRESS_POWER_SHUT_OFF; + return Settings.Global.putInt(mContext.getContentResolver(), + POWER_BUTTON_LONG_PRESS_SETTING, fallbackValue); + } + + return Settings.Global.putInt(mContext.getContentResolver(), + POWER_BUTTON_LONG_PRESS_SETTING, defaultPowerButtonValue); + } + + /** + * Returns true if the global actions menu on power button click is enabled via any of the + * content options. + */ + private boolean isCardsOrControlsAvailable() { + final ContentResolver resolver = mContext.getContentResolver(); + final boolean cardsAvailable = Settings.Secure.getInt(resolver, CARDS_AVAILABLE_KEY, 0) + != 0; + final boolean controlsAvailable = mContext.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_CONTROLS); + return cardsAvailable || controlsAvailable; + } + + private final class SettingObserver extends ContentObserver { + + private final Preference mPreference; + + SettingObserver(Preference preference) { + super(new Handler(Looper.getMainLooper())); + mPreference = preference; + } + + public void register() { + final ContentResolver cr = mContext.getContentResolver(); + cr.registerContentObserver(POWER_BUTTON_LONG_PRESS_SETTING_URI, false, this); + } + + public void unregister() { + final ContentResolver cr = mContext.getContentResolver(); + cr.unregisterContentObserver(this); + } + + @Override + public void onChange(boolean selfChange) { + updateState(mPreference); + } + } + +} diff --git a/src/com/android/settings/gestures/PowerMenuPreferenceController.java b/src/com/android/settings/gestures/PowerMenuPreferenceController.java index 6ef583b7037..b11ba65c43c 100644 --- a/src/com/android/settings/gestures/PowerMenuPreferenceController.java +++ b/src/com/android/settings/gestures/PowerMenuPreferenceController.java @@ -57,7 +57,8 @@ public class PowerMenuPreferenceController extends BasePreferenceController { @Override public int getAvailabilityStatus() { - return isCardsAvailable() || isControlsAvailable() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + return isCardsAvailable() || isControlsAvailable() || isAssistInvocationAvailable() + ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } private boolean isControlsAvailable() { @@ -68,4 +69,9 @@ public class PowerMenuPreferenceController extends BasePreferenceController { return Settings.Secure.getInt(mContext.getContentResolver(), CARDS_AVAILABLE_SETTING, 0) == 1; } + + private boolean isAssistInvocationAvailable() { + return mContext.getResources().getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable); + } } diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index 9105c10df66..00f9a0e6b63 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -138,7 +138,7 @@ public class FeatureFactoryImpl extends FeatureFactory { @Override public BatterySettingsFeatureProvider getBatterySettingsFeatureProvider(Context context) { if (mBatterySettingsFeatureProvider == null) { - mBatterySettingsFeatureProvider = new BatterySettingsFeatureProviderImpl(); + mBatterySettingsFeatureProvider = new BatterySettingsFeatureProviderImpl(context); } return mBatterySettingsFeatureProvider; } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java index b3b81969b8b..52f682cd8ab 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java @@ -105,7 +105,8 @@ public class BatterySaverControllerTest { Settings.Global.AUTOMATIC_POWER_SAVE_MODE, PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC); - assertThat(mBatterySaverController.getSummary()).isEqualTo("Based on your routine"); + assertThat(mBatterySaverController.getSummary()). + isEqualTo("Will turn on based on your routine"); } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceControllerTest.java index 435aa8874fc..b01e3b1f66c 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceControllerTest.java @@ -63,31 +63,20 @@ public class BatteryManagerPreferenceControllerTest { } @Test - public void updateState_smartBatteryOnWithRestrictApps_showSummary() { - mController.updateSummary(mPreference, true /* smartBatteryOn */, 2); + public void updateState_smartBatteryWithRestrictApps_showSummary() { + mController.updateSummary(mPreference, 2); assertThat(mPreference.getSummary()).isEqualTo("2 apps restricted"); } @Test - public void updateState_smartBatteryOnWithoutRestriction_showSummary() { + public void updateState_smartBatteryWithoutRestriction_showSummary() { when(mFeatureFactory.powerUsageFeatureProvider.isSmartBatterySupported()).thenReturn(true); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON); mController.updateState(mPreference); - assertThat(mPreference.getSummary()).isEqualTo("On / Detecting when apps drain battery"); - } - - @Test - public void updateState_smartBatteryOff_showSummary() { - when(mFeatureFactory.powerUsageFeatureProvider.isSmartBatterySupported()).thenReturn(true); - Settings.Global.putInt(mContext.getContentResolver(), - Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, OFF); - - mController.updateState(mPreference); - - assertThat(mPreference.getSummary()).isEqualTo("Off"); + assertThat(mPreference.getSummary()).isEqualTo("Detecting when apps drain battery"); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetectorTest.java index 0fd3ccfa03c..5794b6c0b89 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetectorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/detectors/SummaryDetectorTest.java @@ -54,9 +54,9 @@ public class SummaryDetectorTest { } @Test - public void testDetect_notDisabled_tipVisible() { + public void testDetect_notDisabled_tipInvisible() { SummaryDetector detector = new SummaryDetector(mPolicy, AVERAGE_TIME_MS); - assertThat(detector.detect().isVisible()).isTrue(); + assertThat(detector.detect().isVisible()).isFalse(); } } diff --git a/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java new file mode 100644 index 00000000000..de58c994fb4 --- /dev/null +++ b/tests/robotests/src/com/android/settings/gestures/LongPressPowerButtonPreferenceControllerTest.java @@ -0,0 +1,129 @@ +/* + * 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.gestures; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.app.Application; +import android.content.res.Resources; +import android.provider.Settings; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class LongPressPowerButtonPreferenceControllerTest { + + private static final String KEY_LONG_PRESS_POWER_BUTTON = + "gesture_power_menu_long_press_for_assist"; + + private Application mContext; + private Resources mResources; + private LongPressPowerButtonPreferenceController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = spy(RuntimeEnvironment.application); + mResources = mock(Resources.class); + when(mContext.getResources()).thenReturn(mResources); + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(true); + mController = new LongPressPowerButtonPreferenceController(mContext, + KEY_LONG_PRESS_POWER_BUTTON); + } + + @Test + public void isAvailable_configIsTrue_shouldReturnTrue() { + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(true); + + assertThat(mController.isAvailable()).isTrue(); + } + + @Test + public void isAvailable_configIsFalse_shouldReturnFalse() { + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(false); + + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void preferenceChecked_longPressPowerSettingSetToAssistant() { + mController.onPreferenceChange(null, true); + + assertThat(Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo( + LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_ASSISTANT_VALUE); + } + + @Test + public void preferenceUnchecked_longPressPowerSettingSetToDefaultValue() { + // Value out of range chosen deliberately. + when(mResources.getInteger( + com.android.internal.R.integer.config_longPressOnPowerBehavior)) + .thenReturn(8); + + mController.onPreferenceChange(null, false); + assertThat(Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo(8); + } + + @Test + public void preferenceUnchecked_assistDefault_setShutOff() { + // Value out of range chosen deliberately. + when(mResources.getInteger( + com.android.internal.R.integer.config_longPressOnPowerBehavior)) + .thenReturn( + LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_ASSISTANT_VALUE); + + mController.onPreferenceChange(null, false); + assertThat(Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo( + LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_SHUT_OFF); + } + + @Test + public void preferenceUnchecked_assistDefaultGlobalActionsEnabled_setGlobalActions() { + // Value out of range chosen deliberately. + when(mResources.getInteger( + com.android.internal.R.integer.config_longPressOnPowerBehavior)) + .thenReturn( + LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_ASSISTANT_VALUE); + Settings.Secure.putInt(mContext.getContentResolver(), + LongPressPowerButtonPreferenceController.CARDS_AVAILABLE_KEY, 1); + Settings.Secure.putInt(mContext.getContentResolver(), + LongPressPowerButtonPreferenceController.CARDS_ENABLED_KEY, 1); + + mController.onPreferenceChange(null, false); + assertThat(Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.POWER_BUTTON_LONG_PRESS, -1)).isEqualTo( + LongPressPowerButtonPreferenceController.LONG_PRESS_POWER_GLOBAL_ACTIONS); + } +} diff --git a/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java index 570a68040f7..f8d81f24bc9 100644 --- a/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/gestures/PowerMenuPreferenceControllerTest.java @@ -18,8 +18,13 @@ package com.android.settings.gestures; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + import android.content.Context; import android.content.pm.PackageManager; +import android.content.res.Resources; import android.provider.Settings; import com.android.settings.core.BasePreferenceController; @@ -35,6 +40,7 @@ import org.robolectric.shadows.ShadowPackageManager; @RunWith(RobolectricTestRunner.class) public class PowerMenuPreferenceControllerTest { private Context mContext; + private Resources mResources; private PowerMenuPreferenceController mController; private ShadowPackageManager mShadowPackageManager; @@ -44,17 +50,26 @@ public class PowerMenuPreferenceControllerTest { private static final String CARDS_ENABLED = Settings.Secure.GLOBAL_ACTIONS_PANEL_ENABLED; private static final String CARDS_AVAILABLE = Settings.Secure.GLOBAL_ACTIONS_PANEL_AVAILABLE; + @Before public void setUp() { - mContext = RuntimeEnvironment.application; + mContext = spy(RuntimeEnvironment.application); + mResources = mock(Resources.class); + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(true); + when(mContext.getResources()).thenReturn(mResources); mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager()); mController = new PowerMenuPreferenceController(mContext, KEY_GESTURE_POWER_MENU); } @Test - public void getAvailabilityStatus_bothAvailable_available() { + public void getAvailabilityStatus_allAvailable_available() { Settings.Secure.putInt(mContext.getContentResolver(), CARDS_AVAILABLE, 1); mShadowPackageManager.setSystemFeature(CONTROLS_FEATURE, true); + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(true); assertThat(mController.getAvailabilityStatus()).isEqualTo( BasePreferenceController.AVAILABLE); @@ -64,6 +79,9 @@ public class PowerMenuPreferenceControllerTest { public void getAvailabilityStatus_onlyCardsAvailable_available() { Settings.Secure.putInt(mContext.getContentResolver(), CARDS_AVAILABLE, 1); mShadowPackageManager.setSystemFeature(CONTROLS_FEATURE, false); + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(false); assertThat(mController.getAvailabilityStatus()).isEqualTo( BasePreferenceController.AVAILABLE); @@ -73,15 +91,69 @@ public class PowerMenuPreferenceControllerTest { public void getAvailabilityStatus_onlyControlsAvailable_available() { Settings.Secure.putInt(mContext.getContentResolver(), CARDS_AVAILABLE, 0); mShadowPackageManager.setSystemFeature(CONTROLS_FEATURE, true); + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(false); assertThat(mController.getAvailabilityStatus()).isEqualTo( BasePreferenceController.AVAILABLE); } @Test - public void getAvailabilityStatus_bothUnavailable_unavailable() { + public void getAvailabilityStatus_controlsAndCardsAvailable_available() { + Settings.Secure.putInt(mContext.getContentResolver(), CARDS_AVAILABLE, 1); + mShadowPackageManager.setSystemFeature(CONTROLS_FEATURE, true); + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(false); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.AVAILABLE); + } + + @Test + public void getAvailabilityStatus_controlsAndAssistAvailable_available() { + Settings.Secure.putInt(mContext.getContentResolver(), CARDS_AVAILABLE, 0); + mShadowPackageManager.setSystemFeature(CONTROLS_FEATURE, true); + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(true); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.AVAILABLE); + } + + @Test + public void getAvailabilityStatus_cardsAndAssistAvailable_available() { + Settings.Secure.putInt(mContext.getContentResolver(), CARDS_AVAILABLE, 1); + mShadowPackageManager.setSystemFeature(CONTROLS_FEATURE, false); + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(true); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.AVAILABLE); + } + + @Test + public void getAvailabilityStatus_onlyAssistAvailable_available() { Settings.Secure.putInt(mContext.getContentResolver(), CARDS_AVAILABLE, 0); mShadowPackageManager.setSystemFeature(CONTROLS_FEATURE, false); + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(true); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.AVAILABLE); + } + + @Test + public void getAvailabilityStatus_allUnavailable_unavailable() { + Settings.Secure.putInt(mContext.getContentResolver(), CARDS_AVAILABLE, 0); + mShadowPackageManager.setSystemFeature(CONTROLS_FEATURE, false); + when(mResources.getBoolean( + com.android.internal.R.bool.config_longPressOnPowerForAssistantSettingAvailable)) + .thenReturn(true); assertThat(mController.getAvailabilityStatus()).isEqualTo( BasePreferenceController.CONDITIONALLY_UNAVAILABLE);