Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b52104b authored by Vania Januar's avatar Vania Januar
Browse files

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
parent c3f6c0d5
Loading
Loading
Loading
Loading
+28 −7
Original line number Diff line number Diff line
@@ -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}.
+59 −10
Original line number Diff line number Diff line
@@ -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() {
    public void btStylusInputDevice_noHandwritingIme_handwritingPrefNotVisible() {
        when(mInputMethodInfo.supportsStylusHandwriting()).thenReturn(false);

        showScreen(mController);
        Preference defaultNotesPref = mPreferenceContainer.getPreference(0);
        Preference buttonPref = mPreferenceContainer.getPreference(1);
        Preference handwritingPref = mPreferenceContainer.getPreference(1);

        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));
        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(),