diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.kt
index e3a6078..c40ec96 100644
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.kt
+++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.kt
@@ -39,7 +39,6 @@
 import com.android.settings.R
 import com.android.settings.Utils
 import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics2.data.repository.FingerprintRepository
 import com.android.settings.biometrics2.factory.BiometricsViewModelFactory
 import com.android.settings.biometrics2.factory.BiometricsViewModelFactory.CHALLENGE_GENERATOR_KEY
 import com.android.settings.biometrics2.factory.BiometricsViewModelFactory.ENROLLMENT_REQUEST_KEY
@@ -92,12 +91,6 @@
     /** Internal activity for FingerprintSettings */
     class InternalActivity : FingerprintEnrollmentActivity()
 
-    /**
-     * This flag is used for addBackStack(), we do not save it in ViewModel because it is just used
-     * during FragmentManager calls
-     */
-    private var isFirstFragmentAdded = false
-
     private val viewModelProvider: ViewModelProvider by lazy {
         ViewModelProvider(this)
     }
@@ -168,7 +161,7 @@
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        viewModel.setSavedInstanceState(savedInstanceState)
+        viewModel.onRestoreInstanceState(savedInstanceState)
         autoCredentialViewModel.setCredentialModel(savedInstanceState, intent)
 
         // Theme
@@ -189,10 +182,9 @@
         }
         if (fragment == null) {
             checkCredential()
-            val request: EnrollmentRequest = viewModel.getRequest()
-            if (request.isSkipFindSensor) {
+            if (viewModel.request.isSkipFindSensor) {
                 startEnrollingFragment()
-            } else if (request.isSkipIntro) {
+            } else if (viewModel.request.isSkipIntro) {
                 startFindSensorFragment()
             } else {
                 startIntroFragment()
@@ -229,12 +221,12 @@
     }
 
     private fun startFragment(fragmentClass: Class<out Fragment>, tag: String) {
-        if (!isFirstFragmentAdded) {
+        if (!viewModel.isFirstFragmentAdded) {
             supportFragmentManager.beginTransaction()
                 .setReorderingAllowed(true)
                 .replace(R.id.fragment_container_view, fragmentClass, null, tag)
                 .commit()
-            isFirstFragmentAdded = true
+            viewModel.setIsFirstFragmentAdded()
         } else {
             supportFragmentManager.beginTransaction()
                 .setReorderingAllowed(true)
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java
index 33799f3..4c702fa 100644
--- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java
+++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.java
@@ -53,12 +53,17 @@
     @VisibleForTesting
     static final String SAVED_STATE_IS_NEW_FINGERPRINT_ADDED = "is_new_fingerprint_added";
 
+    @VisibleForTesting
+    static final String SAVED_STATE_IS_FIRST_FRAGMENT_ADDED = "is_first_fragment_added";
+
     @NonNull private final FingerprintRepository mFingerprintRepository;
 
     private final AtomicBoolean mIsWaitingActivityResult = new AtomicBoolean(false);
     private final MutableLiveData<ActivityResult> mSetResultLiveData = new MutableLiveData<>();
     @NonNull private final EnrollmentRequest mRequest;
     private boolean mIsNewFingerprintAdded = false;
+    /** Flag for FragmentManager::addToBackStack() */
+    private boolean mIsFirstFragmentAdded = false;
 
     public FingerprintEnrollmentViewModel(
             @NonNull Application application,
@@ -145,7 +150,7 @@
     /**
      * Handle savedInstanceState from activity onCreated()
      */
-    public void setSavedInstanceState(@Nullable Bundle savedInstanceState) {
+    public void onRestoreInstanceState(@Nullable Bundle savedInstanceState) {
         if (savedInstanceState == null) {
             return;
         }
@@ -154,6 +159,8 @@
         );
         mIsNewFingerprintAdded = savedInstanceState.getBoolean(
                 SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, false);
+        mIsFirstFragmentAdded = savedInstanceState.getBoolean(
+                SAVED_STATE_IS_FIRST_FRAGMENT_ADDED, false);
     }
 
     /**
@@ -162,6 +169,7 @@
     public void onSaveInstanceState(@NonNull Bundle outState) {
         outState.putBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, mIsWaitingActivityResult.get());
         outState.putBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, mIsNewFingerprintAdded);
+        outState.putBoolean(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED, mIsFirstFragmentAdded);
     }
 
     /**
@@ -193,6 +201,17 @@
         mIsNewFingerprintAdded = true;
     }
 
+    public boolean isFirstFragmentAdded() {
+        return mIsFirstFragmentAdded;
+    }
+
+    /**
+     * set mIsFirstFragmentAdded to true, this flag will be used during adding fragment
+     */
+    public void setIsFirstFragmentAdded() {
+        mIsFirstFragmentAdded = true;
+    }
+
     /**
      * Update FINGERPRINT_SUGGESTION_ACTIVITY into package manager
      */
diff --git a/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.kt b/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.kt
index 49c5ac9..33c8d3d 100644
--- a/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.kt
+++ b/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.kt
@@ -22,13 +22,13 @@
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
 import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback
 import android.os.UserHandle
-import android.support.test.uiautomator.By
-import android.support.test.uiautomator.UiDevice
-import android.support.test.uiautomator.UiObject2
-import android.support.test.uiautomator.Until
 import android.util.Log
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiObject2
+import androidx.test.uiautomator.Until
 import com.android.internal.widget.LockPatternChecker
 import com.android.internal.widget.LockPatternUtils
 import com.android.internal.widget.LockscreenCredential
@@ -57,6 +57,7 @@
     private var canAssumeUdfps = false
     private var canAssumeSfps = false
     private var enrollingPageTitle: String = ""
+    private var runAsLandscape = false
 
     private val device: UiDevice by lazy {
         UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@@ -108,12 +109,16 @@
     @After
     @Throws(Exception::class)
     fun tearDown() {
+        runAsLandscape = false
+        setDeviceOrientation()
+
         LockScreenUtil.resetLockscreen(TEST_PIN)
         device.pressHome()
     }
 
     @Test
     fun testIntroChooseLock() {
+        setDeviceOrientation()
         val intent = newActivityIntent(false)
         context.startActivity(intent)
         assertThat(
@@ -124,6 +129,12 @@
         ).isTrue()
     }
 
+    @Test
+    fun testIntroChooseLock_landscape() {
+        runAsLandscape = true
+        testIntroChooseLock()
+    }
+
     private fun verifyIntroPage() {
         device.waitForIdle()
         run {
@@ -141,7 +152,8 @@
         // Click more btn at most twice and the introduction should stay in the last page
         var moreBtn: UiObject2? = null
         var i = 0
-        while (i < 2 && device.findObject(By.text("More")).also { moreBtn = it } != null) {
+        val more = if (runAsLandscape) 5 else 2
+        while (i < more && device.findObject(By.text("More")).also { moreBtn = it } != null) {
             moreBtn!!.click()
             device.waitForIdle()
             device.wait(Until.hasObject(By.text("More")), IDLE_TIMEOUT)
@@ -154,6 +166,8 @@
     @Test
     fun testIntroWithGkPwHandle_withUdfps_clickStart() {
         Assume.assumeTrue(canAssumeUdfps)
+
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchIntroWithGkPwHandle(false)
 
@@ -179,8 +193,16 @@
     }
 
     @Test
+    fun testIntroWithGkPwHandle_withUdfps_clickStart_landscape() {
+        runAsLandscape = true
+        testIntroWithGkPwHandle_withUdfps_clickStart()
+    }
+
+    @Test
     fun testIntroWithGkPwHandle_withUdfps_clickLottie() {
         Assume.assumeTrue(canAssumeUdfps)
+
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchIntroWithGkPwHandle(false)
 
@@ -204,8 +226,16 @@
     }
 
     @Test
+    fun testIntroWithGkPwHandle_withUdfps_clickLottie_landscape() {
+        runAsLandscape = true
+        testIntroWithGkPwHandle_withUdfps_clickLottie()
+    }
+
+    @Test
     fun testIntroWithGkPwHandle_withSfps() {
         Assume.assumeTrue(canAssumeSfps)
+
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchIntroWithGkPwHandle(false)
 
@@ -226,8 +256,16 @@
     }
 
     @Test
+    fun testIntroWithGkPwHandle_withSfps_landscape() {
+        runAsLandscape = true
+        testIntroWithGkPwHandle_withSfps()
+    }
+
+    @Test
     fun testIntroWithGkPwHandle_withRfps() {
         Assume.assumeFalse(canAssumeUdfps || canAssumeSfps)
+
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchIntroWithGkPwHandle(false)
 
@@ -253,7 +291,14 @@
     }
 
     @Test
+    fun testIntroWithGkPwHandle_withRfps_landscape() {
+        runAsLandscape = true
+        testIntroWithGkPwHandle_withRfps()
+    }
+
+    @Test
     fun testIntroWithGkPwHandle_clickNoThanksInIntroPage() {
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchIntroWithGkPwHandle(false)
 
@@ -269,7 +314,14 @@
     }
 
     @Test
+    fun testIntroWithGkPwHandle_clickNoThanksInIntroPage_landscape() {
+        runAsLandscape = true
+        testIntroWithGkPwHandle_clickNoThanksInIntroPage()
+    }
+
+    @Test
     fun testIntroWithGkPwHandle_clickSkipInFindSensor() {
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchIntroWithGkPwHandle(false)
 
@@ -292,7 +344,14 @@
     }
 
     @Test
+    fun testIntroWithGkPwHandle_clickSkipInFindSensor_landscape() {
+        runAsLandscape = true
+        testIntroWithGkPwHandle_clickSkipInFindSensor()
+    }
+
+    @Test
     fun testIntroWithGkPwHandle_clickSkipAnywayInFindFpsDialog_whenIsSuw() {
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchIntroWithGkPwHandle(true)
 
@@ -323,7 +382,14 @@
     }
 
     @Test
+    fun testIntroWithGkPwHandle_clickSkipAnywayInFindFpsDialog_whenIsSuw_landscape() {
+        runAsLandscape = true
+        testIntroWithGkPwHandle_clickSkipAnywayInFindFpsDialog_whenIsSuw()
+    }
+
+    @Test
     fun testIntroWithGkPwHandle_clickGoBackInFindFpsDialog_whenIsSuw() {
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchIntroWithGkPwHandle(true)
 
@@ -352,7 +418,14 @@
     }
 
     @Test
+    fun testIntroWithGkPwHandle_clickGoBackInFindFpsDialog_whenIsSuw_landscape() {
+        runAsLandscape = true
+        testIntroWithGkPwHandle_clickGoBackInFindFpsDialog_whenIsSuw()
+    }
+
+    @Test
     fun testIntroCheckPin() {
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         val intent = newActivityIntent(false)
         context.startActivity(intent)
@@ -366,6 +439,7 @@
 
     @Test
     fun testEnrollingWithGkPwHandle() {
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchEnrollingWithGkPwHandle()
 
@@ -375,8 +449,16 @@
     }
 
     @Test
+    fun testEnrollingWithGkPwHandle_landscape() {
+        runAsLandscape = true
+        testEnrollingWithGkPwHandle()
+    }
+
+    @Test
     fun testEnrollingIconTouchDialog_withSfps() {
         Assume.assumeTrue(canAssumeSfps)
+
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchEnrollingWithGkPwHandle()
 
@@ -410,8 +492,16 @@
     }
 
     @Test
+    fun testEnrollingIconTouchDialog_withSfps_landscape() {
+        runAsLandscape = true
+        testEnrollingIconTouchDialog_withSfps()
+    }
+
+    @Test
     fun testEnrollingIconTouchDialog_withRfps() {
         Assume.assumeFalse(canAssumeUdfps || canAssumeSfps)
+
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchEnrollingWithGkPwHandle()
 
@@ -444,8 +534,16 @@
     }
 
     @Test
+    fun testEnrollingIconTouchDialog_withRfps_landscape() {
+        runAsLandscape = true
+        testEnrollingIconTouchDialog_withRfps()
+    }
+
+    @Test
     fun testFindUdfpsWithGkPwHandle_clickStart() {
         Assume.assumeTrue(canAssumeUdfps)
+
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchFindSensorWithGkPwHandle()
 
@@ -465,8 +563,53 @@
     }
 
     @Test
+    fun testFindUdfpsWithGkPwHandle_clickStart_landscape() {
+        runAsLandscape = true
+        testFindUdfpsWithGkPwHandle_clickStart()
+    }
+
+    @Test
+    fun testFindUdfpsLandscapeWithGkPwHandle_clickStartThenBack() {
+        Assume.assumeTrue(canAssumeUdfps)
+
+        setDeviceOrientation()
+        LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+        launchFindSensorWithGkPwHandle()
+
+        // FindUdfps page (portrait)
+        assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+
+        // rotate device
+        device.setOrientationLandscape()
+        device.waitForIdle()
+
+        // FindUdfps page (landscape)
+        assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+        val lottie = device.findObject(
+            By.res(SETTINGS_PACKAGE_NAME, "illustration_lottie")
+        )
+        assertThat(lottie).isNotNull()
+        assertThat(lottie.isClickable).isTrue()
+        val startBtn = device.findObject(By.text("Start"))
+        assertThat(startBtn.isClickable).isTrue()
+        startBtn.click()
+
+        // Enrolling page
+        assertThat(device.wait(Until.hasObject(By.text(enrollingPageTitle)), IDLE_TIMEOUT)).isTrue()
+
+        // Press back
+        device.pressBack()
+        device.waitForIdle()
+
+        // FindUdfps page (landscape-again)
+        assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+    }
+
+    @Test
     fun testFindUdfpsWithGkPwHandle_clickLottie() {
         Assume.assumeTrue(canAssumeUdfps)
+
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchFindSensorWithGkPwHandle()
 
@@ -486,8 +629,16 @@
     }
 
     @Test
+    fun testFindUdfpsWithGkPwHandle_clickLottie_landscape() {
+        runAsLandscape = true
+        testFindUdfpsWithGkPwHandle_clickLottie()
+    }
+
+    @Test
     fun testFindSfpsWithGkPwHandle() {
         Assume.assumeTrue(canAssumeSfps)
+
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchFindSensorWithGkPwHandle()
 
@@ -502,8 +653,16 @@
     }
 
     @Test
+    fun testFindSfpsWithGkPwHandle_landscape() {
+        runAsLandscape = true
+        testFindSfpsWithGkPwHandle()
+    }
+
+    @Test
     fun testFindRfpsWithGkPwHandle() {
         Assume.assumeFalse(canAssumeUdfps || canAssumeSfps)
+
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchFindSensorWithGkPwHandle()
 
@@ -529,7 +688,14 @@
     }
 
     @Test
+    fun testFindRfpsWithGkPwHandle_landscape() {
+        runAsLandscape = true
+        testFindRfpsWithGkPwHandle()
+    }
+
+    @Test
     fun testFindSensorWithGkPwHandle_clickSkipInFindSensor() {
+        setDeviceOrientation()
         LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
         launchFindSensorWithGkPwHandle()
 
@@ -545,6 +711,12 @@
         assertThat(device.wait(Until.gone(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
     }
 
+    @Test
+    fun testFindSensorWithGkPwHandle_clickSkipInFindSensor_landscape() {
+        runAsLandscape = true
+        testFindSensorWithGkPwHandle_clickSkipInFindSensor()
+    }
+
     private fun launchIntroWithGkPwHandle(isSuw: Boolean) {
         val lockPatternUtils = LockPatternUtils(context)
         val lockscreenCredential = LockscreenCredential.createPin(TEST_PIN)
@@ -610,6 +782,15 @@
         return intent
     }
 
+    private fun setDeviceOrientation() {
+        if (runAsLandscape) {
+            device.setOrientationLandscape()
+        } else {
+            device.setOrientationPortrait()
+        }
+        device.waitForIdle()
+    }
+
     companion object {
         private const val TAG = "FingerprintEnrollmentActivityTest"
         const val SETTINGS_PACKAGE_NAME = "com.android.settings"
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.java
index 7850677..73fab79 100644
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.java
+++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.java
@@ -18,8 +18,8 @@
 
 import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
 
+import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel.SAVED_STATE_IS_FIRST_FRAGMENT_ADDED;
 import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel.SAVED_STATE_IS_NEW_FINGERPRINT_ADDED;
-import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel.SAVED_STATE_IS_WAITING_ACTIVITY_RESULT;
 import static com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newAllFalseRequest;
 import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.newFingerprintRepository;
 import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupFingerprintEnrolledFingerprints;
@@ -58,13 +58,17 @@
     private FingerprintRepository mFingerprintRepository;
     private FingerprintEnrollmentViewModel mViewModel;
 
+    private FingerprintEnrollmentViewModel newViewModelInstance() {
+        return new FingerprintEnrollmentViewModel(mApplication, mFingerprintRepository,
+                newAllFalseRequest(mApplication));
+    }
+
     @Before
     public void setUp() {
         mApplication = ApplicationProvider.getApplicationContext();
         mFingerprintRepository = newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL,
                 5);
-        mViewModel = new FingerprintEnrollmentViewModel(mApplication, mFingerprintRepository,
-                newAllFalseRequest(mApplication));
+        mViewModel = newViewModelInstance();
     }
 
     @Test
@@ -73,63 +77,137 @@
     }
 
     @Test
-    public void testSetSavedInstanceState() {
-        // setSavedInstanceState() as false
-        final Bundle bundle = new Bundle();
-        final Bundle outBundle = new Bundle();
-
-        // Set SAVED_STATE_IS_WAITING_ACTIVITY_RESULT to true
-        bundle.putBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, false);
-        mViewModel.setSavedInstanceState(bundle);
+    public void testIsWaitingActivityResult() {
+        // Default false
         assertThat(mViewModel.isWaitingActivityResult().get()).isFalse();
 
-        // Set SAVED_STATE_IS_WAITING_ACTIVITY_RESULT to true
-        bundle.clear();
-        bundle.putBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT, true);
-        mViewModel.setSavedInstanceState(bundle);
-        assertThat(mViewModel.isWaitingActivityResult().get()).isTrue();
+        // false if null bundle
+        mViewModel = newViewModelInstance();
+        mViewModel.onRestoreInstanceState(null);
+        assertThat(mViewModel.isWaitingActivityResult().get()).isFalse();
 
-        // Set SAVED_STATE_IS_NEW_FINGERPRINT_ADDED to false
-        bundle.clear();
-        bundle.putBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, false);
-        mViewModel.setSavedInstanceState(bundle);
-        outBundle.clear();
-        mViewModel.onSaveInstanceState(outBundle);
-        assertThat(outBundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isFalse();
+        // false if empty bundle
+        mViewModel.onRestoreInstanceState(new Bundle());
+        assertThat(mViewModel.isWaitingActivityResult().get()).isFalse();
 
-        // Set SAVED_STATE_IS_NEW_FINGERPRINT_ADDED to true
-        bundle.clear();
-        bundle.putBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, true);
-        mViewModel.setSavedInstanceState(bundle);
-        outBundle.clear();
-        mViewModel.onSaveInstanceState(outBundle);
-        assertThat(outBundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
+        // False value can be saved during onSaveInstanceState() and restore after
+        // onSaveInstanceState()
+        final Bundle falseSavedInstance = new Bundle();
+        mViewModel.onSaveInstanceState(falseSavedInstance);
+        final FingerprintEnrollmentViewModel falseViewModel = newViewModelInstance();
+        falseViewModel.onRestoreInstanceState(falseSavedInstance);
+        assertThat(falseViewModel.isWaitingActivityResult().get()).isFalse();
+
+        // True value can be saved during onSaveInstanceState() and restore after
+        // onSaveInstanceState()
+        final Bundle trueSavedInstance = new Bundle();
+        mViewModel.isWaitingActivityResult().set(true);
+        mViewModel.onSaveInstanceState(trueSavedInstance);
+        final FingerprintEnrollmentViewModel trueViewModel = newViewModelInstance();
+        trueViewModel.onRestoreInstanceState(trueSavedInstance);
+        assertThat(trueViewModel.isWaitingActivityResult().get()).isTrue();
     }
 
     @Test
-    public void testOnSaveInstanceState() {
-        // Test isWaitingActivityResult false
-        mViewModel.isWaitingActivityResult().set(false);
-        final Bundle bundle = new Bundle();
-        mViewModel.onSaveInstanceState(bundle);
-        assertThat(bundle.getBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT)).isFalse();
+    public void testIsNewFingerprintAdded() {
+        // Default false
+        final Bundle outBundle = new Bundle();
+        mViewModel.onSaveInstanceState(outBundle);
+        assertThat(outBundle.containsKey(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
+        assertThat(outBundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isFalse();
 
-        // Test isWaitingActivityResult true
-        mViewModel.isWaitingActivityResult().set(true);
-        bundle.clear();
-        mViewModel.onSaveInstanceState(bundle);
-        assertThat(bundle.getBoolean(SAVED_STATE_IS_WAITING_ACTIVITY_RESULT)).isTrue();
+        // false if null bundle
+        mViewModel = newViewModelInstance();
+        mViewModel.onRestoreInstanceState(null);
+        outBundle.clear();
+        mViewModel.onSaveInstanceState(outBundle);
+        assertThat(outBundle.containsKey(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
+        assertThat(outBundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isFalse();
 
-        // Test isNewFingerprintAdded default false
-        bundle.clear();
-        mViewModel.onSaveInstanceState(bundle);
-        assertThat(bundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isFalse();
+        // false if empty bundle
+        mViewModel = newViewModelInstance();
+        mViewModel.onRestoreInstanceState(new Bundle());
+        outBundle.clear();
+        mViewModel.onSaveInstanceState(outBundle);
+        assertThat(outBundle.containsKey(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
+        assertThat(outBundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isFalse();
 
-        // Test isNewFingerprintAdded true
-        mViewModel.setIsNewFingerprintAdded();
-        bundle.clear();
-        mViewModel.onSaveInstanceState(bundle);
-        assertThat(bundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
+        // False value can be saved during onSaveInstanceState() and restore after
+        // onSaveInstanceState()
+        final Bundle falseSavedInstance = new Bundle();
+        falseSavedInstance.putBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, false);
+        mViewModel.onRestoreInstanceState(falseSavedInstance);
+        outBundle.clear();
+        mViewModel.onSaveInstanceState(outBundle);
+        assertThat(outBundle.containsKey(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
+        assertThat(outBundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isFalse();
+
+        // True value can be saved during onSaveInstanceState() and restore after
+        // onSaveInstanceState()
+        final Bundle trueSavedInstance = new Bundle();
+        trueSavedInstance.putBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED, true);
+        mViewModel.onRestoreInstanceState(trueSavedInstance);
+        outBundle.clear();
+        mViewModel.onSaveInstanceState(outBundle);
+        assertThat(outBundle.containsKey(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
+        assertThat(outBundle.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
+
+        // setIsFirstFragmentAdded() can be saved during onSaveInstanceState()
+        mViewModel.setIsFirstFragmentAdded();
+        mViewModel.onSaveInstanceState(trueSavedInstance);
+        assertThat(trueSavedInstance.containsKey(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
+        assertThat(trueSavedInstance.getBoolean(SAVED_STATE_IS_NEW_FINGERPRINT_ADDED)).isTrue();
+    }
+
+    @Test
+    public void testIsFirstFragmentAdded() {
+        // Default false
+        final Bundle outBundle = new Bundle();
+        mViewModel.onSaveInstanceState(outBundle);
+        assertThat(outBundle.containsKey(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isTrue();
+        assertThat(outBundle.getBoolean(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isFalse();
+
+        // false if null bundle
+        mViewModel = newViewModelInstance();
+        mViewModel.onRestoreInstanceState(null);
+        outBundle.clear();
+        mViewModel.onSaveInstanceState(outBundle);
+        assertThat(outBundle.containsKey(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isTrue();
+        assertThat(outBundle.getBoolean(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isFalse();
+
+        // false if empty bundle
+        mViewModel = newViewModelInstance();
+        mViewModel.onRestoreInstanceState(new Bundle());
+        outBundle.clear();
+        mViewModel.onSaveInstanceState(outBundle);
+        assertThat(outBundle.containsKey(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isTrue();
+        assertThat(outBundle.getBoolean(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isFalse();
+
+        // False value can be saved during onSaveInstanceState() and restore after
+        // onSaveInstanceState()
+        final Bundle falseSavedInstance = new Bundle();
+        falseSavedInstance.putBoolean(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED, false);
+        mViewModel.onRestoreInstanceState(falseSavedInstance);
+        outBundle.clear();
+        mViewModel.onSaveInstanceState(outBundle);
+        assertThat(outBundle.containsKey(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isTrue();
+        assertThat(outBundle.getBoolean(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isFalse();
+
+        // True value can be saved during onSaveInstanceState() and restore after
+        // onSaveInstanceState()
+        final Bundle trueSavedInstance = new Bundle();
+        trueSavedInstance.putBoolean(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED, true);
+        mViewModel.onRestoreInstanceState(trueSavedInstance);
+        outBundle.clear();
+        mViewModel.onSaveInstanceState(outBundle);
+        assertThat(outBundle.containsKey(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isTrue();
+        assertThat(outBundle.getBoolean(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isTrue();
+
+        // setIsFirstFragmentAdded() can be saved during onSaveInstanceState()
+        mViewModel.setIsFirstFragmentAdded();
+        mViewModel.onSaveInstanceState(trueSavedInstance);
+        assertThat(trueSavedInstance.containsKey(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isTrue();
+        assertThat(trueSavedInstance.getBoolean(SAVED_STATE_IS_FIRST_FRAGMENT_ADDED)).isTrue();
     }
 
     @Test
