Snap for 7852542 from f24702f643 to sc-v2-release

Change-Id: I2dc1f8e758dae24d89be38918b646fb5c6b5025a
This commit is contained in:
Android Build Coastguard Worker
2021-10-25 23:08:16 +00:00
18 changed files with 244 additions and 153 deletions

View File

@@ -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>

View File

@@ -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"

View File

@@ -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>

View File

@@ -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 -->

View File

@@ -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();
}
} }

View File

@@ -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;
} }

View File

@@ -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);
} }
} }

View File

@@ -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

View File

@@ -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);
} }
} }

View File

@@ -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;
} }
} }
} }

View File

@@ -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);

View File

@@ -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;
} }

View File

@@ -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 {

View File

@@ -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);
} }
} }

View File

@@ -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 */,

View File

@@ -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) {
}
}
} }

View File

@@ -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);

View File

@@ -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) {
}
}
}