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