package com.android.providers.settings;
import android.os.Process;
-import com.android.internal.R;
import com.android.internal.app.LocalePicker;
import com.android.internal.annotations.VisibleForTesting;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
-import android.hardware.display.DisplayManager;
import android.icu.util.ULocale;
import android.location.LocationManager;
import android.media.AudioManager;
import android.media.RingtoneManager;
import android.net.Uri;
-import android.os.IPowerManager;
import android.os.LocaleList;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArraySet;
-import android.util.Slog;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Locale;
public class SettingsHelper {
private static final String TAG = "SettingsHelper";
private static final String SILENT_RINGTONE = "_silent";
+ private static final float FLOAT_TOLERANCE = 0.01f;
+
private Context mContext;
private AudioManager mAudioManager;
private TelephonyManager mTelephonyManager;
case Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES:
case Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES:
case Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER:
- case Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE:
return !TextUtils.isEmpty(Settings.Secure.getString(
mContext.getContentResolver(), name));
+ case Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE:
+ float defaultScale = mContext.getResources().getFraction(
+ R.fraction.def_accessibility_display_magnification_scale, 1, 1);
+ float currentScale = Settings.Secure.getFloat(
+ mContext.getContentResolver(), name, defaultScale);
+ return Math.abs(currentScale - defaultScale) >= FLOAT_TOLERANCE;
case Settings.System.FONT_SCALE:
return Settings.System.getFloat(mContext.getContentResolver(), name, 1.0f) != 1.0f;
default:
--- /dev/null
+/*
+ * Copyright (C) 2018 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.providers.settings;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.net.Uri;
+import android.os.Build;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for {@link SettingsHelper#restoreValue(Context, ContentResolver, ContentValues, Uri,
+ * String, String, int)}. Specifically verifies that we restore critical accessibility settings only
+ * if the user has not already configured these in SUW.
+ */
+@RunWith(AndroidJUnit4.class)
+public class SettingsHelperRestoreTest {
+ private static final float FLOAT_TOLERANCE = 0.01f;
+
+ private Context mContext;
+ private ContentResolver mContentResolver;
+ private SettingsHelper mSettingsHelper;
+
+ @Before
+ public void setUp() {
+ mContext = InstrumentationRegistry.getContext();
+ mContentResolver = mContext.getContentResolver();
+ mSettingsHelper = new SettingsHelper(mContext);
+ }
+
+ /** Tests for {@link Settings.Secure#ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE}. */
+ @Test
+ public void
+ testRestoreAccessibilityDisplayMagnificationScale_alreadyConfigured_doesNotRestoreValue()
+ throws Exception {
+ float defaultSettingValue = setDefaultAccessibilityDisplayMagnificationScale();
+ String settingName = Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE;
+ float restoreSettingValue = defaultSettingValue + 0.5f;
+
+ // Simulate already configuring setting via SUW.
+ float configuredSettingValue = defaultSettingValue + 1.0f;
+ Settings.Secure.putFloat(mContentResolver, settingName, configuredSettingValue);
+
+ mSettingsHelper.restoreValue(
+ mContext,
+ mContentResolver,
+ new ContentValues(2),
+ Settings.Secure.getUriFor(settingName),
+ settingName,
+ String.valueOf(restoreSettingValue),
+ Build.VERSION.SDK_INT);
+
+ assertEquals(
+ configuredSettingValue,
+ Settings.Secure.getFloat(mContentResolver, settingName),
+ FLOAT_TOLERANCE);
+ }
+
+ @Test
+ public void
+ testRestoreAccessibilityDisplayMagnificationScale_notAlreadyConfigured_restoresValue()
+ throws Exception {
+ float defaultSettingValue = setDefaultAccessibilityDisplayMagnificationScale();
+ String settingName = Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE;
+ float restoreSettingValue = defaultSettingValue + 0.5f;
+
+ mSettingsHelper.restoreValue(
+ mContext,
+ mContentResolver,
+ new ContentValues(2),
+ Settings.Secure.getUriFor(settingName),
+ settingName,
+ String.valueOf(restoreSettingValue),
+ Build.VERSION.SDK_INT);
+
+ assertEquals(
+ restoreSettingValue,
+ Settings.Secure.getFloat(mContentResolver, settingName),
+ FLOAT_TOLERANCE);
+ }
+
+ /**
+ * Simulate {@link Settings.Secure#ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE} value at boot by
+ * loading the default.
+ *
+ * @return the default value.
+ */
+ private float setDefaultAccessibilityDisplayMagnificationScale() {
+ float defaultSettingValue =
+ mContext.getResources()
+ .getFraction(
+ R.fraction.def_accessibility_display_magnification_scale, 1, 1);
+ Settings.Secure.putFloat(
+ mContentResolver,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
+ defaultSettingValue);
+ return defaultSettingValue;
+ }
+}