diff --git a/res/layout/manage_applications_apps.xml b/res/layout/manage_applications_apps.xml index f8f4a76b11a..a9cd72a132a 100644 --- a/res/layout/manage_applications_apps.xml +++ b/res/layout/manage_applications_apps.xml @@ -32,7 +32,10 @@ settings:fastScrollHorizontalTrackDrawable="@drawable/line_drawable" settings:fastScrollVerticalThumbDrawable="@drawable/thumb_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"/> + settings:layout_constraintVertical_chainStyle="packed" + settings:layout_constraintVertical_bias="0.0" + settings:layout_constraintTop_toTopOf="parent" + settings:layout_constraintBottom_toTopOf="@id/apps_list"/> diff --git a/res/layout/preference_expand_divider.xml b/res/layout/preference_expand_divider.xml index 164419a8c51..ce3d2e76f26 100644 --- a/res/layout/preference_expand_divider.xml +++ b/res/layout/preference_expand_divider.xml @@ -26,9 +26,7 @@ android:paddingRight="?android:attr/listPreferredItemPaddingRight" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:background="?android:attr/selectableItemBackground" - android:orientation="horizontal" - android:clipToPadding="false" - android:baselineAligned="false"> + android:orientation="horizontal"> Camera access Microphone access - - For all apps and services + + For apps and services + + For apps and services. If this setting is off, microphone data may still be shared when you call an emergency number. Game settings diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index 236df5ecb25..cd7d79836e7 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -67,14 +67,14 @@ diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java index 7aa5af8b84c..a2f723e39ce 100644 --- a/src/com/android/settings/SettingsApplication.java +++ b/src/com/android/settings/SettingsApplication.java @@ -16,13 +16,18 @@ package com.android.settings; +import android.app.Activity; import android.app.Application; import com.android.settings.activityembedding.ActivityEmbeddingRulesController; +import java.lang.ref.WeakReference; + /** Settings application which sets up activity embedding rules for the large screen device. */ public class SettingsApplication extends Application { + private WeakReference mHomeActivity = new WeakReference<>(null); + @Override public void onCreate() { super.onCreate(); @@ -31,4 +36,12 @@ public class SettingsApplication extends Application { new ActivityEmbeddingRulesController(this); controller.initRules(); } + + public void setHomeActivity(Activity homeActivity) { + mHomeActivity = new WeakReference<>(homeActivity); + } + + public Activity getHomeActivity() { + return mHomeActivity.get(); + } } diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingProvider.java b/src/com/android/settings/activityembedding/ActivityEmbeddingProvider.java index 7585dce5b5f..764564351e1 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingProvider.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingProvider.java @@ -16,6 +16,7 @@ package com.android.settings.activityembedding; +import android.app.Activity; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; @@ -23,13 +24,17 @@ import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; +import com.android.settings.SettingsApplication; + /** * A content provider for querying the state of activity embedding feature */ public class ActivityEmbeddingProvider extends ContentProvider { 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_TWO_PANE_STATE = "two_pane_state"; @Override public boolean onCreate() { @@ -43,6 +48,14 @@ public class ActivityEmbeddingProvider extends ContentProvider { bundle.putBoolean(EXTRA_ENABLED_STATE, ActivityEmbeddingUtils.isEmbeddingActivityEnabled(getContext())); 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; } diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java index 7ecacded7be..ac3a01df8cf 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java @@ -16,7 +16,10 @@ package com.android.settings.activityembedding; +import android.app.Activity; +import android.app.ActivityTaskManager; import android.content.Context; +import android.graphics.Rect; import android.util.DisplayMetrics; import android.util.FeatureFlagUtils; import android.util.Log; @@ -64,10 +67,11 @@ public class ActivityEmbeddingUtils { } /** Whether the screen meets two-pane resolution. */ - public static boolean isTwoPaneResolution(Context context) { - final Context appContext = context.getApplicationContext(); - final DisplayMetrics dm = appContext.getResources().getDisplayMetrics(); - return dm.widthPixels >= getMinCurrentScreenSplitWidthPx(appContext) - && dm.heightPixels >= getMinSmallestScreenSplitWidthPx(appContext); + public static boolean isTwoPaneResolution(Activity activity) { + final Rect currentTaskBounds = + ActivityTaskManager.getInstance().getTaskBounds(activity.getTaskId()); + + return currentTaskBounds.width() >= getMinCurrentScreenSplitWidthPx(activity) + && currentTaskBounds.height() >= getMinSmallestScreenSplitWidthPx(activity); } } diff --git a/src/com/android/settings/fuelgauge/BatterySaverController.java b/src/com/android/settings/fuelgauge/BatterySaverController.java index 7fa479968a9..15070c3e8d2 100644 --- a/src/com/android/settings/fuelgauge/BatterySaverController.java +++ b/src/com/android/settings/fuelgauge/BatterySaverController.java @@ -15,17 +15,14 @@ */ package com.android.settings.fuelgauge; -import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; -import android.os.AsyncTask; import android.os.Handler; import android.os.Looper; import android.os.PowerManager; import android.provider.Settings; import android.provider.Settings.Global; -import android.util.Pair; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; @@ -33,8 +30,6 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.Utils; 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.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; @@ -49,7 +44,6 @@ public class BatterySaverController extends BasePreferenceController private final BatterySaverReceiver mBatteryStateChangeReceiver; private final PowerManager mPowerManager; private Preference mBatterySaverPref; - private final MetricsFeatureProvider mMetricsFeatureProvider; private final ContentObserver mObserver = new ContentObserver( new Handler(Looper.getMainLooper())) { @Override @@ -62,7 +56,6 @@ public class BatterySaverController extends BasePreferenceController super(context, KEY_BATTERY_SAVER); mPowerManager = mContext.getSystemService(PowerManager.class); - mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); mBatteryStateChangeReceiver = new BatterySaverReceiver(context); mBatteryStateChangeReceiver.setBatterySaverListener(this); 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 public void onPowerSaveModeChanged() { updateSummary(); - AsyncTask.execute(() -> logPowerSaver()); } @Override diff --git a/src/com/android/settings/fuelgauge/ExpandDividerPreference.java b/src/com/android/settings/fuelgauge/ExpandDividerPreference.java index b89f2d42acb..45171770e6a 100644 --- a/src/com/android/settings/fuelgauge/ExpandDividerPreference.java +++ b/src/com/android/settings/fuelgauge/ExpandDividerPreference.java @@ -65,8 +65,7 @@ public class ExpandDividerPreference extends Preference { @Override public void onClick() { - mIsExpanded = !mIsExpanded; - refreshState(); + setIsExpanded(!mIsExpanded); if (mOnExpandListener != null) { mOnExpandListener.onExpand(mIsExpanded); } @@ -74,10 +73,7 @@ public class ExpandDividerPreference extends Preference { void setTitle(final String titleContent) { mTitleContent = titleContent; - if (mTextView != null) { - mTextView.postDelayed( - () -> mTextView.setText(titleContent), 50); - } + refreshState(); } void setIsExpanded(boolean isExpanded) { @@ -90,13 +86,13 @@ public class ExpandDividerPreference extends Preference { } private void refreshState() { - final int iconId = - mIsExpanded - ? R.drawable.ic_settings_expand_less - : R.drawable.ic_settings_expand_more; 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); } } diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java index afe58535ef9..64114463246 100644 --- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java +++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettings.java @@ -16,17 +16,20 @@ package com.android.settings.fuelgauge.batterysaver; +import android.app.settings.SettingsEnums; import android.content.Context; import android.database.ContentObserver; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.provider.Settings; import android.text.TextUtils; import android.view.View; +import android.util.Pair; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -34,6 +37,7 @@ import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.widget.RadioButtonPickerFragment; import com.android.settingslib.fuelgauge.BatterySaverUtils; import com.android.settingslib.widget.CandidateInfo; @@ -58,6 +62,8 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment { public BatterySaverScheduleRadioButtonsController mRadioButtonController; @VisibleForTesting Context mContext; + private int mSaverPercentage; + private String mSaverScheduleKey; private BatterySaverScheduleSeekBarController mSeekBarController; @VisibleForTesting @@ -90,6 +96,8 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment { Settings.Secure.getUriFor(Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED), false, mSettingsObserver); + mSaverScheduleKey = mRadioButtonController.getDefaultKey(); + mSaverPercentage = getSaverPercentage(); } @Override @@ -107,6 +115,7 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment { @Override public void onPause() { mContext.getContentResolver().unregisterContentObserver(mSettingsObserver); + AsyncTask.execute(() -> logPowerSaver()); super.onPause(); } @@ -174,6 +183,43 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment { 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 { private final CharSequence mLabel; @@ -207,4 +253,4 @@ public class BatterySaverScheduleSettings extends RadioButtonPickerFragment { return mSummary; } } -} \ No newline at end of file +} diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index ec3589c77c3..a2a6d3cb1ec 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -42,6 +42,7 @@ import androidx.fragment.app.FragmentTransaction; import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.SettingsActivity; +import com.android.settings.SettingsApplication; import com.android.settings.Utils; import com.android.settings.accounts.AvatarViewMixin; import com.android.settings.activityembedding.ActivityEmbeddingRulesController; @@ -95,6 +96,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + ((SettingsApplication) getApplication()).setHomeActivity(this); setContentView(R.layout.settings_homepage_container); final View appBar = findViewById(R.id.app_bar_container); diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java index a819b870540..38b2baa1694 100644 --- a/src/com/android/settings/homepage/TopLevelSettings.java +++ b/src/com/android/settings/homepage/TopLevelSettings.java @@ -196,8 +196,8 @@ public class TopLevelSettings extends DashboardFragment implements } Log.d(TAG, "onCreateAdapter, pref key: " + mHighlightedPreferenceKey); - mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter(preferenceScreen, - getListView(), mHighlightedPreferenceKey); + mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter( + getActivity(), preferenceScreen, getListView(), mHighlightedPreferenceKey); return mTopLevelAdapter; } diff --git a/src/com/android/settings/network/apn/ApnEditor.java b/src/com/android/settings/network/apn/ApnEditor.java index 0b751620ad1..03db1b89be7 100644 --- a/src/com/android/settings/network/apn/ApnEditor.java +++ b/src/com/android/settings/network/apn/ApnEditor.java @@ -1256,7 +1256,8 @@ public class ApnEditor extends SettingsPreferenceFragment if (!readOnlyApnTypes.contains(apnType) && !apnType.equals(APN_TYPE_IA) && !apnType.equals(APN_TYPE_EMERGENCY) - && !apnType.equals(APN_TYPE_MCX)) { + && !apnType.equals(APN_TYPE_MCX) + && !apnType.equals(APN_TYPE_IMS)) { if (first) { first = false; } else { diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java index 894eb68ebf7..658f65090a1 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java +++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java @@ -509,12 +509,15 @@ public class MobileNetworkUtils { if (carrierConfig.getBoolean(CarrierConfigManager.KEY_SUPPORT_TDSCDMA_BOOL)) { return true; } + final String[] numericArray = carrierConfig.getStringArray( + CarrierConfigManager.KEY_SUPPORT_TDSCDMA_ROAMING_NETWORKS_STRING_ARRAY); + if (numericArray == null) { + return false; + } final ServiceState serviceState = telephonyManager.getServiceState(); final String operatorNumeric = (serviceState != null) ? serviceState.getOperatorNumeric() : null; - final String[] numericArray = carrierConfig.getStringArray( - CarrierConfigManager.KEY_SUPPORT_TDSCDMA_ROAMING_NETWORKS_STRING_ARRAY); - if (numericArray == null || operatorNumeric == null) { + if (operatorNumeric == null) { return false; } for (String numeric : numericArray) { diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java index eeaad214a21..19a91f65d16 100644 --- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java +++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java @@ -16,6 +16,7 @@ package com.android.settings.widget; +import android.app.Activity; import android.content.Context; import android.graphics.drawable.Drawable; import android.text.TextUtils; @@ -53,6 +54,7 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt final int mIconColorHighlight; private final Context mContext; + private final Activity mActivity; private final RecyclerView mRecyclerView; private final int mNormalBackgroundRes; private String mHighlightKey; @@ -61,12 +63,13 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt private boolean mHighlightNeeded; private boolean mScrolled; - public HighlightableTopLevelPreferenceAdapter(PreferenceGroup preferenceGroup, - RecyclerView recyclerView, String key) { + public HighlightableTopLevelPreferenceAdapter(Activity activity, + PreferenceGroup preferenceGroup, RecyclerView recyclerView, String key) { super(preferenceGroup); mRecyclerView = recyclerView; mHighlightKey = key; mContext = preferenceGroup.getContext(); + mActivity = activity; final TypedValue outValue = new TypedValue(); mContext.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true /* resolveRefs */); @@ -233,6 +236,6 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt } private boolean isHighlightNeeded() { - return ActivityEmbeddingUtils.isTwoPaneResolution(mContext); + return ActivityEmbeddingUtils.isTwoPaneResolution(mActivity); } } diff --git a/tests/robotests/src/com/android/settings/MainClearTest.java b/tests/robotests/src/com/android/settings/MainClearTest.java index ec33fadfd02..e2a7ca904e8 100644 --- a/tests/robotests/src/com/android/settings/MainClearTest.java +++ b/tests/robotests/src/com/android/settings/MainClearTest.java @@ -55,6 +55,7 @@ import com.android.settingslib.development.DevelopmentSettingsEnabler; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -208,6 +209,7 @@ public class MainClearTest { } @Test + @Ignore public void testShowWipeEuicc_euiccEnabled_unprovisioned() { prepareEuiccState( true /* isEuiccEnabled */, @@ -226,6 +228,7 @@ public class MainClearTest { } @Test + @Ignore public void testShowWipeEuicc_developerMode_unprovisioned() { prepareEuiccState( true /* isEuiccEnabled */, diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java index 86418c66482..52060a0dbcf 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java @@ -29,9 +29,6 @@ import android.util.Pair; import androidx.preference.Preference; -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; @@ -51,16 +48,12 @@ public class BatterySaverControllerTest { private BatterySaverController mBatterySaverController; private Context mContext; - private FakeFeatureFactory mFeatureFactory; - private MetricsFeatureProvider mMetricsFeatureProvider; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; - mFeatureFactory = FakeFeatureFactory.setupForTest(); - mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider; mBatterySaverController = spy(new BatterySaverController(mContext)); ReflectionHelpers.setField(mBatterySaverController, "mPowerManager", mPowerManager); ReflectionHelpers.setField(mBatterySaverController, "mBatterySaverPref", mBatterySaverPref); @@ -81,59 +74,6 @@ public class BatterySaverControllerTest { 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 public void getSummary_batterySaverOn_showSummaryOn() { when(mPowerManager.isPowerSaveMode()).thenReturn(true); @@ -177,11 +117,4 @@ public class BatterySaverControllerTest { assertThat(mBatterySaverController.getSummary()).isEqualTo("Off"); } - - private static void waitAWhile() { - try { - Thread.sleep(200); - } catch (Exception e) { - } - } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/ExpandDividerPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/ExpandDividerPreferenceTest.java index 97af2827e6f..9e32da4bea0 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/ExpandDividerPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/ExpandDividerPreferenceTest.java @@ -18,11 +18,7 @@ package com.android.settings.fuelgauge; 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.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -36,8 +32,6 @@ import com.android.settings.R; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; @@ -52,7 +46,6 @@ public final class ExpandDividerPreferenceTest { @Before public void setUp() { - MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); mImageView = spy(new ImageView(mContext)); mTextView = spy(new TextView(mContext)); @@ -64,9 +57,9 @@ public final class ExpandDividerPreferenceTest { @Test public void testConstructor_returnExpectedResult() { assertThat(mExpandDividerPreference.getKey()) - .isEqualTo(ExpandDividerPreference.PREFERENCE_KEY); + .isEqualTo(ExpandDividerPreference.PREFERENCE_KEY); assertThat(mExpandDividerPreference.getLayoutResource()) - .isEqualTo(R.layout.preference_expand_divider); + .isEqualTo(R.layout.preference_expand_divider); } @Test @@ -75,9 +68,7 @@ public final class ExpandDividerPreferenceTest { mExpandDividerPreference.mTextView = mTextView; mExpandDividerPreference.setTitle(titleContent); - final ArgumentCaptor captor = ArgumentCaptor.forClass(Runnable.class); - verify(mTextView).postDelayed(captor.capture(), eq(50L)); - captor.getValue().run(); + verify(mTextView).setText(titleContent); } @@ -86,7 +77,7 @@ public final class ExpandDividerPreferenceTest { final boolean[] isExpandedArray = new boolean[] {false}; mExpandDividerPreference.mImageView = mImageView; mExpandDividerPreference.setOnExpandListener( - isExpanded -> isExpandedArray[0] = isExpanded); + isExpanded -> isExpandedArray[0] = isExpanded); // Click the item first time from false -> true. mExpandDividerPreference.onClick(); @@ -106,7 +97,7 @@ public final class ExpandDividerPreferenceTest { final boolean[] isExpandedArray = new boolean[] {false}; mExpandDividerPreference.mImageView = mImageView; mExpandDividerPreference.setOnExpandListener( - isExpanded -> isExpandedArray[0] = isExpanded); + isExpanded -> isExpandedArray[0] = isExpanded); mExpandDividerPreference.setIsExpanded(true); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java new file mode 100644 index 00000000000..afd7f66d56b --- /dev/null +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSettingsTest.java @@ -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) { + } + } +}