Show Scribe toggle in Stylus settings only if supported by current IME.

This also sends the user to the Scribe settings activity if
a settings activity exists for the current IME.

Bug: 255732419
Test: StylusDevicesControllerTest
Change-Id: I955a0f5a017b247e7623d66613e09dc0f7256ff2
This commit is contained in:
Vania Januar
2023-01-09 14:24:18 +00:00
parent c3f6c0d593
commit 5b52104be1
2 changed files with 88 additions and 18 deletions

View File

@@ -27,6 +27,8 @@ import android.provider.Settings.Secure;
import android.text.TextUtils;
import android.util.Log;
import android.view.InputDevice;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
@@ -118,14 +120,15 @@ public class StylusDevicesController extends AbstractPreferenceController implem
return pref;
}
private SwitchPreference createHandwritingPreference() {
SwitchPreference pref = new SwitchPreference(mContext);
private SwitchPreference createOrUpdateHandwritingPreference(SwitchPreference preference) {
SwitchPreference pref = preference == null ? new SwitchPreference(mContext) : preference;
pref.setKey(KEY_HANDWRITING);
pref.setTitle(mContext.getString(R.string.stylus_textfield_handwriting));
pref.setIcon(R.drawable.ic_text_fields_alt);
pref.setOnPreferenceClickListener(this);
pref.setChecked(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.STYLUS_HANDWRITING_ENABLED, 0) == 1);
pref.setVisible(currentInputMethodSupportsHandwriting());
return pref;
}
@@ -156,6 +159,18 @@ public class StylusDevicesController extends AbstractPreferenceController implem
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.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);
}
}
break;
case KEY_IGNORE_BUTTON:
Settings.Secure.putInt(mContext.getContentResolver(),
@@ -195,11 +210,11 @@ public class StylusDevicesController extends AbstractPreferenceController implem
}
}
Preference handwritingPref = mPreferencesContainer.findPreference(KEY_HANDWRITING);
// TODO(b/255732419): add proper InputMethodInfo conditional to show or hide
// InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
if (handwritingPref == null) {
mPreferencesContainer.addPreference(createHandwritingPreference());
SwitchPreference currHandwritingPref = mPreferencesContainer.findPreference(
KEY_HANDWRITING);
Preference handwritingPref = createOrUpdateHandwritingPreference(currHandwritingPref);
if (currHandwritingPref == null) {
mPreferencesContainer.addPreference(handwritingPref);
}
Preference buttonPref = mPreferencesContainer.findPreference(KEY_IGNORE_BUTTON);
@@ -208,6 +223,12 @@ public class StylusDevicesController extends AbstractPreferenceController implem
}
}
private boolean currentInputMethodSupportsHandwriting() {
InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
InputMethodInfo inputMethod = imm.getCurrentInputMethodInfo();
return inputMethod != null && inputMethod.supportsStylusHandwriting();
}
/**
* Identifies whether a device is a stylus using the associated {@link InputDevice} or
* {@link CachedBluetoothDevice}.

View File

@@ -21,7 +21,9 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -35,6 +37,7 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.provider.Settings.Secure;
import android.view.InputDevice;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import androidx.preference.Preference;
@@ -49,7 +52,6 @@ import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -73,6 +75,8 @@ public class StylusDevicesControllerTest {
@Mock
private InputMethodManager mImm;
@Mock
private InputMethodInfo mInputMethodInfo;
@Mock
private PackageManager mPm;
@Mock
private RoleManager mRm;
@@ -99,6 +103,11 @@ public class StylusDevicesControllerTest {
when(mContext.getSystemService(RoleManager.class)).thenReturn(mRm);
doNothing().when(mContext).startActivity(any());
when(mImm.getCurrentInputMethodInfo()).thenReturn(mInputMethodInfo);
when(mInputMethodInfo.createStylusHandwritingSettingsActivityIntent())
.thenReturn(mock(Intent.class));
when(mInputMethodInfo.supportsStylusHandwriting()).thenReturn(true);
when(mRm.getRoleHoldersAsUser(eq(RoleManager.ROLE_NOTES), any(UserHandle.class)))
.thenReturn(Collections.singletonList(NOTES_PACKAGE_NAME));
when(mContext.getPackageManager()).thenReturn(mPm);
@@ -204,24 +213,23 @@ public class StylusDevicesControllerTest {
assertThat(mPreferenceContainer.getPreferenceCount()).isEqualTo(3);
assertThat(defaultNotesPref.getTitle().toString()).isEqualTo(
mContext.getString(R.string.stylus_default_notes_app));
assertThat(defaultNotesPref.isVisible()).isTrue();
assertThat(handwritingPref.getTitle().toString()).isEqualTo(
mContext.getString(R.string.stylus_textfield_handwriting));
assertThat(handwritingPref.isVisible()).isTrue();
assertThat(buttonPref.getTitle().toString()).isEqualTo(
mContext.getString(R.string.stylus_ignore_button));
assertThat(buttonPref.isVisible()).isTrue();
}
@Test
@Ignore // TODO(b/255732419): unignore when InputMethodInfo available
public void btStylusInputDevice_noHandwritingIme_showsSomePreferences() {
showScreen(mController);
Preference defaultNotesPref = mPreferenceContainer.getPreference(0);
Preference buttonPref = mPreferenceContainer.getPreference(1);
public void btStylusInputDevice_noHandwritingIme_handwritingPrefNotVisible() {
when(mInputMethodInfo.supportsStylusHandwriting()).thenReturn(false);
assertThat(mPreferenceContainer.getPreferenceCount()).isEqualTo(2);
assertThat(defaultNotesPref.getTitle().toString()).isEqualTo(
mContext.getString(R.string.stylus_default_notes_app));
assertThat(buttonPref.getTitle().toString()).isEqualTo(
mContext.getString(R.string.stylus_ignore_button));
showScreen(mController);
Preference handwritingPref = mPreferenceContainer.getPreference(1);
assertThat(handwritingPref.isVisible()).isFalse();
}
@Test
@@ -301,6 +309,47 @@ public class StylusDevicesControllerTest {
Settings.Global.STYLUS_HANDWRITING_ENABLED, -1)).isEqualTo(1);
}
@Test
public void handwritingPreference_startsHandwritingSettingsOnClickIfChecked() {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.STYLUS_HANDWRITING_ENABLED, 0);
showScreen(mController);
SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1);
handwritingPref.performClick();
verify(mInputMethodInfo).createStylusHandwritingSettingsActivityIntent();
verify(mContext).startActivity(any());
}
@Test
public void handwritingPreference_doesNotStartHandwritingSettingsOnClickIfNotChecked() {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.STYLUS_HANDWRITING_ENABLED, 1);
showScreen(mController);
SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1);
handwritingPref.performClick();
verify(mInputMethodInfo, times(0)).createStylusHandwritingSettingsActivityIntent();
verify(mContext, times(0)).startActivity(any());
}
@Test
public void handwritingPreference_doesNotStartHandwritingSettingsIfNoIntent() {
when(mInputMethodInfo.createStylusHandwritingSettingsActivityIntent())
.thenReturn(null);
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.STYLUS_HANDWRITING_ENABLED, 1);
showScreen(mController);
SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1);
handwritingPref.performClick();
verify(mInputMethodInfo, times(0)).createStylusHandwritingSettingsActivityIntent();
verify(mContext, times(0)).startActivity(any());
}
@Test
public void buttonsPreference_checkedWhenFlagTrue() {
Settings.Secure.putInt(mContext.getContentResolver(),