diff --git a/res/values/strings.xml b/res/values/strings.xml
index 863bd8d9d75..f3da56d04a2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -519,14 +519,11 @@
System language
- System default - %1$s
+ System default
Language selection for this app isn\u2019t available from Settings.
-
- You can\u2019t select a language for this app from Settings.
-
- Remove selected language?
diff --git a/src/com/android/settings/MainClearConfirm.java b/src/com/android/settings/MainClearConfirm.java
index c45a907c632..9208c4fbf6a 100644
--- a/src/com/android/settings/MainClearConfirm.java
+++ b/src/com/android/settings/MainClearConfirm.java
@@ -31,6 +31,7 @@ import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
+import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.service.oemlock.OemLockManager;
@@ -67,6 +68,8 @@ import com.google.android.setupdesign.GlifLayout;
public class MainClearConfirm extends InstrumentedFragment {
private static final String TAG = "MainClearConfirm";
+ private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
+
@VisibleForTesting View mContentView;
private boolean mEraseSdCard;
@VisibleForTesting boolean mEraseEsims;
@@ -83,6 +86,11 @@ public class MainClearConfirm extends InstrumentedFragment {
return;
}
+ // pre-flight check hardware support PersistentDataBlockManager
+ if (SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP).equals("")) {
+ return;
+ }
+
final PersistentDataBlockManager pdbManager = (PersistentDataBlockManager)
getActivity().getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
index da0287677f6..11485844127 100644
--- a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
@@ -22,6 +22,7 @@ import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
+import android.os.Bundle;
import androidx.appcompat.app.AlertDialog;
@@ -32,6 +33,8 @@ import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.search.SearchIndexable;
+import com.google.common.annotations.VisibleForTesting;
+
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -49,6 +52,26 @@ public class TextReadingPreferenceFragment extends DashboardFragment {
private static final String RESET_KEY = "reset";
private static final String BOLD_TEXT_KEY = "toggle_force_bold_text";
private static final String HIGHT_TEXT_CONTRAST_KEY = "toggle_high_text_contrast_preference";
+ private static final String NEED_RESET_SETTINGS = "need_reset_settings";
+ private FontWeightAdjustmentPreferenceController mFontWeightAdjustmentController;
+
+ @VisibleForTesting
+ List mResetStateListeners;
+
+ @VisibleForTesting
+ boolean mNeedResetSettings;
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ mNeedResetSettings = false;
+ mResetStateListeners = getResetStateListeners();
+
+ if (icicle != null && icicle.getBoolean(NEED_RESET_SETTINGS)) {
+ mResetStateListeners.forEach(ResetStateListener::resetState);
+ }
+ }
@Override
protected int getPreferenceScreenResId() {
@@ -69,7 +92,7 @@ public class TextReadingPreferenceFragment extends DashboardFragment {
protected List createPreferenceControllers(Context context) {
final List controllers = new ArrayList<>();
final FontSizeData fontSizeData = new FontSizeData(context);
- final DisplaySizeData displaySizeData = new DisplaySizeData(context);
+ final DisplaySizeData displaySizeData = createDisplaySizeData(context);
final TextReadingPreviewController previewController = new TextReadingPreviewController(
context, PREVIEW_KEY, fontSizeData, displaySizeData);
@@ -85,9 +108,9 @@ public class TextReadingPreferenceFragment extends DashboardFragment {
displaySizeController.setInteractionListener(previewController);
controllers.add(displaySizeController);
- final FontWeightAdjustmentPreferenceController fontWeightController =
+ mFontWeightAdjustmentController =
new FontWeightAdjustmentPreferenceController(context, BOLD_TEXT_KEY);
- controllers.add(fontWeightController);
+ controllers.add(mFontWeightAdjustmentController);
final HighTextContrastPreferenceController highTextContrastController =
new HighTextContrastPreferenceController(context, HIGHT_TEXT_CONTRAST_KEY);
@@ -126,12 +149,35 @@ public class TextReadingPreferenceFragment extends DashboardFragment {
return super.getDialogMetricsCategory(dialogId);
}
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ if (mNeedResetSettings) {
+ outState.putBoolean(NEED_RESET_SETTINGS, true);
+ }
+ }
+
+ @VisibleForTesting
+ DisplaySizeData createDisplaySizeData(Context context) {
+ return new DisplaySizeData(context);
+ }
+
private void onPositiveButtonClicked(DialogInterface dialog, int which) {
// To avoid showing the dialog again, probably the onDetach() of SettingsDialogFragment
// was interrupted by unexpectedly recreating the activity.
removeDialog(DialogEnums.DIALOG_RESET_SETTINGS);
- getResetStateListeners().forEach(ResetStateListener::resetState);
+ if (mFontWeightAdjustmentController.isChecked()) {
+ // TODO(b/228956791): Consider replacing or removing it once the root cause is
+ // clarified and the better method is available.
+ // Probably has the race condition issue between "Bold text" and the other features
+ // including "Display Size", “Font Size” if they would be enabled at the same time,
+ // so our workaround is that the “Bold text” would be reset first and then do the
+ // remaining to avoid flickering problem.
+ mNeedResetSettings = true;
+ mFontWeightAdjustmentController.resetState();
+ } else {
+ mResetStateListeners.forEach(ResetStateListener::resetState);
+ }
}
private List getResetStateListeners() {
diff --git a/src/com/android/settings/applications/appinfo/AppLocaleDetails.java b/src/com/android/settings/applications/appinfo/AppLocaleDetails.java
index 70383d17f24..88e43a4b01c 100644
--- a/src/com/android/settings/applications/appinfo/AppLocaleDetails.java
+++ b/src/com/android/settings/applications/appinfo/AppLocaleDetails.java
@@ -208,13 +208,9 @@ public class AppLocaleDetails extends SettingsPreferenceFragment {
LocaleList packageLocaleList = getPackageLocales();
String[] assetLocaleList = getAssetLocales();
// TODO add apended url string, "Learn more", to these both sentenses.
- if (packageLocaleList == null && assetLocaleList.length == 0) {
- // There is no locale info from PackageManager amd AssetManager.
+ if ((packageLocaleList != null && packageLocaleList.isEmpty())
+ || (packageLocaleList == null && assetLocaleList.length == 0)) {
return R.string.desc_no_available_supported_locale;
- } else if (packageLocaleList != null && packageLocaleList.isEmpty()) {
- // LocaleConfig is empty, and this means only allow user modify language
- // by the application.
- return R.string.desc_disallow_locale_change_in_settings;
}
return -1;
}
@@ -276,9 +272,7 @@ public class AppLocaleDetails extends SettingsPreferenceFragment {
final Context contextAsUser = context.createContextAsUser(userHandle, 0);
Locale appLocale = getAppDefaultLocale(contextAsUser, entry.info.packageName);
if (appLocale == null) {
- Locale systemLocale = Locale.getDefault();
- return context.getString(R.string.preference_of_system_locale_summary,
- systemLocale.getDisplayName(systemLocale));
+ return context.getString(R.string.preference_of_system_locale_summary);
} else {
return appLocale.getDisplayName(appLocale);
}
diff --git a/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java b/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
index ee4609001bb..9ef8c8ce747 100644
--- a/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
+++ b/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
@@ -69,15 +69,6 @@ public class RequestIgnoreBatteryOptimizations extends AlertActivity implements
return;
}
- ApplicationInfo ai;
- try {
- ai = getPackageManager().getApplicationInfo(mPackageName, 0);
- } catch (PackageManager.NameNotFoundException e) {
- debugLog("Requested package doesn't exist: " + mPackageName);
- finish();
- return;
- }
-
if (getPackageManager().checkPermission(
Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, mPackageName)
!= PackageManager.PERMISSION_GRANTED) {
@@ -87,6 +78,15 @@ public class RequestIgnoreBatteryOptimizations extends AlertActivity implements
return;
}
+ ApplicationInfo ai;
+ try {
+ ai = getPackageManager().getApplicationInfo(mPackageName, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ debugLog("Requested package doesn't exist: " + mPackageName);
+ finish();
+ return;
+ }
+
final AlertController.AlertParams p = mAlertParams;
final CharSequence appLabel = ai.loadSafeLabel(getPackageManager(),
PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX, PackageItemInfo.SAFE_LABEL_FLAG_TRIM
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
index da0f2e2fbe5..ee3f54f70e0 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
@@ -22,6 +22,7 @@ import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
+import android.provider.Settings;
import android.provider.SettingsSlicesContract;
import android.widget.Switch;
@@ -101,6 +102,11 @@ public class BatterySaverButtonPreferenceController extends
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
+ // Cancel preference's check state once it's first time launch
+ if (isChecked && (Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 0) == 0)) {
+ mPreference.setChecked(false);
+ }
setChecked(isChecked);
}
diff --git a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
index 7f0d7c338d0..08b043e2260 100644
--- a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
+++ b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
@@ -28,6 +28,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.om.IOverlayManager;
import android.content.om.OverlayInfo;
+import android.content.res.Resources;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -49,6 +50,7 @@ import com.android.settings.support.actionbar.HelpResourceProvider;
import com.android.settings.utils.CandidateInfoExtra;
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.search.SearchIndexable;
+import com.android.settingslib.search.SearchIndexableRaw;
import com.android.settingslib.widget.CandidateInfo;
import com.android.settingslib.widget.IllustrationPreference;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
@@ -320,6 +322,39 @@ public class SystemNavigationGestureSettings extends RadioButtonPickerFragment i
protected boolean isPageSearchEnabled(Context context) {
return SystemNavigationPreferenceController.isGestureAvailable(context);
}
+
+ @Override
+ public List getRawDataToIndex(Context context,
+ boolean enabled) {
+ final Resources res = context.getResources();
+ final List result = new ArrayList<>();
+
+ if (SystemNavigationPreferenceController.isOverlayPackageAvailable(context,
+ NAV_BAR_MODE_GESTURAL_OVERLAY)) {
+ SearchIndexableRaw data = new SearchIndexableRaw(context);
+ data.title = res.getString(R.string.edge_to_edge_navigation_title);
+ data.key = KEY_SYSTEM_NAV_GESTURAL;
+ result.add(data);
+ }
+
+ if (SystemNavigationPreferenceController.isOverlayPackageAvailable(context,
+ NAV_BAR_MODE_2BUTTON_OVERLAY)) {
+ SearchIndexableRaw data = new SearchIndexableRaw(context);
+ data.title = res.getString(R.string.swipe_up_to_switch_apps_title);
+ data.key = KEY_SYSTEM_NAV_2BUTTONS;
+ result.add(data);
+ }
+
+ if (SystemNavigationPreferenceController.isOverlayPackageAvailable(context,
+ NAV_BAR_MODE_3BUTTON_OVERLAY)) {
+ SearchIndexableRaw data = new SearchIndexableRaw(context);
+ data.title = res.getString(R.string.legacy_navigation_title);
+ data.key = KEY_SYSTEM_NAV_3BUTTONS;
+ result.add(data);
+ }
+
+ return result;
+ }
};
// From HelpResourceProvider
diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java
index d3c855e658a..4700f3f5383 100644
--- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java
+++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java
@@ -28,6 +28,7 @@ import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
+import android.widget.ListView;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.LocalePickerWithRegion;
@@ -49,6 +50,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
private LocalePickerWithRegion mLocalePickerWithRegion;
private AppLocaleDetails mAppLocaleDetails;
private Context mContextAsUser;
+ private View mAppLocaleDetailContainer;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -82,7 +84,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
false /* translate only */,
mPackageName);
mAppLocaleDetails = AppLocaleDetails.newInstance(mPackageName);
-
+ mAppLocaleDetailContainer = launchAppLocaleDetailsPage();
// Launch Locale picker part.
launchLocalePickerPage();
}
@@ -134,12 +136,14 @@ public class AppLocalePickerActivity extends SettingsBaseActivity
fragmentManager.registerFragmentLifecycleCallbacks(
new android.app.FragmentManager.FragmentLifecycleCallbacks() {
@Override
- public void onFragmentResumed(
+ public void onFragmentViewCreated(
android.app.FragmentManager fm,
- android.app.Fragment f) {
- super.onFragmentResumed(fm, f);
- mLocalePickerWithRegion.getListView()
- .addHeaderView(launchAppLocaleDetailsPage());
+ android.app.Fragment f, View v, Bundle s) {
+ super.onFragmentViewCreated(fm, f, v, s);
+ ListView listView = (ListView) v.findViewById(android.R.id.list);
+ if (listView != null) {
+ listView.addHeaderView(mAppLocaleDetailContainer);
+ }
}
}, true);
fragmentManager.beginTransaction()
diff --git a/src/com/android/settings/notification/zen/AbstractZenModeAutomaticRulePreferenceController.java b/src/com/android/settings/notification/zen/AbstractZenModeAutomaticRulePreferenceController.java
index 701abbb0b65..cce715de524 100644
--- a/src/com/android/settings/notification/zen/AbstractZenModeAutomaticRulePreferenceController.java
+++ b/src/com/android/settings/notification/zen/AbstractZenModeAutomaticRulePreferenceController.java
@@ -16,6 +16,8 @@
package com.android.settings.notification.zen;
+import static android.app.NotificationManager.EXTRA_AUTOMATIC_RULE_ID;
+
import android.app.AutomaticZenRule;
import android.app.NotificationManager;
import android.app.settings.SettingsEnums;
@@ -79,7 +81,8 @@ abstract public class AbstractZenModeAutomaticRulePreferenceController extends
ComponentName configurationActivity, String ruleId) {
final Intent intent = new Intent()
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
- .putExtra(ConditionProviderService.EXTRA_RULE_ID, ruleId);
+ .putExtra(ConditionProviderService.EXTRA_RULE_ID, ruleId)
+ .putExtra(EXTRA_AUTOMATIC_RULE_ID, ruleId);
if (configurationActivity != null) {
intent.setComponent(configurationActivity);
} else {
diff --git a/src/com/android/settings/notification/zen/ZenModeRuleSettingsBase.java b/src/com/android/settings/notification/zen/ZenModeRuleSettingsBase.java
index 5ce8b48b27c..e155093996a 100644
--- a/src/com/android/settings/notification/zen/ZenModeRuleSettingsBase.java
+++ b/src/com/android/settings/notification/zen/ZenModeRuleSettingsBase.java
@@ -16,6 +16,8 @@
package com.android.settings.notification.zen;
+import static android.app.NotificationManager.EXTRA_AUTOMATIC_RULE_ID;
+
import android.app.AutomaticZenRule;
import android.app.NotificationManager;
import android.content.Context;
@@ -72,9 +74,12 @@ public abstract class ZenModeRuleSettingsBase extends ZenModeSettingsBase {
mId = intent.getStringExtra(ConditionProviderService.EXTRA_RULE_ID);
if (mId == null) {
- Log.w(TAG, "rule id is null");
- toastAndFinish();
- return;
+ mId = intent.getStringExtra(EXTRA_AUTOMATIC_RULE_ID);
+ if (mId == null) {
+ Log.w(TAG, "rule id is null");
+ toastAndFinish();
+ return;
+ }
}
if (DEBUG) Log.d(TAG, "mId=" + mId);
diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java
index c67a687d180..db7612f7f10 100644
--- a/src/com/android/settings/users/AppRestrictionsFragment.java
+++ b/src/com/android/settings/users/AppRestrictionsFragment.java
@@ -661,10 +661,7 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
}
private void assertSafeToStartCustomActivity(Intent intent) {
- // Activity can be started if it belongs to the same app
- if (intent.getPackage() != null && intent.getPackage().equals(packageName)) {
- return;
- }
+ EventLog.writeEvent(0x534e4554, "223578534", -1 /* UID */, "");
ResolveInfo resolveInfo = mPackageManager.resolveActivity(
intent, PackageManager.MATCH_DEFAULT_ONLY);
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index 4f2f3c07159..93d267b74a1 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -16,7 +16,6 @@
package com.android.settings.wifi.tether;
-import static android.net.TetheringManager.ACTION_TETHER_STATE_CHANGED;
import static android.net.wifi.WifiManager.WIFI_AP_STATE_CHANGED_ACTION;
import android.app.settings.SettingsEnums;
@@ -32,7 +31,6 @@ import android.util.FeatureFlagUtils;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
-import androidx.preference.PreferenceGroup;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
@@ -79,8 +77,7 @@ public class WifiTetherSettings extends RestrictedDashboardFragment
TetherChangeReceiver mTetherChangeReceiver;
static {
- TETHER_STATE_CHANGE_FILTER = new IntentFilter(ACTION_TETHER_STATE_CHANGED);
- TETHER_STATE_CHANGE_FILTER.addAction(WIFI_AP_STATE_CHANGED_ACTION);
+ TETHER_STATE_CHANGE_FILTER = new IntentFilter(WIFI_AP_STATE_CHANGED_ACTION);
}
public WifiTetherSettings() {
@@ -269,12 +266,7 @@ public class WifiTetherSettings extends RestrictedDashboardFragment
String action = intent.getAction();
Log.d(TAG, "updating display config due to receiving broadcast action " + action);
updateDisplayWithNewConfig();
- if (action.equals(ACTION_TETHER_STATE_CHANGED)) {
- if (mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_DISABLED
- && mRestartWifiApAfterConfigChange) {
- startTether();
- }
- } else if (action.equals(WIFI_AP_STATE_CHANGED_ACTION)) {
+ if (action.equals(WIFI_AP_STATE_CHANGED_ACTION)) {
int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_STATE, 0);
if (state == WifiManager.WIFI_AP_STATE_DISABLED
&& mRestartWifiApAfterConfigChange) {
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java
new file mode 100644
index 00000000000..1793cc28984
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.android.settings.accessibility.FontWeightAdjustmentPreferenceController.BOLD_TEXT_ADJUSTMENT;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.provider.Settings;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentActivity;
+import androidx.preference.PreferenceManager;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums;
+import com.android.settings.accessibility.TextReadingResetController.ResetStateListener;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * Tests for {@link TextReadingPreferenceFragment}.
+ */
+@RunWith(RobolectricTestRunner.class)
+public class TextReadingPreferenceFragmentTest {
+ private TextReadingPreferenceFragment mFragment;
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private PreferenceManager mPreferenceManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext.setTheme(R.style.Theme_AppCompat);
+
+ mFragment = spy(new TextReadingPreferenceFragment());
+ when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
+ when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
+ when(mFragment.getContext()).thenReturn(mContext);
+ when(mFragment.getActivity()).thenReturn(Robolectric.setupActivity(FragmentActivity.class));
+
+ // Avoid a NPE is happened in ShadowWindowManagerGlobal
+ doReturn(mock(DisplaySizeData.class)).when(mFragment).createDisplaySizeData(mContext);
+ mFragment.createPreferenceControllers(mContext);
+ }
+
+ @Test
+ public void onDialogPositiveButtonClicked_boldTextEnabled_needResetSettings() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.FONT_WEIGHT_ADJUSTMENT, BOLD_TEXT_ADJUSTMENT);
+ final AlertDialog dialog = (AlertDialog) mFragment.onCreateDialog(
+ DialogEnums.DIALOG_RESET_SETTINGS);
+ dialog.show();
+
+ dialog.getButton(DialogInterface.BUTTON_POSITIVE).callOnClick();
+
+ assertThat(mFragment.mNeedResetSettings).isTrue();
+ }
+
+ @Test
+ public void onDialogPositiveButtonClicked_boldTextDisabled_resetAllListeners() {
+ final ResetStateListener listener1 = mock(ResetStateListener.class);
+ final ResetStateListener listener2 = mock(ResetStateListener.class);
+ mFragment.mResetStateListeners = new ArrayList<>(Arrays.asList(listener1, listener2));
+ final AlertDialog dialog = (AlertDialog) mFragment.onCreateDialog(
+ DialogEnums.DIALOG_RESET_SETTINGS);
+ dialog.show();
+
+ dialog.getButton(DialogInterface.BUTTON_POSITIVE).callOnClick();
+
+ verify(listener1).resetState();
+ verify(listener2).resetState();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java
index 594de6a6e6a..881a18d6baf 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceControllerTest.java
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
+import android.provider.Settings;
import android.provider.SettingsSlicesContract;
import androidx.preference.PreferenceScreen;
@@ -75,6 +76,24 @@ public class BatterySaverButtonPreferenceControllerTest {
.isEqualTo(SettingsSlicesContract.AUTHORITY);
}
+ @Test
+ public void onSwitchChanged_isCheckedButNotAcked_preferenceIsUnchecked() {
+ setLowPowerWarningAcked(/* acked= */ 0);
+
+ mController.onSwitchChanged(/* switchView= */ null, /* isChecked= */ true);
+
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void onSwitchChanged_isCheckedAndAcked_setPowerSaveMode() {
+ setLowPowerWarningAcked(/* acked= */ 1);
+
+ mController.onSwitchChanged(/* switchView= */ null, /* isChecked= */ true);
+
+ verify(mPowerManager).setPowerSaveModeEnabled(true);
+ }
+
@Test
public void updateState_lowPowerOn_preferenceIsChecked() {
when(mPowerManager.isPowerSaveMode()).thenReturn(true);
@@ -126,4 +145,12 @@ public class BatterySaverButtonPreferenceControllerTest {
public void isPublicSlice_returnsTrue() {
assertThat(mController.isPublicSlice()).isTrue();
}
+
+ // 0 means not acked, 1 means acked.
+ private void setLowPowerWarningAcked(int acked) {
+ Settings.Secure.putInt(
+ mContext.getContentResolver(),
+ Settings.Secure.LOW_POWER_WARNING_ACKNOWLEDGED,
+ acked);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/gestures/SystemNavigationGestureSettingsTest.java b/tests/robotests/src/com/android/settings/gestures/SystemNavigationGestureSettingsTest.java
index 78424da6e0e..e76157071a5 100644
--- a/tests/robotests/src/com/android/settings/gestures/SystemNavigationGestureSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/SystemNavigationGestureSettingsTest.java
@@ -34,6 +34,7 @@ import static junit.framework.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -41,10 +42,14 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.om.IOverlayManager;
import android.content.om.OverlayInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.provider.SearchIndexableResource;
import com.android.internal.R;
import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settingslib.search.SearchIndexableRaw;
import org.junit.Before;
import org.junit.Test;
@@ -67,6 +72,8 @@ public class SystemNavigationGestureSettingsTest {
@Mock
private IOverlayManager mOverlayManager;
@Mock
+ private PackageManager mPackageManager;
+ @Mock
private OverlayInfo mOverlayInfoEnabled;
@Mock
private OverlayInfo mOverlayInfoDisabled;
@@ -75,16 +82,17 @@ public class SystemNavigationGestureSettingsTest {
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
+ mContext = spy(RuntimeEnvironment.application);
mSettings = new SystemNavigationGestureSettings();
when(mOverlayInfoDisabled.isEnabled()).thenReturn(false);
when(mOverlayInfoEnabled.isEnabled()).thenReturn(true);
when(mOverlayManager.getOverlayInfo(any(), anyInt())).thenReturn(mOverlayInfoDisabled);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
}
@Test
- public void testSearchIndexProvider_shouldIndexResource() {
+ public void searchIndexProvider_shouldIndexResource() {
final List indexRes =
SystemNavigationGestureSettings.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
RuntimeEnvironment.application, true /* enabled */);
@@ -93,6 +101,29 @@ public class SystemNavigationGestureSettingsTest {
assertThat(indexRes.get(0).xmlResId).isEqualTo(mSettings.getPreferenceScreenResId());
}
+ @Test
+ public void searchIndexProvider_gesturePackageExist_shouldBeIndexed()
+ throws NameNotFoundException {
+ PackageInfo info = new PackageInfo();
+ when(mPackageManager.getPackageInfo(NAV_BAR_MODE_GESTURAL_OVERLAY, 0))
+ .thenReturn(info);
+
+ final List indexRaws =
+ SystemNavigationGestureSettings.SEARCH_INDEX_DATA_PROVIDER
+ .getRawDataToIndex(mContext, true /* enabled */);
+
+ assertThat(indexRaws).isNotEmpty();
+ }
+
+ @Test
+ public void searchIndexProvider_noNavigationPackageExist_shouldReturnEmpty() {
+ final List indexRaws =
+ SystemNavigationGestureSettings.SEARCH_INDEX_DATA_PROVIDER
+ .getRawDataToIndex(mContext, true /* enabled */);
+
+ assertThat(indexRaws).isEmpty();
+ }
+
@Test
public void testGetCurrentSystemNavigationMode() {
SettingsShadowResources.overrideResource(
diff --git a/tests/robotests/src/com/android/settings/notification/zen/AbstractZenModeAutomaticRulePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/AbstractZenModeAutomaticRulePreferenceControllerTest.java
index ae6e1d0c9c6..1c247a6b8f6 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/AbstractZenModeAutomaticRulePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/AbstractZenModeAutomaticRulePreferenceControllerTest.java
@@ -16,6 +16,9 @@
package com.android.settings.notification.zen;
+import static android.app.NotificationManager.EXTRA_AUTOMATIC_RULE_ID;
+import static android.service.notification.ConditionProviderService.EXTRA_RULE_ID;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
@@ -24,6 +27,7 @@ import android.app.AutomaticZenRule;
import android.app.NotificationManager;
import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
@@ -166,4 +170,21 @@ public class AbstractZenModeAutomaticRulePreferenceControllerTest {
assertThat(actual).isEqualTo(new ComponentName(mContext.getPackageName(), "activity"));
}
+
+ @Test
+ public void testGetRuleIntent() throws Exception {
+ AutomaticZenRule rule = new AutomaticZenRule("name", null,
+ new ComponentName(mContext.getPackageName(), "test"), Uri.EMPTY,
+ new ZenPolicy(), NotificationManager.INTERRUPTION_FILTER_PRIORITY, true);
+ rule.setPackageName(mContext.getPackageName());
+
+ when(mPm.getPackageUid(null, 0)).thenReturn(-1);
+ when(mPm.getPackageUid(mContext.getPackageName(), 0)).thenReturn(1);
+
+ Intent intent = AbstractZenModeAutomaticRulePreferenceController
+ .getRuleIntent(null, rule.getConfigurationActivity(), "id");
+
+ assertThat("id").isEqualTo(intent.getStringExtra(EXTRA_RULE_ID));
+ assertThat("id").isEqualTo(intent.getStringExtra(EXTRA_AUTOMATIC_RULE_ID));
+ }
}
\ No newline at end of file