diff --git a/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java b/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java index 0a0e2081a8f..985c8b713dc 100644 --- a/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java +++ b/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java @@ -45,6 +45,7 @@ import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.dashboard.profileselector.ProfileSelectDialog; import com.android.settings.dashboard.profileselector.UserAdapter; +import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.core.AbstractPreferenceController; @@ -59,7 +60,8 @@ import java.util.List; * This class adds stylus preferences. */ public class StylusDevicesController extends AbstractPreferenceController implements - Preference.OnPreferenceClickListener, LifecycleObserver, OnResume { + Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener, + LifecycleObserver, OnResume { @VisibleForTesting static final String KEY_STYLUS = "device_stylus"; @@ -138,11 +140,15 @@ public class StylusDevicesController extends AbstractPreferenceController implem return pref; } - private SwitchPreference createOrUpdateHandwritingPreference(SwitchPreference preference) { - SwitchPreference pref = preference == null ? new SwitchPreference(mContext) : preference; + private PrimarySwitchPreference createOrUpdateHandwritingPreference( + PrimarySwitchPreference preference) { + PrimarySwitchPreference pref = preference == null ? new PrimarySwitchPreference(mContext) + : preference; pref.setKey(KEY_HANDWRITING); pref.setTitle(mContext.getString(R.string.stylus_textfield_handwriting)); pref.setIcon(R.drawable.ic_text_fields_alt); + // Using a two-target preference, clicking will send an intent and change will toggle. + pref.setOnPreferenceChangeListener(this); pref.setOnPreferenceClickListener(this); pref.setChecked(Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.STYLUS_HANDWRITING_ENABLED, @@ -165,7 +171,6 @@ public class StylusDevicesController extends AbstractPreferenceController implem @Override public boolean onPreferenceClick(Preference preference) { String key = preference.getKey(); - switch (key) { case KEY_DEFAULT_NOTES: PackageManager pm = mContext.getPackageManager(); @@ -181,20 +186,13 @@ public class StylusDevicesController extends AbstractPreferenceController implem } break; case KEY_HANDWRITING: - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.STYLUS_HANDWRITING_ENABLED, - ((SwitchPreference) preference).isChecked() ? 1 : 0); - - if (((SwitchPreference) preference).isChecked()) { - InputMethodManager imm = mContext.getSystemService(InputMethodManager.class); - InputMethodInfo inputMethod = imm.getCurrentInputMethodInfo(); - if (inputMethod == null) break; - - Intent handwritingIntent = - inputMethod.createStylusHandwritingSettingsActivityIntent(); - if (handwritingIntent != null) { - mContext.startActivity(handwritingIntent); - } + InputMethodManager imm = mContext.getSystemService(InputMethodManager.class); + InputMethodInfo inputMethod = imm.getCurrentInputMethodInfo(); + if (inputMethod == null) break; + Intent handwritingIntent = + inputMethod.createStylusHandwritingSettingsActivityIntent(); + if (handwritingIntent != null) { + mContext.startActivity(handwritingIntent); } break; case KEY_IGNORE_BUTTON: @@ -206,6 +204,19 @@ public class StylusDevicesController extends AbstractPreferenceController implem return true; } + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + String key = preference.getKey(); + switch (key) { + case KEY_HANDWRITING: + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.STYLUS_HANDWRITING_ENABLED, + (boolean) newValue ? 1 : 0); + break; + } + return true; + } + @Override public final void displayPreference(PreferenceScreen screen) { mPreferencesContainer = (PreferenceCategory) screen.findPreference(getPreferenceKey()); @@ -233,7 +244,7 @@ public class StylusDevicesController extends AbstractPreferenceController implem mPreferencesContainer.addPreference(notesPref); } - SwitchPreference currHandwritingPref = mPreferencesContainer.findPreference( + PrimarySwitchPreference currHandwritingPref = mPreferencesContainer.findPreference( KEY_HANDWRITING); Preference handwritingPref = createOrUpdateHandwritingPreference(currHandwritingPref); if (currHandwritingPref == null) { @@ -328,5 +339,4 @@ public class StylusDevicesController extends AbstractPreferenceController implem return false; } - } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java index 3c459de3792..9538092c361 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java @@ -57,6 +57,7 @@ import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; import com.android.settings.dashboard.profileselector.UserAdapter; +import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -403,9 +404,10 @@ public class StylusDevicesControllerTest { Settings.Secure.STYLUS_HANDWRITING_ENABLED, 1); showScreen(mController); - SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1); + PrimarySwitchPreference handwritingPref = + (PrimarySwitchPreference) mPreferenceContainer.getPreference(1); - assertThat(handwritingPref.isChecked()).isEqualTo(true); + assertThat(handwritingPref.getCheckedState()).isEqualTo(true); } @Test @@ -414,9 +416,10 @@ public class StylusDevicesControllerTest { Settings.Secure.STYLUS_HANDWRITING_ENABLED, 0); showScreen(mController); - SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1); + PrimarySwitchPreference handwritingPref = + (PrimarySwitchPreference) mPreferenceContainer.getPreference(1); - assertThat(handwritingPref.isChecked()).isEqualTo(false); + assertThat(handwritingPref.getCheckedState()).isEqualTo(false); } @Test @@ -424,21 +427,20 @@ public class StylusDevicesControllerTest { Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.STYLUS_HANDWRITING_ENABLED, 0); showScreen(mController); - SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1); + PrimarySwitchPreference handwritingPref = + (PrimarySwitchPreference) mPreferenceContainer.getPreference(1); - handwritingPref.performClick(); + handwritingPref.callChangeListener(true); - assertThat(handwritingPref.isChecked()).isEqualTo(true); assertThat(Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.STYLUS_HANDWRITING_ENABLED, -1)).isEqualTo(1); } @Test - public void handwritingPreference_startsHandwritingSettingsOnClickIfChecked() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.STYLUS_HANDWRITING_ENABLED, 0); + public void handwritingPreference_startsHandwritingSettingsOnClick() { showScreen(mController); - SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1); + PrimarySwitchPreference handwritingPref = + (PrimarySwitchPreference) mPreferenceContainer.getPreference(1); handwritingPref.performClick(); @@ -447,11 +449,23 @@ public class StylusDevicesControllerTest { } @Test - public void handwritingPreference_doesNotStartHandwritingSettingsOnClickIfNotChecked() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.STYLUS_HANDWRITING_ENABLED, 1); + public void handwritingPreference_doesNotStartHandwritingSettingsOnChange() { showScreen(mController); - SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1); + PrimarySwitchPreference handwritingPref = + (PrimarySwitchPreference) mPreferenceContainer.getPreference(1); + + handwritingPref.callChangeListener(true); + + verify(mInputMethodInfo, times(0)).createStylusHandwritingSettingsActivityIntent(); + verify(mContext, times(0)).startActivity(any()); + } + + @Test + public void handwritingPreference_doesNotCreateIntentIfNoInputMethod() { + when(mImm.getCurrentInputMethodInfo()).thenReturn(null); + showScreen(mController); + PrimarySwitchPreference handwritingPref = + (PrimarySwitchPreference) mPreferenceContainer.getPreference(1); handwritingPref.performClick(); @@ -463,14 +477,12 @@ public class StylusDevicesControllerTest { public void handwritingPreference_doesNotStartHandwritingSettingsIfNoIntent() { when(mInputMethodInfo.createStylusHandwritingSettingsActivityIntent()) .thenReturn(null); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.STYLUS_HANDWRITING_ENABLED, 1); showScreen(mController); - SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1); + PrimarySwitchPreference handwritingPref = + (PrimarySwitchPreference) mPreferenceContainer.getPreference(1); handwritingPref.performClick(); - verify(mInputMethodInfo, times(0)).createStylusHandwritingSettingsActivityIntent(); verify(mContext, times(0)).startActivity(any()); }