Snap for 7852542 from f24702f643
to sc-v2-release
Change-Id: I2dc1f8e758dae24d89be38918b646fb5c6b5025a
This commit is contained in:
@@ -32,7 +32,10 @@
|
|||||||
settings:fastScrollHorizontalTrackDrawable="@drawable/line_drawable"
|
settings:fastScrollHorizontalTrackDrawable="@drawable/line_drawable"
|
||||||
settings:fastScrollVerticalThumbDrawable="@drawable/thumb_drawable"
|
settings:fastScrollVerticalThumbDrawable="@drawable/thumb_drawable"
|
||||||
settings:fastScrollVerticalTrackDrawable="@drawable/line_drawable"
|
settings:fastScrollVerticalTrackDrawable="@drawable/line_drawable"
|
||||||
settings:layout_constraintTop_toBottomOf="@id/pinned_header"/>
|
settings:layout_constrainedHeight="true"
|
||||||
|
settings:layout_constraintVertical_bias="0.0"
|
||||||
|
settings:layout_constraintTop_toBottomOf="@id/pinned_header"
|
||||||
|
settings:layout_constraintBottom_toBottomOf="parent"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@android:id/empty"
|
android:id="@android:id/empty"
|
||||||
@@ -55,7 +58,10 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:background="?android:colorBackground"
|
android:background="?android:colorBackground"
|
||||||
settings:layout_constraintTop_toTopOf="parent"/>
|
settings:layout_constraintVertical_chainStyle="packed"
|
||||||
|
settings:layout_constraintVertical_bias="0.0"
|
||||||
|
settings:layout_constraintTop_toTopOf="parent"
|
||||||
|
settings:layout_constraintBottom_toTopOf="@id/apps_list"/>
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
@@ -26,9 +26,7 @@
|
|||||||
android:paddingRight="?android:attr/listPreferredItemPaddingRight"
|
android:paddingRight="?android:attr/listPreferredItemPaddingRight"
|
||||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
|
||||||
android:background="?android:attr/selectableItemBackground"
|
android:background="?android:attr/selectableItemBackground"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal">
|
||||||
android:clipToPadding="false"
|
|
||||||
android:baselineAligned="false">
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/expand_title"
|
android:id="@+id/expand_title"
|
||||||
|
@@ -13600,8 +13600,10 @@
|
|||||||
<string name="camera_toggle_title">Camera access</string>
|
<string name="camera_toggle_title">Camera access</string>
|
||||||
<!-- Label for the camera use toggle [CHAR LIMIT=40] -->
|
<!-- Label for the camera use toggle [CHAR LIMIT=40] -->
|
||||||
<string name="mic_toggle_title">Microphone access</string>
|
<string name="mic_toggle_title">Microphone access</string>
|
||||||
<!-- Describes what is affected by the camera or mic toggle [CHAR LIMIT=NONE] -->
|
<!-- Describes what is affected by the camera toggle [CHAR LIMIT=NONE] -->
|
||||||
<string name="sensor_toggle_description">For all apps and services</string>
|
<string name="cam_toggle_description">For apps and services</string>
|
||||||
|
<!-- Describes what is affected by the mic toggle [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="mic_toggle_description">For apps and services. If this setting is off, microphone data may still be shared when you call an emergency number.</string>
|
||||||
|
|
||||||
<!-- Title for Game settings entry. [CHAR_LIMIT=NONE] -->
|
<!-- Title for Game settings entry. [CHAR_LIMIT=NONE] -->
|
||||||
<string name="game_settings_title">Game settings</string>
|
<string name="game_settings_title">Game settings</string>
|
||||||
|
@@ -67,14 +67,14 @@
|
|||||||
<com.android.settingslib.RestrictedSwitchPreference
|
<com.android.settingslib.RestrictedSwitchPreference
|
||||||
android:key="privacy_camera_toggle"
|
android:key="privacy_camera_toggle"
|
||||||
android:title="@string/camera_toggle_title"
|
android:title="@string/camera_toggle_title"
|
||||||
android:summary="@string/sensor_toggle_description"
|
android:summary="@string/cam_toggle_description"
|
||||||
settings:controller="com.android.settings.privacy.CameraToggleController"/>
|
settings:controller="com.android.settings.privacy.CameraToggleController"/>
|
||||||
|
|
||||||
<!-- Microphone toggle -->
|
<!-- Microphone toggle -->
|
||||||
<com.android.settingslib.RestrictedSwitchPreference
|
<com.android.settingslib.RestrictedSwitchPreference
|
||||||
android:key="privacy_mic_toggle"
|
android:key="privacy_mic_toggle"
|
||||||
android:title="@string/mic_toggle_title"
|
android:title="@string/mic_toggle_title"
|
||||||
android:summary="@string/sensor_toggle_description"
|
android:summary="@string/mic_toggle_description"
|
||||||
settings:controller="com.android.settings.privacy.MicToggleController"/>
|
settings:controller="com.android.settings.privacy.MicToggleController"/>
|
||||||
|
|
||||||
<!-- Show passwords -->
|
<!-- Show passwords -->
|
||||||
|
@@ -16,13 +16,18 @@
|
|||||||
|
|
||||||
package com.android.settings;
|
package com.android.settings;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
|
|
||||||
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
|
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
/** Settings application which sets up activity embedding rules for the large screen device. */
|
/** Settings application which sets up activity embedding rules for the large screen device. */
|
||||||
public class SettingsApplication extends Application {
|
public class SettingsApplication extends Application {
|
||||||
|
|
||||||
|
private WeakReference<Activity> mHomeActivity = new WeakReference<>(null);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
@@ -31,4 +36,12 @@ public class SettingsApplication extends Application {
|
|||||||
new ActivityEmbeddingRulesController(this);
|
new ActivityEmbeddingRulesController(this);
|
||||||
controller.initRules();
|
controller.initRules();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setHomeActivity(Activity homeActivity) {
|
||||||
|
mHomeActivity = new WeakReference<>(homeActivity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Activity getHomeActivity() {
|
||||||
|
return mHomeActivity.get();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.settings.activityembedding;
|
package com.android.settings.activityembedding;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.content.ContentProvider;
|
import android.content.ContentProvider;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
@@ -23,13 +24,17 @@ import android.net.Uri;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import com.android.settings.SettingsApplication;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A content provider for querying the state of activity embedding feature
|
* A content provider for querying the state of activity embedding feature
|
||||||
*/
|
*/
|
||||||
public class ActivityEmbeddingProvider extends ContentProvider {
|
public class ActivityEmbeddingProvider extends ContentProvider {
|
||||||
|
|
||||||
private static final String METHOD_IS_EMBEDDING_ACTIVITY_ENABLED = "isEmbeddingActivityEnabled";
|
private static final String METHOD_IS_EMBEDDING_ACTIVITY_ENABLED = "isEmbeddingActivityEnabled";
|
||||||
|
private static final String METHOD_IS_IN_SETTINGS_TWO_PANE = "isInSettingsTwoPane";
|
||||||
private static final String EXTRA_ENABLED_STATE = "enabled_state";
|
private static final String EXTRA_ENABLED_STATE = "enabled_state";
|
||||||
|
private static final String EXTRA_TWO_PANE_STATE = "two_pane_state";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCreate() {
|
public boolean onCreate() {
|
||||||
@@ -43,6 +48,14 @@ public class ActivityEmbeddingProvider extends ContentProvider {
|
|||||||
bundle.putBoolean(EXTRA_ENABLED_STATE,
|
bundle.putBoolean(EXTRA_ENABLED_STATE,
|
||||||
ActivityEmbeddingUtils.isEmbeddingActivityEnabled(getContext()));
|
ActivityEmbeddingUtils.isEmbeddingActivityEnabled(getContext()));
|
||||||
return bundle;
|
return bundle;
|
||||||
|
} else if (TextUtils.equals(method, METHOD_IS_IN_SETTINGS_TWO_PANE)) {
|
||||||
|
final Activity homeActivity =
|
||||||
|
((SettingsApplication) getContext().getApplicationContext()).getHomeActivity();
|
||||||
|
final Bundle bundle = new Bundle();
|
||||||
|
bundle.putBoolean(EXTRA_TWO_PANE_STATE,
|
||||||
|
homeActivity == null ? false
|
||||||
|
: ActivityEmbeddingUtils.isTwoPaneResolution(homeActivity));
|
||||||
|
return bundle;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,10 @@
|
|||||||
|
|
||||||
package com.android.settings.activityembedding;
|
package com.android.settings.activityembedding;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.ActivityTaskManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.Rect;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.FeatureFlagUtils;
|
import android.util.FeatureFlagUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -64,10 +67,11 @@ public class ActivityEmbeddingUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Whether the screen meets two-pane resolution. */
|
/** Whether the screen meets two-pane resolution. */
|
||||||
public static boolean isTwoPaneResolution(Context context) {
|
public static boolean isTwoPaneResolution(Activity activity) {
|
||||||
final Context appContext = context.getApplicationContext();
|
final Rect currentTaskBounds =
|
||||||
final DisplayMetrics dm = appContext.getResources().getDisplayMetrics();
|
ActivityTaskManager.getInstance().getTaskBounds(activity.getTaskId());
|
||||||
return dm.widthPixels >= getMinCurrentScreenSplitWidthPx(appContext)
|
|
||||||
&& dm.heightPixels >= getMinSmallestScreenSplitWidthPx(appContext);
|
return currentTaskBounds.width() >= getMinCurrentScreenSplitWidthPx(activity)
|
||||||
|
&& currentTaskBounds.height() >= getMinSmallestScreenSplitWidthPx(activity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -15,17 +15,14 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.settings.fuelgauge;
|
package com.android.settings.fuelgauge;
|
||||||
|
|
||||||
import android.app.settings.SettingsEnums;
|
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.os.AsyncTask;
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.provider.Settings.Global;
|
import android.provider.Settings.Global;
|
||||||
import android.util.Pair;
|
|
||||||
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceScreen;
|
import androidx.preference.PreferenceScreen;
|
||||||
@@ -33,8 +30,6 @@ import androidx.preference.PreferenceScreen;
|
|||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
|
||||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||||
import com.android.settingslib.core.lifecycle.events.OnStart;
|
import com.android.settingslib.core.lifecycle.events.OnStart;
|
||||||
import com.android.settingslib.core.lifecycle.events.OnStop;
|
import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||||
@@ -49,7 +44,6 @@ public class BatterySaverController extends BasePreferenceController
|
|||||||
private final BatterySaverReceiver mBatteryStateChangeReceiver;
|
private final BatterySaverReceiver mBatteryStateChangeReceiver;
|
||||||
private final PowerManager mPowerManager;
|
private final PowerManager mPowerManager;
|
||||||
private Preference mBatterySaverPref;
|
private Preference mBatterySaverPref;
|
||||||
private final MetricsFeatureProvider mMetricsFeatureProvider;
|
|
||||||
private final ContentObserver mObserver = new ContentObserver(
|
private final ContentObserver mObserver = new ContentObserver(
|
||||||
new Handler(Looper.getMainLooper())) {
|
new Handler(Looper.getMainLooper())) {
|
||||||
@Override
|
@Override
|
||||||
@@ -62,7 +56,6 @@ public class BatterySaverController extends BasePreferenceController
|
|||||||
super(context, KEY_BATTERY_SAVER);
|
super(context, KEY_BATTERY_SAVER);
|
||||||
|
|
||||||
mPowerManager = mContext.getSystemService(PowerManager.class);
|
mPowerManager = mContext.getSystemService(PowerManager.class);
|
||||||
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
|
|
||||||
mBatteryStateChangeReceiver = new BatterySaverReceiver(context);
|
mBatteryStateChangeReceiver = new BatterySaverReceiver(context);
|
||||||
mBatteryStateChangeReceiver.setBatterySaverListener(this);
|
mBatteryStateChangeReceiver.setBatterySaverListener(this);
|
||||||
BatterySaverUtils.revertScheduleToNoneIfNeeded(context);
|
BatterySaverUtils.revertScheduleToNoneIfNeeded(context);
|
||||||
@@ -128,41 +121,9 @@ public class BatterySaverController extends BasePreferenceController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void logPowerSaver() {
|
|
||||||
if (!mPowerManager.isPowerSaveMode()) {
|
|
||||||
// Power saver is off, so don't do anything.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final ContentResolver resolver = mContext.getContentResolver();
|
|
||||||
final int mode = Global.getInt(resolver, Global.AUTOMATIC_POWER_SAVE_MODE,
|
|
||||||
PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
|
|
||||||
int fuelgaugeScheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE;
|
|
||||||
int powerLevelTriggerPercentage = -1;
|
|
||||||
switch (mode) {
|
|
||||||
case PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE:
|
|
||||||
fuelgaugeScheduleType =
|
|
||||||
SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE;
|
|
||||||
powerLevelTriggerPercentage = Global.getInt(resolver,
|
|
||||||
Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
|
|
||||||
break;
|
|
||||||
case PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC:
|
|
||||||
fuelgaugeScheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// empty
|
|
||||||
}
|
|
||||||
mMetricsFeatureProvider.action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
|
|
||||||
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
|
|
||||||
fuelgaugeScheduleType),
|
|
||||||
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
|
|
||||||
powerLevelTriggerPercentage));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPowerSaveModeChanged() {
|
public void onPowerSaveModeChanged() {
|
||||||
updateSummary();
|
updateSummary();
|
||||||
AsyncTask.execute(() -> logPowerSaver());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -65,8 +65,7 @@ public class ExpandDividerPreference extends Preference {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick() {
|
public void onClick() {
|
||||||
mIsExpanded = !mIsExpanded;
|
setIsExpanded(!mIsExpanded);
|
||||||
refreshState();
|
|
||||||
if (mOnExpandListener != null) {
|
if (mOnExpandListener != null) {
|
||||||
mOnExpandListener.onExpand(mIsExpanded);
|
mOnExpandListener.onExpand(mIsExpanded);
|
||||||
}
|
}
|
||||||
@@ -74,10 +73,7 @@ public class ExpandDividerPreference extends Preference {
|
|||||||
|
|
||||||
void setTitle(final String titleContent) {
|
void setTitle(final String titleContent) {
|
||||||
mTitleContent = titleContent;
|
mTitleContent = titleContent;
|
||||||
if (mTextView != null) {
|
refreshState();
|
||||||
mTextView.postDelayed(
|
|
||||||
() -> mTextView.setText(titleContent), 50);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setIsExpanded(boolean isExpanded) {
|
void setIsExpanded(boolean isExpanded) {
|
||||||
@@ -90,13 +86,13 @@ public class ExpandDividerPreference extends Preference {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void refreshState() {
|
private void refreshState() {
|
||||||
final int iconId =
|
|
||||||
mIsExpanded
|
|
||||||
? R.drawable.ic_settings_expand_less
|
|
||||||
: R.drawable.ic_settings_expand_more;
|
|
||||||
if (mImageView != null) {
|
if (mImageView != null) {
|
||||||
mImageView.setImageResource(iconId);
|
mImageView.setImageResource(mIsExpanded
|
||||||
|
? R.drawable.ic_settings_expand_less
|
||||||
|
: R.drawable.ic_settings_expand_more);
|
||||||
|
}
|
||||||
|
if (mTextView != null) {
|
||||||
|
mTextView.setText(mTitleContent);
|
||||||
}
|
}
|
||||||
setTitle(mTitleContent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,17 +16,20 @@
|
|||||||
|
|
||||||
package com.android.settings.fuelgauge.batterysaver;
|
package com.android.settings.fuelgauge.batterysaver;
|
||||||
|
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.drawable.ColorDrawable;
|
import android.graphics.drawable.ColorDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@@ -34,6 +37,7 @@ import androidx.annotation.VisibleForTesting;
|
|||||||
import androidx.preference.PreferenceScreen;
|
import androidx.preference.PreferenceScreen;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settings.widget.RadioButtonPickerFragment;
|
import com.android.settings.widget.RadioButtonPickerFragment;
|
||||||
import com.android.settingslib.fuelgauge.BatterySaverUtils;
|
import com.android.settingslib.fuelgauge.BatterySaverUtils;
|
||||||
import com.android.settingslib.widget.CandidateInfo;
|
import com.android.settingslib.widget.CandidateInfo;
|
||||||
@@ -58,6 +62,8 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
|
|||||||
public BatterySaverScheduleRadioButtonsController mRadioButtonController;
|
public BatterySaverScheduleRadioButtonsController mRadioButtonController;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
Context mContext;
|
Context mContext;
|
||||||
|
private int mSaverPercentage;
|
||||||
|
private String mSaverScheduleKey;
|
||||||
private BatterySaverScheduleSeekBarController mSeekBarController;
|
private BatterySaverScheduleSeekBarController mSeekBarController;
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -90,6 +96,8 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
|
|||||||
Settings.Secure.getUriFor(Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED),
|
Settings.Secure.getUriFor(Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED),
|
||||||
false,
|
false,
|
||||||
mSettingsObserver);
|
mSettingsObserver);
|
||||||
|
mSaverScheduleKey = mRadioButtonController.getDefaultKey();
|
||||||
|
mSaverPercentage = getSaverPercentage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -107,6 +115,7 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
|
|||||||
@Override
|
@Override
|
||||||
public void onPause() {
|
public void onPause() {
|
||||||
mContext.getContentResolver().unregisterContentObserver(mSettingsObserver);
|
mContext.getContentResolver().unregisterContentObserver(mSettingsObserver);
|
||||||
|
AsyncTask.execute(() -> logPowerSaver());
|
||||||
super.onPause();
|
super.onPause();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,6 +183,43 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void logPowerSaver() {
|
||||||
|
int currentSaverPercentage = getSaverPercentage();
|
||||||
|
String currentSaverScheduleKey = mRadioButtonController.getDefaultKey();
|
||||||
|
if (mSaverScheduleKey.equals(currentSaverScheduleKey)
|
||||||
|
&& mSaverPercentage == currentSaverPercentage) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int scheduleType = -1;
|
||||||
|
int schedulePercentage = -1;
|
||||||
|
switch (currentSaverScheduleKey) {
|
||||||
|
case BatterySaverScheduleRadioButtonsController.KEY_NO_SCHEDULE:
|
||||||
|
scheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE;
|
||||||
|
break;
|
||||||
|
case BatterySaverScheduleRadioButtonsController.KEY_ROUTINE:
|
||||||
|
scheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE;
|
||||||
|
break;
|
||||||
|
case BatterySaverScheduleRadioButtonsController.KEY_PERCENTAGE:
|
||||||
|
scheduleType = SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE;
|
||||||
|
schedulePercentage = currentSaverPercentage;
|
||||||
|
break;
|
||||||
|
// Unknown schedule type.
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
FeatureFactory.getFactory(mContext).getMetricsFeatureProvider()
|
||||||
|
.action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
|
||||||
|
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
|
||||||
|
scheduleType),
|
||||||
|
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
|
||||||
|
schedulePercentage));
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getSaverPercentage() {
|
||||||
|
return Settings.Global.getInt(mContext.getContentResolver(),
|
||||||
|
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1);
|
||||||
|
}
|
||||||
|
|
||||||
static class BatterySaverScheduleCandidateInfo extends CandidateInfo {
|
static class BatterySaverScheduleCandidateInfo extends CandidateInfo {
|
||||||
|
|
||||||
private final CharSequence mLabel;
|
private final CharSequence mLabel;
|
||||||
@@ -207,4 +253,4 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment {
|
|||||||
return mSummary;
|
return mSummary;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -42,6 +42,7 @@ import androidx.fragment.app.FragmentTransaction;
|
|||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Settings;
|
import com.android.settings.Settings;
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
|
import com.android.settings.SettingsApplication;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.accounts.AvatarViewMixin;
|
import com.android.settings.accounts.AvatarViewMixin;
|
||||||
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
|
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
|
||||||
@@ -95,6 +96,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements
|
|||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
((SettingsApplication) getApplication()).setHomeActivity(this);
|
||||||
setContentView(R.layout.settings_homepage_container);
|
setContentView(R.layout.settings_homepage_container);
|
||||||
|
|
||||||
final View appBar = findViewById(R.id.app_bar_container);
|
final View appBar = findViewById(R.id.app_bar_container);
|
||||||
|
@@ -196,8 +196,8 @@ public class TopLevelSettings extends DashboardFragment implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
Log.d(TAG, "onCreateAdapter, pref key: " + mHighlightedPreferenceKey);
|
Log.d(TAG, "onCreateAdapter, pref key: " + mHighlightedPreferenceKey);
|
||||||
mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter(preferenceScreen,
|
mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter(
|
||||||
getListView(), mHighlightedPreferenceKey);
|
getActivity(), preferenceScreen, getListView(), mHighlightedPreferenceKey);
|
||||||
return mTopLevelAdapter;
|
return mTopLevelAdapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1256,7 +1256,8 @@ public class ApnEditor extends SettingsPreferenceFragment
|
|||||||
if (!readOnlyApnTypes.contains(apnType)
|
if (!readOnlyApnTypes.contains(apnType)
|
||||||
&& !apnType.equals(APN_TYPE_IA)
|
&& !apnType.equals(APN_TYPE_IA)
|
||||||
&& !apnType.equals(APN_TYPE_EMERGENCY)
|
&& !apnType.equals(APN_TYPE_EMERGENCY)
|
||||||
&& !apnType.equals(APN_TYPE_MCX)) {
|
&& !apnType.equals(APN_TYPE_MCX)
|
||||||
|
&& !apnType.equals(APN_TYPE_IMS)) {
|
||||||
if (first) {
|
if (first) {
|
||||||
first = false;
|
first = false;
|
||||||
} else {
|
} else {
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.settings.widget;
|
package com.android.settings.widget;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
@@ -53,6 +54,7 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
|
|||||||
final int mIconColorHighlight;
|
final int mIconColorHighlight;
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
|
private final Activity mActivity;
|
||||||
private final RecyclerView mRecyclerView;
|
private final RecyclerView mRecyclerView;
|
||||||
private final int mNormalBackgroundRes;
|
private final int mNormalBackgroundRes;
|
||||||
private String mHighlightKey;
|
private String mHighlightKey;
|
||||||
@@ -61,12 +63,13 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
|
|||||||
private boolean mHighlightNeeded;
|
private boolean mHighlightNeeded;
|
||||||
private boolean mScrolled;
|
private boolean mScrolled;
|
||||||
|
|
||||||
public HighlightableTopLevelPreferenceAdapter(PreferenceGroup preferenceGroup,
|
public HighlightableTopLevelPreferenceAdapter(Activity activity,
|
||||||
RecyclerView recyclerView, String key) {
|
PreferenceGroup preferenceGroup, RecyclerView recyclerView, String key) {
|
||||||
super(preferenceGroup);
|
super(preferenceGroup);
|
||||||
mRecyclerView = recyclerView;
|
mRecyclerView = recyclerView;
|
||||||
mHighlightKey = key;
|
mHighlightKey = key;
|
||||||
mContext = preferenceGroup.getContext();
|
mContext = preferenceGroup.getContext();
|
||||||
|
mActivity = activity;
|
||||||
final TypedValue outValue = new TypedValue();
|
final TypedValue outValue = new TypedValue();
|
||||||
mContext.getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
|
mContext.getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
|
||||||
outValue, true /* resolveRefs */);
|
outValue, true /* resolveRefs */);
|
||||||
@@ -233,6 +236,6 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isHighlightNeeded() {
|
private boolean isHighlightNeeded() {
|
||||||
return ActivityEmbeddingUtils.isTwoPaneResolution(mContext);
|
return ActivityEmbeddingUtils.isTwoPaneResolution(mActivity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -55,6 +55,7 @@ import com.android.settingslib.development.DevelopmentSettingsEnabler;
|
|||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
@@ -208,6 +209,7 @@ public class MainClearTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore
|
||||||
public void testShowWipeEuicc_euiccEnabled_unprovisioned() {
|
public void testShowWipeEuicc_euiccEnabled_unprovisioned() {
|
||||||
prepareEuiccState(
|
prepareEuiccState(
|
||||||
true /* isEuiccEnabled */,
|
true /* isEuiccEnabled */,
|
||||||
@@ -226,6 +228,7 @@ public class MainClearTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@Ignore
|
||||||
public void testShowWipeEuicc_developerMode_unprovisioned() {
|
public void testShowWipeEuicc_developerMode_unprovisioned() {
|
||||||
prepareEuiccState(
|
prepareEuiccState(
|
||||||
true /* isEuiccEnabled */,
|
true /* isEuiccEnabled */,
|
||||||
|
@@ -29,9 +29,6 @@ import android.util.Pair;
|
|||||||
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
|
|
||||||
import com.android.settings.testutils.FakeFeatureFactory;
|
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@@ -51,16 +48,12 @@ public class BatterySaverControllerTest {
|
|||||||
|
|
||||||
private BatterySaverController mBatterySaverController;
|
private BatterySaverController mBatterySaverController;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private FakeFeatureFactory mFeatureFactory;
|
|
||||||
private MetricsFeatureProvider mMetricsFeatureProvider;
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = RuntimeEnvironment.application;
|
||||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
|
||||||
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
|
|
||||||
mBatterySaverController = spy(new BatterySaverController(mContext));
|
mBatterySaverController = spy(new BatterySaverController(mContext));
|
||||||
ReflectionHelpers.setField(mBatterySaverController, "mPowerManager", mPowerManager);
|
ReflectionHelpers.setField(mBatterySaverController, "mPowerManager", mPowerManager);
|
||||||
ReflectionHelpers.setField(mBatterySaverController, "mBatterySaverPref", mBatterySaverPref);
|
ReflectionHelpers.setField(mBatterySaverController, "mBatterySaverPref", mBatterySaverPref);
|
||||||
@@ -81,59 +74,6 @@ public class BatterySaverControllerTest {
|
|||||||
verify(mBatterySaverPref).setSummary("Off");
|
verify(mBatterySaverPref).setSummary("Off");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onPreferenceChange_onPowerSaveModeChanged_manualTrigger_logsType() {
|
|
||||||
when(mPowerManager.isPowerSaveMode()).thenReturn(true);
|
|
||||||
Settings.Global.putInt(mContext.getContentResolver(),
|
|
||||||
Settings.Global.AUTOMATIC_POWER_SAVE_MODE, -1);
|
|
||||||
|
|
||||||
mBatterySaverController.onPowerSaveModeChanged();
|
|
||||||
|
|
||||||
waitAWhile();
|
|
||||||
verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
|
|
||||||
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
|
|
||||||
SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE),
|
|
||||||
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
|
|
||||||
-1));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onPreferenceChange_onPowerSaveModeChanged_triggerPercent_logsTypeAndPercentage() {
|
|
||||||
when(mPowerManager.isPowerSaveMode()).thenReturn(true);
|
|
||||||
Settings.Global.putInt(mContext.getContentResolver(),
|
|
||||||
Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
|
|
||||||
PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
|
|
||||||
final int percentageVal = 15;
|
|
||||||
Settings.Global.putInt(mContext.getContentResolver(),
|
|
||||||
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, percentageVal);
|
|
||||||
|
|
||||||
mBatterySaverController.onPowerSaveModeChanged();
|
|
||||||
|
|
||||||
waitAWhile();
|
|
||||||
verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
|
|
||||||
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
|
|
||||||
SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE),
|
|
||||||
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
|
|
||||||
percentageVal));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void onPreferenceChange_onPowerSaveModeChanged_triggerDynamic_logsType() {
|
|
||||||
when(mPowerManager.isPowerSaveMode()).thenReturn(true);
|
|
||||||
Settings.Global.putInt(mContext.getContentResolver(),
|
|
||||||
Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
|
|
||||||
PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC);
|
|
||||||
|
|
||||||
mBatterySaverController.onPowerSaveModeChanged();
|
|
||||||
|
|
||||||
waitAWhile();
|
|
||||||
verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
|
|
||||||
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
|
|
||||||
SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE),
|
|
||||||
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
|
|
||||||
-1));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getSummary_batterySaverOn_showSummaryOn() {
|
public void getSummary_batterySaverOn_showSummaryOn() {
|
||||||
when(mPowerManager.isPowerSaveMode()).thenReturn(true);
|
when(mPowerManager.isPowerSaveMode()).thenReturn(true);
|
||||||
@@ -177,11 +117,4 @@ public class BatterySaverControllerTest {
|
|||||||
|
|
||||||
assertThat(mBatterySaverController.getSummary()).isEqualTo("Off");
|
assertThat(mBatterySaverController.getSummary()).isEqualTo("Off");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void waitAWhile() {
|
|
||||||
try {
|
|
||||||
Thread.sleep(200);
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -18,11 +18,7 @@ package com.android.settings.fuelgauge;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
|
||||||
import static org.mockito.Matchers.anyInt;
|
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.never;
|
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
@@ -36,8 +32,6 @@ import com.android.settings.R;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.ArgumentCaptor;
|
|
||||||
import org.mockito.MockitoAnnotations;
|
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
|
||||||
@@ -52,7 +46,6 @@ public final class ExpandDividerPreferenceTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
|
||||||
mContext = spy(RuntimeEnvironment.application);
|
mContext = spy(RuntimeEnvironment.application);
|
||||||
mImageView = spy(new ImageView(mContext));
|
mImageView = spy(new ImageView(mContext));
|
||||||
mTextView = spy(new TextView(mContext));
|
mTextView = spy(new TextView(mContext));
|
||||||
@@ -64,9 +57,9 @@ public final class ExpandDividerPreferenceTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testConstructor_returnExpectedResult() {
|
public void testConstructor_returnExpectedResult() {
|
||||||
assertThat(mExpandDividerPreference.getKey())
|
assertThat(mExpandDividerPreference.getKey())
|
||||||
.isEqualTo(ExpandDividerPreference.PREFERENCE_KEY);
|
.isEqualTo(ExpandDividerPreference.PREFERENCE_KEY);
|
||||||
assertThat(mExpandDividerPreference.getLayoutResource())
|
assertThat(mExpandDividerPreference.getLayoutResource())
|
||||||
.isEqualTo(R.layout.preference_expand_divider);
|
.isEqualTo(R.layout.preference_expand_divider);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -75,9 +68,7 @@ public final class ExpandDividerPreferenceTest {
|
|||||||
mExpandDividerPreference.mTextView = mTextView;
|
mExpandDividerPreference.mTextView = mTextView;
|
||||||
|
|
||||||
mExpandDividerPreference.setTitle(titleContent);
|
mExpandDividerPreference.setTitle(titleContent);
|
||||||
final ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class);
|
|
||||||
verify(mTextView).postDelayed(captor.capture(), eq(50L));
|
|
||||||
captor.getValue().run();
|
|
||||||
verify(mTextView).setText(titleContent);
|
verify(mTextView).setText(titleContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +77,7 @@ public final class ExpandDividerPreferenceTest {
|
|||||||
final boolean[] isExpandedArray = new boolean[] {false};
|
final boolean[] isExpandedArray = new boolean[] {false};
|
||||||
mExpandDividerPreference.mImageView = mImageView;
|
mExpandDividerPreference.mImageView = mImageView;
|
||||||
mExpandDividerPreference.setOnExpandListener(
|
mExpandDividerPreference.setOnExpandListener(
|
||||||
isExpanded -> isExpandedArray[0] = isExpanded);
|
isExpanded -> isExpandedArray[0] = isExpanded);
|
||||||
|
|
||||||
// Click the item first time from false -> true.
|
// Click the item first time from false -> true.
|
||||||
mExpandDividerPreference.onClick();
|
mExpandDividerPreference.onClick();
|
||||||
@@ -106,7 +97,7 @@ public final class ExpandDividerPreferenceTest {
|
|||||||
final boolean[] isExpandedArray = new boolean[] {false};
|
final boolean[] isExpandedArray = new boolean[] {false};
|
||||||
mExpandDividerPreference.mImageView = mImageView;
|
mExpandDividerPreference.mImageView = mImageView;
|
||||||
mExpandDividerPreference.setOnExpandListener(
|
mExpandDividerPreference.setOnExpandListener(
|
||||||
isExpanded -> isExpandedArray[0] = isExpanded);
|
isExpanded -> isExpandedArray[0] = isExpanded);
|
||||||
|
|
||||||
mExpandDividerPreference.setIsExpanded(true);
|
mExpandDividerPreference.setIsExpanded(true);
|
||||||
|
|
||||||
|
@@ -0,0 +1,119 @@
|
|||||||
|
package com.android.settings.fuelgauge.batterysaver;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||||
|
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.PowerManager;
|
||||||
|
import android.provider.Settings;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
|
||||||
|
@RunWith(RobolectricTestRunner.class)
|
||||||
|
public final class BatterySaverScheduleSettingsTest {
|
||||||
|
|
||||||
|
private Context mContext;
|
||||||
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
|
private MetricsFeatureProvider mMetricsFeatureProvider;
|
||||||
|
private BatterySaverScheduleSettings mBatterySaverScheduleSettings;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
mContext = spy(RuntimeEnvironment.application);
|
||||||
|
mBatterySaverScheduleSettings = new BatterySaverScheduleSettings();
|
||||||
|
mBatterySaverScheduleSettings.onAttach(mContext);
|
||||||
|
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||||
|
mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
|
||||||
|
|
||||||
|
setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE, 1);
|
||||||
|
mBatterySaverScheduleSettings.onResume();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onPause_withNoScheduleType_logExpectedData() {
|
||||||
|
setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE, 0);
|
||||||
|
|
||||||
|
mBatterySaverScheduleSettings.onPause();
|
||||||
|
|
||||||
|
verifySchedule(SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_NO_SCHEDULE,
|
||||||
|
/* schedulePercentage= */ -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onPause_withRoutineScheduleType_logExpectedData() {
|
||||||
|
setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC, 0);
|
||||||
|
|
||||||
|
mBatterySaverScheduleSettings.onPause();
|
||||||
|
|
||||||
|
verifySchedule(SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_ROUTINE,
|
||||||
|
/* schedulePercentage= */ -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onPause_withPercentageScheduleType_logExpectedData() {
|
||||||
|
int expectedPercentage = 10;
|
||||||
|
setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE, expectedPercentage);
|
||||||
|
|
||||||
|
mBatterySaverScheduleSettings.onPause();
|
||||||
|
|
||||||
|
verifySchedule(SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE,
|
||||||
|
expectedPercentage);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onPause_scheduleTypeAndPercentageAreNotChanged_notLogAnyData() {
|
||||||
|
mBatterySaverScheduleSettings.onResume();
|
||||||
|
mBatterySaverScheduleSettings.onPause();
|
||||||
|
|
||||||
|
waitAWhile();
|
||||||
|
verifyNoMoreInteractions(mMetricsFeatureProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onPause_multipleScheduleTypeChanges_logLastChangedData() {
|
||||||
|
int expectedPercentage = 10;
|
||||||
|
setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE, 0);
|
||||||
|
setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC, 0);
|
||||||
|
setSchedule(PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE, expectedPercentage);
|
||||||
|
|
||||||
|
mBatterySaverScheduleSettings.onPause();
|
||||||
|
|
||||||
|
verifySchedule(SettingsEnums.BATTERY_SAVER_SCHEDULE_TYPE_BASED_ON_PERCENTAGE,
|
||||||
|
expectedPercentage);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSchedule(int scheduleType, int schedulePercentage) {
|
||||||
|
Settings.Global.putInt(mContext.getContentResolver(),
|
||||||
|
Settings.Global.AUTOMATIC_POWER_SAVE_MODE, scheduleType);
|
||||||
|
Settings.Global.putInt(mContext.getContentResolver(),
|
||||||
|
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, schedulePercentage);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifySchedule(int scheduleType, int schedulePercentage) {
|
||||||
|
waitAWhile();
|
||||||
|
verify(mMetricsFeatureProvider).action(mContext, SettingsEnums.FUELGAUGE_BATTERY_SAVER,
|
||||||
|
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_SCHEDULE_TYPE,
|
||||||
|
scheduleType),
|
||||||
|
Pair.create(SettingsEnums.FIELD_BATTERY_SAVER_PERCENTAGE_VALUE,
|
||||||
|
schedulePercentage));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void waitAWhile() {
|
||||||
|
try {
|
||||||
|
Thread.sleep(200);
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user