Snap for 10635039 from 9652e9c719 to udc-qpr1-release

Change-Id: Ib5febe5b1eb27fe16a7ed68829fa118b399d2433
This commit is contained in:
Android Build Coastguard Worker
2023-08-09 23:20:37 +00:00
4 changed files with 186 additions and 52 deletions

View File

@@ -21,6 +21,7 @@ import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRIN
import static com.android.settings.password.ChooseLockPattern.RESULT_FINISHED; import static com.android.settings.password.ChooseLockPattern.RESULT_FINISHED;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.hardware.biometrics.SensorProperties; import android.hardware.biometrics.SensorProperties;
@@ -179,6 +180,12 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
} }
mFaceManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> { mFaceManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
final Activity activity = getActivity();
if (activity == null || activity.isFinishing()) {
Log.e(getLogTag(), "Stop during generating face unlock challenge"
+ " because activity is null or finishing");
return;
}
try { try {
final byte[] token = requestGatekeeperHat(context, mGkPwHandle, mUserId, final byte[] token = requestGatekeeperHat(context, mGkPwHandle, mUserId,
challenge); challenge);
@@ -215,6 +222,12 @@ public abstract class BiometricsSettingsBase extends DashboardFragment {
} }
mFingerprintManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> { mFingerprintManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
final Activity activity = getActivity();
if (activity == null || activity.isFinishing()) {
Log.e(getLogTag(), "Stop during generating fingerprint challenge"
+ " because activity is null or finishing");
return;
}
try { try {
final byte[] token = requestGatekeeperHat(context, mGkPwHandle, mUserId, final byte[] token = requestGatekeeperHat(context, mGkPwHandle, mUserId,
challenge); challenge);

View File

@@ -45,6 +45,7 @@ import androidx.preference.SwitchPreference;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.dashboard.profileselector.ProfileSelectDialog; import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
import com.android.settings.dashboard.profileselector.UserAdapter; import com.android.settings.dashboard.profileselector.UserAdapter;
import com.android.settingslib.PrimarySwitchPreference;
import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
@@ -59,7 +60,8 @@ import java.util.List;
* This class adds stylus preferences. * This class adds stylus preferences.
*/ */
public class StylusDevicesController extends AbstractPreferenceController implements public class StylusDevicesController extends AbstractPreferenceController implements
Preference.OnPreferenceClickListener, LifecycleObserver, OnResume { Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener,
LifecycleObserver, OnResume {
@VisibleForTesting @VisibleForTesting
static final String KEY_STYLUS = "device_stylus"; static final String KEY_STYLUS = "device_stylus";
@@ -138,11 +140,15 @@ public class StylusDevicesController extends AbstractPreferenceController implem
return pref; return pref;
} }
private SwitchPreference createOrUpdateHandwritingPreference(SwitchPreference preference) { private PrimarySwitchPreference createOrUpdateHandwritingPreference(
SwitchPreference pref = preference == null ? new SwitchPreference(mContext) : preference; PrimarySwitchPreference preference) {
PrimarySwitchPreference pref = preference == null ? new PrimarySwitchPreference(mContext)
: preference;
pref.setKey(KEY_HANDWRITING); pref.setKey(KEY_HANDWRITING);
pref.setTitle(mContext.getString(R.string.stylus_textfield_handwriting)); pref.setTitle(mContext.getString(R.string.stylus_textfield_handwriting));
pref.setIcon(R.drawable.ic_text_fields_alt); 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.setOnPreferenceClickListener(this);
pref.setChecked(Settings.Secure.getInt(mContext.getContentResolver(), pref.setChecked(Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.STYLUS_HANDWRITING_ENABLED, Settings.Secure.STYLUS_HANDWRITING_ENABLED,
@@ -165,7 +171,6 @@ public class StylusDevicesController extends AbstractPreferenceController implem
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
String key = preference.getKey(); String key = preference.getKey();
switch (key) { switch (key) {
case KEY_DEFAULT_NOTES: case KEY_DEFAULT_NOTES:
PackageManager pm = mContext.getPackageManager(); PackageManager pm = mContext.getPackageManager();
@@ -181,20 +186,13 @@ public class StylusDevicesController extends AbstractPreferenceController implem
} }
break; break;
case KEY_HANDWRITING: case KEY_HANDWRITING:
Settings.Secure.putInt(mContext.getContentResolver(), InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
Settings.Secure.STYLUS_HANDWRITING_ENABLED, InputMethodInfo inputMethod = imm.getCurrentInputMethodInfo();
((SwitchPreference) preference).isChecked() ? 1 : 0); if (inputMethod == null) break;
Intent handwritingIntent =
if (((SwitchPreference) preference).isChecked()) { inputMethod.createStylusHandwritingSettingsActivityIntent();
InputMethodManager imm = mContext.getSystemService(InputMethodManager.class); if (handwritingIntent != null) {
InputMethodInfo inputMethod = imm.getCurrentInputMethodInfo(); mContext.startActivity(handwritingIntent);
if (inputMethod == null) break;
Intent handwritingIntent =
inputMethod.createStylusHandwritingSettingsActivityIntent();
if (handwritingIntent != null) {
mContext.startActivity(handwritingIntent);
}
} }
break; break;
case KEY_IGNORE_BUTTON: case KEY_IGNORE_BUTTON:
@@ -206,6 +204,19 @@ public class StylusDevicesController extends AbstractPreferenceController implem
return true; 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 @Override
public final void displayPreference(PreferenceScreen screen) { public final void displayPreference(PreferenceScreen screen) {
mPreferencesContainer = (PreferenceCategory) screen.findPreference(getPreferenceKey()); mPreferencesContainer = (PreferenceCategory) screen.findPreference(getPreferenceKey());
@@ -233,7 +244,7 @@ public class StylusDevicesController extends AbstractPreferenceController implem
mPreferencesContainer.addPreference(notesPref); mPreferencesContainer.addPreference(notesPref);
} }
SwitchPreference currHandwritingPref = mPreferencesContainer.findPreference( PrimarySwitchPreference currHandwritingPref = mPreferencesContainer.findPreference(
KEY_HANDWRITING); KEY_HANDWRITING);
Preference handwritingPref = createOrUpdateHandwritingPreference(currHandwritingPref); Preference handwritingPref = createOrUpdateHandwritingPreference(currHandwritingPref);
if (currHandwritingPref == null) { if (currHandwritingPref == null) {
@@ -328,5 +339,4 @@ public class StylusDevicesController extends AbstractPreferenceController implem
return false; return false;
} }
} }

View File

@@ -43,6 +43,7 @@ import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.os.Bundle; import android.os.Bundle;
import android.util.AndroidRuntimeException;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@@ -58,7 +59,10 @@ import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.biometrics.BiometricStatusPreferenceController;
import com.android.settings.biometrics.BiometricsSplitScreenDialog; import com.android.settings.biometrics.BiometricsSplitScreenDialog;
import com.android.settings.biometrics.face.FaceStatusPreferenceController;
import com.android.settings.biometrics.fingerprint.FingerprintStatusPreferenceController;
import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowFragment; import com.android.settings.testutils.shadow.ShadowFragment;
@@ -68,7 +72,6 @@ import com.android.settingslib.core.AbstractPreferenceController;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -86,7 +89,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@Ignore
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowSettingsPreferenceFragment.class, ShadowUtils.class, ShadowFragment.class}) @Config(shadows = {ShadowSettingsPreferenceFragment.class, ShadowUtils.class, ShadowFragment.class})
public class CombinedBiometricProfileSettingsTest { public class CombinedBiometricProfileSettingsTest {
@@ -104,6 +106,10 @@ public class CombinedBiometricProfileSettingsTest {
@Mock @Mock
private BiometricSettingsAppPreferenceController mBiometricSettingsAppPreferenceController; private BiometricSettingsAppPreferenceController mBiometricSettingsAppPreferenceController;
@Mock @Mock
private FingerprintStatusPreferenceController mFingerprintStatusPreferenceController;
@Mock
private FaceStatusPreferenceController mFaceStatusPreferenceController;
@Mock
private FaceManager mFaceManager; private FaceManager mFaceManager;
@Mock @Mock
private FragmentTransaction mFragmentTransaction; private FragmentTransaction mFragmentTransaction;
@@ -128,6 +134,29 @@ public class CombinedBiometricProfileSettingsTest {
List<AbstractPreferenceController> controllerList = new ArrayList<>(); List<AbstractPreferenceController> controllerList = new ArrayList<>();
controllerList.add(mBiometricSettingsAppPreferenceController); controllerList.add(mBiometricSettingsAppPreferenceController);
preferenceControllers.put(BiometricSettingsAppPreferenceController.class, controllerList); preferenceControllers.put(BiometricSettingsAppPreferenceController.class, controllerList);
controllerList.add(mFingerprintStatusPreferenceController);
preferenceControllers.put(FingerprintStatusPreferenceController.class, controllerList);
controllerList.add(mFaceStatusPreferenceController);
preferenceControllers.put(FaceStatusPreferenceController.class, controllerList);
doAnswer(invocation -> {
final Preference preference = invocation.getArgument(0);
return preference.getKey().equals(mFragment.getFingerprintPreferenceKey());
}).when(mFingerprintStatusPreferenceController)
.setPreferenceTreeClickLauncher(any(), any());
doAnswer(invocation -> {
final Preference preference = invocation.getArgument(0);
return preference.getKey().equals(mFragment.getFingerprintPreferenceKey());
}).when(mFingerprintStatusPreferenceController).handlePreferenceTreeClick(any());
doAnswer(invocation -> {
final Preference preference = invocation.getArgument(0);
return preference.getKey().equals(mFragment.getFacePreferenceKey());
}).when(mFaceStatusPreferenceController)
.setPreferenceTreeClickLauncher(any(), any());
doAnswer(invocation -> {
final Preference preference = invocation.getArgument(0);
return preference.getKey().equals(mFragment.getFacePreferenceKey());
}).when(mFaceStatusPreferenceController).handlePreferenceTreeClick(any());
doAnswer(invocation -> { doAnswer(invocation -> {
final CharSequence key = invocation.getArgument(0); final CharSequence key = invocation.getArgument(0);
@@ -164,7 +193,7 @@ public class CombinedBiometricProfileSettingsTest {
preference.setKey(mFragment.getFingerprintPreferenceKey()); preference.setKey(mFragment.getFingerprintPreferenceKey());
mFragment.onPreferenceTreeClick(preference); mFragment.onPreferenceTreeClick(preference);
verify(mBiometricSettingsAppPreferenceController).handlePreferenceTreeClick( verify(mFingerprintStatusPreferenceController).handlePreferenceTreeClick(
mPreferenceCaptor.capture()); mPreferenceCaptor.capture());
List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues(); List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues();
@@ -224,7 +253,7 @@ public class CombinedBiometricProfileSettingsTest {
mFragment.onActivityResult(CONFIRM_REQUEST, RESULT_FINISHED, mFragment.onActivityResult(CONFIRM_REQUEST, RESULT_FINISHED,
new Intent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, 1L)); new Intent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, 1L));
verify(mBiometricSettingsAppPreferenceController).handlePreferenceTreeClick( verify(mFingerprintStatusPreferenceController).handlePreferenceTreeClick(
mPreferenceCaptor.capture()); mPreferenceCaptor.capture());
List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues(); List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues();
assertThat(capturedPreferences.size()).isEqualTo(1); assertThat(capturedPreferences.size()).isEqualTo(1);
@@ -254,7 +283,7 @@ public class CombinedBiometricProfileSettingsTest {
preference.setKey(mFragment.getFacePreferenceKey()); preference.setKey(mFragment.getFacePreferenceKey());
mFragment.onPreferenceTreeClick(preference); mFragment.onPreferenceTreeClick(preference);
verify(mBiometricSettingsAppPreferenceController).handlePreferenceTreeClick( verify(mFaceStatusPreferenceController).handlePreferenceTreeClick(
mPreferenceCaptor.capture()); mPreferenceCaptor.capture());
List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues(); List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues();
assertThat(capturedPreferences.size()).isEqualTo(1); assertThat(capturedPreferences.size()).isEqualTo(1);
@@ -313,7 +342,7 @@ public class CombinedBiometricProfileSettingsTest {
preference.setKey(mFragment.getFacePreferenceKey()); preference.setKey(mFragment.getFacePreferenceKey());
mFragment.onPreferenceTreeClick(preference); mFragment.onPreferenceTreeClick(preference);
verify(mBiometricSettingsAppPreferenceController).handlePreferenceTreeClick( verify(mFaceStatusPreferenceController).handlePreferenceTreeClick(
mPreferenceCaptor.capture()); mPreferenceCaptor.capture());
List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues(); List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues();
assertThat(capturedPreferences.size()).isEqualTo(1); assertThat(capturedPreferences.size()).isEqualTo(1);
@@ -323,7 +352,7 @@ public class CombinedBiometricProfileSettingsTest {
@Test @Test
public void testClickFingerprintUnlock_inMultiWindow_withoutEnrolledFp_showsDialog() { public void testClickFingerprintUnlock_inMultiWindow_withoutEnrolledFp_showsDialog() {
testClickFingerprintUnlock(true /* isInMultiWindow */, false /* hasEnrolledFingerprint */); testClickFingerprintUnlock(true /* isInMultiWindow */, false /* hasEnrolledFingerprint */);
verifyShowsDialogAfterClickingUnlock(); verifyShowsDialogAfterClickingUnlock(mFragment.getFingerprintPreferenceKey());
} }
@Test @Test
@@ -380,7 +409,7 @@ public class CombinedBiometricProfileSettingsTest {
@Test @Test
public void testClickFaceUnlock_inMultiWindow_withoutEnrolledFp_showsDialog() { public void testClickFaceUnlock_inMultiWindow_withoutEnrolledFp_showsDialog() {
testClickFaceUnlock(true /* isInMultiWindow */, false /*hasEnrolledFace*/); testClickFaceUnlock(true /* isInMultiWindow */, false /*hasEnrolledFace*/);
verifyShowsDialogAfterClickingUnlock(); verifyShowsDialogAfterClickingUnlock(mFragment.getFacePreferenceKey());
} }
@Test @Test
@@ -424,8 +453,11 @@ public class CombinedBiometricProfileSettingsTest {
} }
private void verifyNoDialogAfterClickingUnlock(String preferenceKey) { private void verifyNoDialogAfterClickingUnlock(String preferenceKey) {
verify(mBiometricSettingsAppPreferenceController).handlePreferenceTreeClick( final BiometricStatusPreferenceController controller =
mPreferenceCaptor.capture()); preferenceKey.equals(mFragment.getFacePreferenceKey())
? mFaceStatusPreferenceController
: mFingerprintStatusPreferenceController;
verify(controller).handlePreferenceTreeClick(mPreferenceCaptor.capture());
List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues(); List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues();
assertThat(capturedPreferences).hasSize(1); assertThat(capturedPreferences).hasSize(1);
assertThat(capturedPreferences.get(0).getKey()).isEqualTo(preferenceKey); assertThat(capturedPreferences.get(0).getKey()).isEqualTo(preferenceKey);
@@ -433,12 +465,77 @@ public class CombinedBiometricProfileSettingsTest {
eq(BiometricsSplitScreenDialog.class.getName())); eq(BiometricsSplitScreenDialog.class.getName()));
} }
private void verifyShowsDialogAfterClickingUnlock() { private void verifyShowsDialogAfterClickingUnlock(String preferenceKey) {
verify(mBiometricSettingsAppPreferenceController, never()).handlePreferenceTreeClick(any()); final BiometricStatusPreferenceController controller =
preferenceKey.equals(mFragment.getFacePreferenceKey())
? mFaceStatusPreferenceController
: mFingerprintStatusPreferenceController;
verify(controller, never()).handlePreferenceTreeClick(any());
verify(mFragmentTransaction).add(any(), verify(mFragmentTransaction).add(any(),
eq(BiometricsSplitScreenDialog.class.getName())); eq(BiometricsSplitScreenDialog.class.getName()));
} }
@Test
public void testNoCrashIfDetachActivityDuringGeneratingChallengeThroughFaceManager() {
doAnswer(invocation -> {
final FaceManager.GenerateChallengeCallback callback =
invocation.getArgument(1);
mFragment.onPause();
mFragment.onStop();
mFragment.onDestroy();
mFragment.onDetach();
doReturn(null).when(mFragment).getActivity();
callback.onGenerateChallengeResult(0, 0, 1L);
return null;
}).when(mFaceManager).generateChallenge(anyInt(), any());
doThrow(new IllegalStateException("Test")).when(mFragment).requestGatekeeperHat(
any(), anyLong(), anyInt(), anyLong());
FragmentManager fragmentManager = mock(FragmentManager.class);
// Start fragment
mFragment.onAttach(mContext);
mFragment.onCreate(null);
mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY);
mFragment.onResume();
// User clicks on "Face Unlock"
final Preference preference = new Preference(mContext);
preference.setKey(mFragment.getFacePreferenceKey());
mFragment.onPreferenceTreeClick(preference);
verify(mFragment, never()).launchChooseOrConfirmLock();
}
@Test
public void testNoCrashIfDetachActivityDuringGeneratingChallengeThroughFingerprintManager() {
doAnswer(invocation -> {
final FingerprintManager.GenerateChallengeCallback callback =
invocation.getArgument(1);
mFragment.onPause();
mFragment.onStop();
mFragment.onDestroy();
mFragment.onDetach();
doReturn(null).when(mFragment).getActivity();
callback.onChallengeGenerated(0, 0, 1L);
return null;
}).when(mFingerprintManager).generateChallenge(anyInt(), any());
doThrow(new IllegalStateException("Test")).when(mFragment).requestGatekeeperHat(
any(), anyLong(), anyInt(), anyLong());
// Start fragment
mFragment.onAttach(mContext);
mFragment.onCreate(null);
mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY);
mFragment.onResume();
// User clicks on "Fingerprint Unlock"
final Preference preference = new Preference(mContext);
preference.setKey(mFragment.getFingerprintPreferenceKey());
mFragment.onPreferenceTreeClick(preference);
verify(mFragment, never()).launchChooseOrConfirmLock();
}
/** /**
* a test fragment that initializes PreferenceScreen for testing. * a test fragment that initializes PreferenceScreen for testing.
*/ */
@@ -492,7 +589,9 @@ public class CombinedBiometricProfileSettingsTest {
@Override @Override
protected void launchChooseOrConfirmLock() { protected void launchChooseOrConfirmLock() {
// do nothing if (getActivity() == null) {
throw new AndroidRuntimeException("TestFailed");
}
} }
} }
} }

View File

@@ -57,6 +57,7 @@ import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.dashboard.profileselector.UserAdapter; import com.android.settings.dashboard.profileselector.UserAdapter;
import com.android.settingslib.PrimarySwitchPreference;
import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -403,9 +404,10 @@ public class StylusDevicesControllerTest {
Settings.Secure.STYLUS_HANDWRITING_ENABLED, 1); Settings.Secure.STYLUS_HANDWRITING_ENABLED, 1);
showScreen(mController); 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 @Test
@@ -414,9 +416,10 @@ public class StylusDevicesControllerTest {
Settings.Secure.STYLUS_HANDWRITING_ENABLED, 0); Settings.Secure.STYLUS_HANDWRITING_ENABLED, 0);
showScreen(mController); 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 @Test
@@ -424,21 +427,20 @@ public class StylusDevicesControllerTest {
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.STYLUS_HANDWRITING_ENABLED, 0); Settings.Secure.STYLUS_HANDWRITING_ENABLED, 0);
showScreen(mController); 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(), assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.STYLUS_HANDWRITING_ENABLED, -1)).isEqualTo(1); Settings.Secure.STYLUS_HANDWRITING_ENABLED, -1)).isEqualTo(1);
} }
@Test @Test
public void handwritingPreference_startsHandwritingSettingsOnClickIfChecked() { public void handwritingPreference_startsHandwritingSettingsOnClick() {
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.STYLUS_HANDWRITING_ENABLED, 0);
showScreen(mController); showScreen(mController);
SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1); PrimarySwitchPreference handwritingPref =
(PrimarySwitchPreference) mPreferenceContainer.getPreference(1);
handwritingPref.performClick(); handwritingPref.performClick();
@@ -447,11 +449,23 @@ public class StylusDevicesControllerTest {
} }
@Test @Test
public void handwritingPreference_doesNotStartHandwritingSettingsOnClickIfNotChecked() { public void handwritingPreference_doesNotStartHandwritingSettingsOnChange() {
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.STYLUS_HANDWRITING_ENABLED, 1);
showScreen(mController); 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(); handwritingPref.performClick();
@@ -463,14 +477,12 @@ public class StylusDevicesControllerTest {
public void handwritingPreference_doesNotStartHandwritingSettingsIfNoIntent() { public void handwritingPreference_doesNotStartHandwritingSettingsIfNoIntent() {
when(mInputMethodInfo.createStylusHandwritingSettingsActivityIntent()) when(mInputMethodInfo.createStylusHandwritingSettingsActivityIntent())
.thenReturn(null); .thenReturn(null);
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.STYLUS_HANDWRITING_ENABLED, 1);
showScreen(mController); showScreen(mController);
SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1); PrimarySwitchPreference handwritingPref =
(PrimarySwitchPreference) mPreferenceContainer.getPreference(1);
handwritingPref.performClick(); handwritingPref.performClick();
verify(mInputMethodInfo, times(0)).createStylusHandwritingSettingsActivityIntent();
verify(mContext, times(0)).startActivity(any()); verify(mContext, times(0)).startActivity(any());
} }