diff --git a/res/color/dream_card_icon_color_state_list.xml b/res/color/dream_card_icon_color_state_list.xml
new file mode 100644
index 00000000000..c2e32cba34b
--- /dev/null
+++ b/res/color/dream_card_icon_color_state_list.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fc2cb5428d1..d845dfd7f95 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -12317,6 +12317,14 @@
Track all GNSS constellations and frequencies with no duty cycling
+
+
+ Input Method
+
+ Stylus handwriting
+
+ When enabled, current Input method receives stylus MotionEvent if an Editor is focused.
+
Device theme
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index f29930c8bd4..c422df94af0 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -709,4 +709,15 @@
android:key="location_indicator_settings"
settings:controller="com.android.settings.location.LocationIndicatorsPreferenceController"/>
+
+
+
+
+
diff --git a/src/com/android/settings/dashboard/ControllerFutureTask.java b/src/com/android/settings/dashboard/ControllerFutureTask.java
deleted file mode 100644
index 84d11fde16b..00000000000
--- a/src/com/android/settings/dashboard/ControllerFutureTask.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2019 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.dashboard;
-
-import com.android.settingslib.core.AbstractPreferenceController;
-
-import java.util.concurrent.FutureTask;
-
-/**
- * {@link FutureTask} of the Controller.
- */
-public class ControllerFutureTask extends FutureTask {
- private final AbstractPreferenceController mController;
-
- public ControllerFutureTask(ControllerTask task, Void result) {
- super(task, result);
- mController = task.getController();
- }
-
- AbstractPreferenceController getController() {
- return mController;
- }
-}
diff --git a/src/com/android/settings/dashboard/ControllerTask.java b/src/com/android/settings/dashboard/ControllerTask.java
deleted file mode 100644
index c62e738e8dc..00000000000
--- a/src/com/android/settings/dashboard/ControllerTask.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2019 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.dashboard;
-
-import android.app.settings.SettingsEnums;
-import android.os.SystemClock;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import com.android.settingslib.utils.ThreadUtils;
-
-/**
- * A {@link Runnable} controller task. This task handle the visibility of the controller in the
- * background. Also handle the state updating in the main thread.
- */
-public class ControllerTask implements Runnable {
- private static final String TAG = "ControllerTask";
- private static final int CONTROLLER_UPDATESTATE_TIME_THRESHOLD = 50;
-
- private final AbstractPreferenceController mController;
- private final PreferenceScreen mScreen;
- private final int mMetricsCategory;
- private final MetricsFeatureProvider mMetricsFeature;
-
- public ControllerTask(AbstractPreferenceController controller, PreferenceScreen screen,
- MetricsFeatureProvider metricsFeature, int metricsCategory) {
- mController = controller;
- mScreen = screen;
- mMetricsFeature = metricsFeature;
- mMetricsCategory = metricsCategory;
- }
-
- @Override
- public void run() {
- if (!mController.isAvailable()) {
- return;
- }
-
- final String key = mController.getPreferenceKey();
- if (TextUtils.isEmpty(key)) {
- Log.d(TAG, String.format("Preference key is %s in Controller %s",
- key, mController.getClass().getSimpleName()));
- return;
- }
-
- final Preference preference = mScreen.findPreference(key);
- if (preference == null) {
- Log.d(TAG, String.format("Cannot find preference with key %s in Controller %s",
- key, mController.getClass().getSimpleName()));
- return;
- }
- ThreadUtils.postOnMainThread(() -> {
- final long t = SystemClock.elapsedRealtime();
- mController.updateState(preference);
- final int elapsedTime = (int) (SystemClock.elapsedRealtime() - t);
- if (elapsedTime > CONTROLLER_UPDATESTATE_TIME_THRESHOLD) {
- Log.w(TAG, "The updateState took " + elapsedTime + " ms in Controller "
- + mController.getClass().getSimpleName());
- if (mMetricsFeature != null) {
- mMetricsFeature.action(SettingsEnums.PAGE_UNKNOWN,
- SettingsEnums.ACTION_CONTROLLER_UPDATE_STATE, mMetricsCategory,
- mController.getClass().getSimpleName(), elapsedTime);
- }
- }
- });
- }
-
- AbstractPreferenceController getController() {
- return mController;
- }
-}
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index 8b1d633f322..26fe1b1381d 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -48,7 +48,6 @@ import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.ProviderTile;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.search.Indexable;
-import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList;
import java.util.Arrays;
@@ -58,7 +57,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
-import java.util.concurrent.ExecutionException;
/**
* Base fragment for dashboard style UI containing a list of static and dynamic setting items.
@@ -222,7 +220,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
super.onResume();
updatePreferenceStates();
writeElapsedTimeMetric(SettingsEnums.ACTION_DASHBOARD_VISIBLE_TIME,
- "isParalleledControllers:" + isParalleledControllers());
+ "isParalleledControllers:false");
}
@Override
@@ -348,14 +346,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
controller -> controller.displayPreference(screen));
}
- /**
- * @return {@code true} if the underlying controllers should be executed in parallel.
- * Override this function to enable/disable the behavior.
- */
- protected boolean isParalleledControllers() {
- return false;
- }
-
/**
* Get current PreferenceController(s)
*/
@@ -394,36 +384,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
}
}
- /**
- * Use parallel method to update state of each preference managed by PreferenceController.
- */
- @VisibleForTesting
- // To use this parallel approach will cause the side effect of the UI flicker. Such as
- // the thumb sliding of the toggle button.
- void updatePreferenceStatesInParallel() {
- final PreferenceScreen screen = getPreferenceScreen();
- final Collection> controllerLists =
- mPreferenceControllers.values();
- final List taskList = new ArrayList<>();
- for (List controllerList : controllerLists) {
- for (AbstractPreferenceController controller : controllerList) {
- final ControllerFutureTask task = new ControllerFutureTask(
- new ControllerTask(controller, screen, mMetricsFeatureProvider,
- getMetricsCategory()), null /* result */);
- taskList.add(task);
- ThreadUtils.postOnBackgroundThread(task);
- }
- }
-
- for (ControllerFutureTask task : taskList) {
- try {
- task.get();
- } catch (InterruptedException | ExecutionException e) {
- Log.w(TAG, task.getController().getPreferenceKey() + " " + e.getMessage());
- }
- }
- }
-
/**
* Refresh all preference items, including both static prefs from xml, and dynamic items from
* DashboardCategory.
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 025c51f0327..434bcfd27ad 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -582,6 +582,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
bluetoothA2dpConfigStore, fragment));
controllers.add(new SharedDataPreferenceController(context));
controllers.add(new OverlaySettingsPreferenceController(context));
+ controllers.add(new StylusHandwritingPreferenceController(context));
return controllers;
}
diff --git a/src/com/android/settings/development/StylusHandwritingPreferenceController.java b/src/com/android/settings/development/StylusHandwritingPreferenceController.java
new file mode 100644
index 00000000000..69b5badc028
--- /dev/null
+++ b/src/com/android/settings/development/StylusHandwritingPreferenceController.java
@@ -0,0 +1,69 @@
+/*
+ * 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.development;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+class StylusHandwritingPreferenceController extends DeveloperOptionsPreferenceController
+ implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
+
+ static final int SETTING_VALUE_ON = 1;
+ static final int SETTING_VALUE_OFF = 0;
+
+ private static final String STYLUS_HANDWRITING_OPTIONS_KEY = "stylus_handwriting";
+
+ StylusHandwritingPreferenceController(Context context) {
+ super(context);
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return STYLUS_HANDWRITING_OPTIONS_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final boolean isEnabled = (Boolean) newValue;
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.STYLUS_HANDWRITING_ENABLED,
+ isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
+
+ return true;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ final int enable = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.STYLUS_HANDWRITING_ENABLED, SETTING_VALUE_OFF);
+ ((SwitchPreference) mPreference).setChecked(enable != SETTING_VALUE_OFF);
+ }
+
+ @Override
+ protected void onDeveloperOptionsSwitchDisabled() {
+ super.onDeveloperOptionsSwitchDisabled();
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.STYLUS_HANDWRITING_ENABLED, SETTING_VALUE_OFF);
+ ((SwitchPreference) mPreference).setChecked(false);
+ }
+}
diff --git a/src/com/android/settings/dream/DreamAdapter.java b/src/com/android/settings/dream/DreamAdapter.java
index 44f77e3aabd..f196500af5c 100644
--- a/src/com/android/settings/dream/DreamAdapter.java
+++ b/src/com/android/settings/dream/DreamAdapter.java
@@ -84,6 +84,9 @@ public class DreamAdapter extends RecyclerView.Adapter
mPreviewView.setImageDrawable(previewImage);
mPreviewView.setClipToOutline(true);
mPreviewPlaceholderView.setVisibility(View.GONE);
+ } else {
+ mPreviewView.setImageDrawable(null);
+ mPreviewPlaceholderView.setVisibility(View.VISIBLE);
}
final Drawable icon = item.isActive()
@@ -91,7 +94,7 @@ public class DreamAdapter extends RecyclerView.Adapter
: item.getIcon();
if (icon instanceof VectorDrawable) {
icon.setTintList(
- mContext.getColorStateList(R.color.dream_card_text_color_state_list));
+ mContext.getColorStateList(R.color.dream_card_icon_color_state_list));
}
final int iconSize = mContext.getResources().getDimensionPixelSize(
R.dimen.dream_item_icon_size);
diff --git a/tests/robotests/src/com/android/settings/dashboard/ControllerFutureTaskTest.java b/tests/robotests/src/com/android/settings/dashboard/ControllerFutureTaskTest.java
deleted file mode 100644
index c66f2b557a8..00000000000
--- a/tests/robotests/src/com/android/settings/dashboard/ControllerFutureTaskTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2019 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.dashboard;
-
-import static com.android.settingslib.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-
-import androidx.preference.PreferenceManager;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.core.BasePreferenceController;
-
-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 class ControllerFutureTaskTest {
- private static final String KEY = "my_key";
-
- private Context mContext;
- private TestPreferenceController mTestController;
- private PreferenceScreen mScreen;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- mTestController = new TestPreferenceController(mContext, KEY);
- final PreferenceManager preferenceManager = new PreferenceManager(mContext);
- mScreen = preferenceManager.createPreferenceScreen(mContext);
- }
-
- @Test
- public void getController_addTask_checkControllerKey() {
- final ControllerFutureTask futureTask = new ControllerFutureTask(
- new ControllerTask(mTestController, mScreen, null /* metricsFeature */,
- METRICS_CATEGORY_UNKNOWN), null /* result */);
-
- assertThat(futureTask.getController().getPreferenceKey()).isEqualTo(KEY);
- }
-
-
- static class TestPreferenceController extends BasePreferenceController {
- TestPreferenceController(Context context, String preferenceKey) {
- super(context, preferenceKey);
- }
-
- @Override
- public int getAvailabilityStatus() {
- return AVAILABLE;
- }
- }
-}
diff --git a/tests/robotests/src/com/android/settings/dashboard/ControllerTaskTest.java b/tests/robotests/src/com/android/settings/dashboard/ControllerTaskTest.java
deleted file mode 100644
index 17ab79cb04d..00000000000
--- a/tests/robotests/src/com/android/settings/dashboard/ControllerTaskTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2019 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.dashboard;
-
-import static com.android.settingslib.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceManager;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settingslib.core.AbstractPreferenceController;
-
-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 class ControllerTaskTest {
- private static final String KEY = "my_key";
-
- private Context mContext;
- private PreferenceScreen mScreen;
- private TestPreferenceController mTestController;
- private ControllerTask mControllerTask;
-
- @Before
- public void setUp() {
- mContext = RuntimeEnvironment.application;
- final PreferenceManager preferenceManager = new PreferenceManager(mContext);
- mScreen = preferenceManager.createPreferenceScreen(mContext);
- mTestController = spy(new TestPreferenceController(mContext));
- mControllerTask = new ControllerTask(mTestController, mScreen, null /* metricsFeature */,
- METRICS_CATEGORY_UNKNOWN);
- }
-
- @Test
- public void doRun_controlNotAvailable_noRunUpdateState() {
- mTestController.setAvailable(false);
-
- mControllerTask.run();
-
- verify(mTestController, never()).updateState(any(Preference.class));
- }
-
- @Test
- public void doRun_emptyKey_noRunUpdateState() {
- mTestController.setKey("");
-
- mControllerTask.run();
-
- verify(mTestController, never()).updateState(any(Preference.class));
- }
-
- @Test
- public void doRun_preferenceNotExist_noRunUpdateState() {
- mTestController.setKey(KEY);
-
- mControllerTask.run();
-
- verify(mTestController, never()).updateState(any(Preference.class));
- }
-
- @Test
- public void doRun_executeUpdateState() {
- mTestController.setKey(KEY);
- final Preference preference = new Preference(mContext);
- preference.setKey(KEY);
- mScreen.addPreference(preference);
-
- mControllerTask.run();
-
- verify(mTestController).updateState(any(Preference.class));
- }
-
- static class TestPreferenceController extends AbstractPreferenceController {
- private boolean mAvailable;
- private String mKey;
-
- TestPreferenceController(Context context) {
- super(context);
- mAvailable = true;
- }
-
- @Override
- public boolean isAvailable() {
- return mAvailable;
- }
-
- @Override
- public String getPreferenceKey() {
- return mKey;
- }
-
- void setAvailable(boolean available) {
- mAvailable = available;
- }
-
- void setKey(String key) {
- mKey = key;
- }
- }
-}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
index aa5f980f8d0..894a6c557df 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
@@ -390,7 +390,6 @@ public class DashboardFragmentTest {
private final ContentResolver mContentResolver;
public final PreferenceScreen mScreen;
- private boolean mIsParalleled;
public TestFragment(Context context) {
mContext = context;
@@ -398,7 +397,6 @@ public class DashboardFragmentTest {
mScreen = mock(PreferenceScreen.class);
mContentResolver = mock(ContentResolver.class);
mControllers = new ArrayList<>();
- mIsParalleled = true;
when(mPreferenceManager.getContext()).thenReturn(mContext);
ReflectionHelpers.setField(
@@ -445,13 +443,6 @@ public class DashboardFragmentTest {
return mContentResolver;
}
- protected boolean isParalleledControllers() {
- return mIsParalleled;
- }
-
- void setUsingControllerEnhancement(boolean isParalleled) {
- mIsParalleled = isParalleled;
- }
}
private static class TestDynamicDataObserver extends DynamicDataObserver {
diff --git a/tests/robotests/src/com/android/settings/development/StylusHandwritingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/StylusHandwritingPreferenceControllerTest.java
new file mode 100644
index 00000000000..12b5fe9e0a8
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/StylusHandwritingPreferenceControllerTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.development;
+
+import static com.android.settings.development.StylusHandwritingPreferenceController.SETTING_VALUE_OFF;
+import static com.android.settings.development.StylusHandwritingPreferenceController.SETTING_VALUE_ON;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class StylusHandwritingPreferenceControllerTest {
+
+ @Mock
+ private SwitchPreference mPreference;
+ @Mock
+ private PreferenceScreen mPreferenceScreen;
+
+ private Context mContext;
+ private StylusHandwritingPreferenceController mController;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mController = new StylusHandwritingPreferenceController(mContext);
+ when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
+ .thenReturn(mPreference);
+ mController.displayPreference(mPreferenceScreen);
+ }
+
+ @Test
+ public void onPreferenceChange_settingEnabled_stylusHandwritingShouldBeOn() {
+ mController.onPreferenceChange(mPreference, true /* new value */);
+
+ final int mode = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.STYLUS_HANDWRITING_ENABLED, -1 /* default */);
+
+ assertThat(mode).isEqualTo(SETTING_VALUE_ON);
+ }
+
+ @Test
+ public void onPreferenceChange_settingEnabled_stylusHandwritingShouldBeOff() {
+ mController.onPreferenceChange(mPreference, false /* new value */);
+
+ final int mode = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.STYLUS_HANDWRITING_ENABLED, -1 /* default */);
+
+ assertThat(mode).isEqualTo(SETTING_VALUE_OFF);
+ }
+
+ @Test
+ public void updateState_settingDisabled_preferenceShouldNotBeChecked() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.STYLUS_HANDWRITING_ENABLED, SETTING_VALUE_OFF);
+ mController.updateState(mPreference);
+
+ verify(mPreference).setChecked(false);
+ }
+
+ @Test
+ public void updateState_settingEnabled_preferenceShouldBeChecked() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.STYLUS_HANDWRITING_ENABLED, SETTING_VALUE_ON);
+ mController.updateState(mPreference);
+
+ verify(mPreference).setChecked(true);
+ }
+
+ @Test
+ public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() {
+ mController.onDeveloperOptionsSwitchDisabled();
+
+ final int mode = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.STYLUS_HANDWRITING_ENABLED, -1 /* default */);
+
+ assertThat(mode).isEqualTo(SETTING_VALUE_OFF);
+ verify(mPreference).setChecked(false);
+ verify(mPreference).setEnabled(false);
+ }
+}