diff --git a/src/com/android/settings/gestures/DoubleTwistPreferenceController.java b/src/com/android/settings/gestures/DoubleTwistPreferenceController.java
index ac050be..922f74b 100644
--- a/src/com/android/settings/gestures/DoubleTwistPreferenceController.java
+++ b/src/com/android/settings/gestures/DoubleTwistPreferenceController.java
@@ -52,7 +52,7 @@
                 || prefs.getBoolean(DoubleTwistGestureSettings.PREF_KEY_SUGGESTION_COMPLETE, false);
     }
 
-    private static boolean isGestureAvailable(Context context) {
+    public static boolean isGestureAvailable(Context context) {
         final Resources resources = context.getResources();
         final String name = resources.getString(R.string.gesture_double_twist_sensor_name);
         final String vendor = resources.getString(R.string.gesture_double_twist_sensor_vendor);
@@ -86,25 +86,30 @@
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         final int enabled = (boolean) newValue ? ON : OFF;
-        Settings.Secure.putInt(mContext.getContentResolver(),
+        setDoubleTwistPreference(mContext, mUserManager, enabled);
+        return true;
+    }
+
+    public static void setDoubleTwistPreference(Context context, UserManager userManager,
+            int enabled) {
+        Settings.Secure.putInt(context.getContentResolver(),
                 Settings.Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, enabled);
-        final int managedProfileUserId = getManagedProfileUserId();
+        final int managedProfileUserId = getManagedProfileId(userManager);
         if (managedProfileUserId != UserHandle.USER_NULL) {
-            Settings.Secure.putIntForUser(mContext.getContentResolver(),
+            Settings.Secure.putIntForUser(context.getContentResolver(),
                 Settings.Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, enabled, managedProfileUserId);
         }
-        return true;
     }
 
     @Override
     protected boolean isSwitchPrefEnabled() {
         final int doubleTwistEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, 1);
+                Settings.Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, ON);
         return doubleTwistEnabled != 0;
     }
 
     @VisibleForTesting
-    int getManagedProfileUserId() {
-        return Utils.getManagedProfileId(mUserManager, UserHandle.myUserId());
+    public static int getManagedProfileId(UserManager userManager) {
+        return Utils.getManagedProfileId(userManager, UserHandle.myUserId());
     }
 }
diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java
index e6bcfce..aa8121c 100644
--- a/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java
@@ -40,11 +40,12 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
+import com.android.settings.testutils.shadow.ShadowDoubleTwistPreferenceController;
+
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DoubleTwistPreferenceControllerTest {
@@ -96,14 +97,16 @@
     }
 
     @Test
-    @Config(shadows = {ShadowSecureSettings.class})
+    @Config(shadows = {
+            ShadowDoubleTwistPreferenceController.class,
+            ShadowSecureSettings.class})
     public void onPreferenceChange_hasWorkProfile_shouldUpdateSettingForWorkProfileUser() {
         final int managedId = 2;
         ShadowSecureSettings.putIntForUser(
             null, Settings.Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, 0, managedId);
         DoubleTwistPreferenceController controller =
             spy(new DoubleTwistPreferenceController(mContext, null, KEY_DOUBLE_TWIST));
-        doReturn(managedId).when(controller).getManagedProfileUserId();
+        ShadowDoubleTwistPreferenceController.setManagedProfileId(managedId);
 
         // enable the gesture
         controller.onPreferenceChange(null, true);
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowDoubleTwistPreferenceController.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowDoubleTwistPreferenceController.java
new file mode 100644
index 0000000..2f37ec8
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowDoubleTwistPreferenceController.java
@@ -0,0 +1,28 @@
+package com.android.settings.testutils.shadow;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.settings.gestures.DoubleTwistPreferenceController;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(DoubleTwistPreferenceController.class)
+public class ShadowDoubleTwistPreferenceController {
+    private static int sManagedProfileId = UserHandle.USER_NULL;
+    @Implementation
+    public static boolean isGestureAvailable(Context context) {
+        return true;
+    }
+
+    @Implementation
+    public static int getManagedProfileId(UserManager userManager) {
+        return sManagedProfileId;
+    }
+
+    public static void setManagedProfileId(int managedProfileId) {
+        sManagedProfileId = managedProfileId;
+    }
+}
