SUW: use standard navigation method

Use software/hardware back button and add on-screen Next & Skip buttons.

Change-Id: I7bfa052f2217e51ea778df688e7169657aaad2c6
diff --git a/res/layout/choose_data_sim_page.xml b/res/layout/choose_data_sim_page.xml
index fdac422..0de7e1d 100644
--- a/res/layout/choose_data_sim_page.xml
+++ b/res/layout/choose_data_sim_page.xml
@@ -25,7 +25,8 @@
     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        style="@style/SudContentFrame">
 
         <FrameLayout
             android:id="@+id/page"
@@ -43,7 +44,6 @@
                     android:orientation="vertical"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    style="@style/SudContentFrame"
                     android:visibility="gone">
 
                     <TextView
@@ -67,11 +67,10 @@
                 android:visibility="gone" />
         </FrameLayout>
 
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content" />
 
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/finish_activity.xml b/res/layout/finish_activity.xml
index a80a560..7005063 100644
--- a/res/layout/finish_activity.xml
+++ b/res/layout/finish_activity.xml
@@ -28,7 +28,8 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:orientation="vertical">
+        android:orientation="vertical"
+        style="@style/SudContentFrame">
 
         <ImageView
             android:id="@+id/brand_logo"
@@ -39,14 +40,12 @@
             android:adjustViewBounds="true"
             android:scaleType="fitCenter"
             android:gravity="center"
-            android:padding="@dimen/content_margin_left"
-            style="@style/SudContentFrame"/>
+            android:padding="@dimen/content_margin_left"/>
 
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content" />
 
     </LinearLayout>
 
diff --git a/res/layout/intro_restore_activity.xml b/res/layout/intro_restore_activity.xml
index 0936605..a3934a0 100644
--- a/res/layout/intro_restore_activity.xml
+++ b/res/layout/intro_restore_activity.xml
@@ -25,7 +25,8 @@
     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        style="@style/SudContentFrame">
 
         <FrameLayout android:id="@+id/page"
             android:layout_width="match_parent"
@@ -39,8 +40,7 @@
                 <LinearLayout
                     android:orientation="vertical"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    style="@style/SudContentFrame">
+                    android:layout_height="wrap_content">
 
                     <TextView
                         android:layout_width="match_parent"
@@ -48,23 +48,15 @@
                         android:text="@string/intro_restore_subtitle"
                         style="@style/SudItemTitle.GlifDescription" />
 
-                    <Button
-                        android:id="@+id/intro_restore_button"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="24dp"
-                        android:text="@string/intro_restore_button"
-                        style="@style/SudGlifButton.Primary" />
-
                 </LinearLayout>
             </ScrollView>
         </FrameLayout>
 
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content"
+            app:showSkipButton="true" />
 
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/location_settings.xml b/res/layout/location_settings.xml
index 094bc8b..3771fc3 100644
--- a/res/layout/location_settings.xml
+++ b/res/layout/location_settings.xml
@@ -25,7 +25,8 @@
     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        style="@style/SudContentFrame">
 
         <FrameLayout 
             android:id="@+id/page"
@@ -41,8 +42,7 @@
                 <LinearLayout
                     android:orientation="vertical"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    style="@style/SudContentFrame">
+                    android:layout_height="match_parent">
 
                     <LinearLayout
                         android:id="@+id/location"
@@ -75,11 +75,10 @@
             </ScrollView>
         </FrameLayout>
 
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content" />
 
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/mobile_data_settings.xml b/res/layout/mobile_data_settings.xml
index 54bbd60..26888c5 100644
--- a/res/layout/mobile_data_settings.xml
+++ b/res/layout/mobile_data_settings.xml
@@ -25,7 +25,8 @@
     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        style="@style/SudContentFrame">
 
         <ProgressBar
             android:id="@+id/progress"
@@ -50,8 +51,7 @@
                     android:id="@+id/page_view"
                     android:orientation="vertical"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    style="@style/SudContentFrame">
+                    android:layout_height="wrap_content">
 
                     <TextView
                         android:id="@+id/mobile_data_summary"
@@ -107,11 +107,10 @@
             </ScrollView>
         </FrameLayout>
 
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content" />
 
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/navigation_layout.xml b/res/layout/navigation_layout.xml
new file mode 100644
index 0000000..9b56278
--- /dev/null
+++ b/res/layout/navigation_layout.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2021 The LineageOS Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <Button
+        android:id="@+id/navbar_skip"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentStart="true"
+        android:text="@string/skip"
+        android:visibility="gone"
+        style="@style/SudGlifButton.Secondary" />
+
+    <Button
+        android:id="@+id/navbar_next"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentEnd="true"
+        android:text="@string/next"
+        style="@style/SudGlifButton.Primary" />
+
+</RelativeLayout>
diff --git a/res/layout/setup_biometric.xml b/res/layout/setup_biometric.xml
index 6c7d86d..492a9d7 100644
--- a/res/layout/setup_biometric.xml
+++ b/res/layout/setup_biometric.xml
@@ -25,7 +25,8 @@
     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        style="@style/SudContentFrame">
 
         <FrameLayout android:id="@+id/page"
             android:layout_width="match_parent"
@@ -40,8 +41,7 @@
                 <LinearLayout
                     android:orientation="vertical"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    style="@style/SudContentFrame">
+                    android:layout_height="wrap_content">
 
                     <TextView
                         android:id="@+id/setup_biometric_summary"
@@ -75,22 +75,15 @@
                         android:textSize="16sp"
                         android:textStyle="bold"/>
 
-                    <Button
-                        android:id="@+id/setup_biometric"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:text="@string/biometric_setup_screen_lock_setup"
-                        style="@style/SudGlifButton.Primary" />
-
                 </LinearLayout>
             </ScrollView>
         </FrameLayout>
 
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content"
+            app:showSkipButton="true" />
 
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/setup_datetime_page.xml b/res/layout/setup_datetime_page.xml
index 304d9f7..f658425 100644
--- a/res/layout/setup_datetime_page.xml
+++ b/res/layout/setup_datetime_page.xml
@@ -25,7 +25,8 @@
     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        style="@style/SudContentFrame">
 
         <FrameLayout
             android:id="@+id/page"
@@ -41,8 +42,7 @@
                 <LinearLayout
                     android:orientation="vertical"
                     android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    style="@style/SudContentFrame">
+                    android:layout_height="wrap_content">
 
                     <TextView
                         android:layout_width="match_parent"
@@ -115,11 +115,10 @@
             </ScrollView>
         </FrameLayout>
 
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content" />
 
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/setup_lineage_settings.xml b/res/layout/setup_lineage_settings.xml
index 3e808ae..a222d5b 100644
--- a/res/layout/setup_lineage_settings.xml
+++ b/res/layout/setup_lineage_settings.xml
@@ -25,7 +25,8 @@
     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        style="@style/SudContentFrame">
 
         <FrameLayout
             android:id="@+id/page"
@@ -41,8 +42,7 @@
                 <LinearLayout
                     android:orientation="vertical"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    style="@style/SudContentFrame">
+                    android:layout_height="match_parent">
 
                     <!-- The caption about privacy policy -->
                     <TextView
@@ -114,11 +114,10 @@
             </ScrollView>
         </FrameLayout>
 
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content" />
 
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/setup_locale.xml b/res/layout/setup_locale.xml
index 672d4f2..9af6d00 100644
--- a/res/layout/setup_locale.xml
+++ b/res/layout/setup_locale.xml
@@ -25,14 +25,14 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:orientation="vertical">
+        android:orientation="vertical"
+        style="@style/SudContentFrame">
 
         <RelativeLayout
             android:layout_width="match_parent"
             android:layout_height="0dp"
             android:layout_weight="1"
-            android:gravity="center"
-            style="@style/SudContentFrame">
+            android:gravity="center">
 
             <org.lineageos.setupwizard.widget.LocalePicker
                 android:id="@+id/locale_list"
@@ -46,11 +46,10 @@
 
         </RelativeLayout>
     
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content" />
             
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/setup_lockscreen.xml b/res/layout/setup_lockscreen.xml
index 299cc05..895b06f 100644
--- a/res/layout/setup_lockscreen.xml
+++ b/res/layout/setup_lockscreen.xml
@@ -25,7 +25,8 @@
     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        style="@style/SudContentFrame">
 
         <FrameLayout android:id="@+id/page"
             android:layout_width="match_parent"
@@ -41,8 +42,7 @@
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:paddingStart="@dimen/content_margin_left"
-                    android:paddingEnd="@dimen/content_margin_left"
-                    style="@style/SudContentFrame">
+                    android:paddingEnd="@dimen/content_margin_left">
 
                     <TextView
                         android:layout_width="match_parent"
@@ -50,23 +50,15 @@
                         android:text="@string/lockscreen_setup_summary"
                         style="@style/SudItemTitle.GlifDescription" />
 
-                    <Button
-                        android:id="@+id/setup_lockscreen"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginTop="24dp"
-                        android:text="@string/lockscreen_setup_screen_lock_setup"
-                        style="@style/SudGlifButton.Primary" />
-
                 </LinearLayout>
             </ScrollView>
         </FrameLayout>
 
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content"
+            app:showSkipButton="true" />
 
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/sim_missing_page.xml b/res/layout/sim_missing_page.xml
index f53a080..5c15a6d 100644
--- a/res/layout/sim_missing_page.xml
+++ b/res/layout/sim_missing_page.xml
@@ -25,7 +25,8 @@
     <LinearLayout 
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        style="@style/SudContentFrame">
 
         <FrameLayout
             android:id="@+id/page"
@@ -36,8 +37,7 @@
             <LinearLayout
                 android:orientation="vertical"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                style="@style/SudContentFrame">
+                android:layout_height="match_parent">
 
                 <TextView
                     android:layout_width="match_parent"
@@ -57,11 +57,10 @@
             </LinearLayout>
         </FrameLayout>
 
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content" />
 
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/update_recovery_page.xml b/res/layout/update_recovery_page.xml
index 0f91393..de7fec4 100644
--- a/res/layout/update_recovery_page.xml
+++ b/res/layout/update_recovery_page.xml
@@ -25,7 +25,8 @@
     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        style="@style/SudContentFrame">
 
         <FrameLayout
             android:id="@+id/page"
@@ -41,8 +42,7 @@
                 <LinearLayout
                     android:orientation="vertical"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    style="@style/SudContentFrame">
+                    android:layout_height="match_parent">
 
                     <TextView
                         android:layout_width="match_parent"
@@ -86,11 +86,10 @@
             </ScrollView>
         </FrameLayout>
 
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content" />
 
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/welcome_activity.xml b/res/layout/welcome_activity.xml
index 0515c95..1aa834f 100644
--- a/res/layout/welcome_activity.xml
+++ b/res/layout/welcome_activity.xml
@@ -25,7 +25,8 @@
     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        style="@style/SudContentFrame">
 
         <ImageView
             android:id="@+id/brand_logo"
@@ -36,14 +37,12 @@
             android:adjustViewBounds="true"
             android:scaleType="fitCenter"
             android:gravity="center"
-            android:padding="@dimen/content_margin_left"
-            style="@style/SudContentFrame" />
+            android:padding="@dimen/content_margin_left" />
           
-        <com.google.android.setupdesign.view.NavigationBar
+        <org.lineageos.setupwizard.NavigationLayout
             android:id="@+id/navigation_bar"
-            style="@style/SudNavBarTheme"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/sud_navbar_height" />
+            android:layout_height="wrap_content" />
 
     </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 4bf723f..b5fdee8 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -32,4 +32,8 @@
         <attr name="internalLayout" format="reference" />
         <attr name="virtualButtonPressedDrawable" format="reference"/>
     </declare-styleable>
+
+    <declare-styleable name="NavigationLayout">
+        <attr name="showSkipButton" format="boolean" />
+    </declare-styleable>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index f2b4f86..fca98ca 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -21,31 +21,6 @@
         <item name="android:paddingLeft">@dimen/content_margin_left</item>
     </style>
 
-    <style name="ButtonBar" parent="@android:style/Widget.Material.ActionButton">
-        <item name="android:layout_height">56dp</item>
-        <item name="android:textSize">16sp</item>
-        <item name="android:textAllCaps">true</item>
-        <item name="android:maxLines">1</item>
-        <item name="android:minWidth">15dp</item>
-        <item name="android:minHeight">15dp</item>
-        <item name="android:textColor">@color/button_bar_text</item>
-        <item name="android:fontFamily">sans-serif</item>
-        <item name="android:drawablePadding">6dp</item>
-        <item name="android:ellipsize">end</item>
-    </style>
-
-    <style name="ButtonBar.Left">
-        <item name="android:paddingStart">34dp</item>
-        <item name="android:gravity">center_vertical|start</item>
-        <item name="android:drawableLeft">@drawable/ic_chevron_left_dark</item>
-    </style>
-
-    <style name="ButtonBar.Right">
-        <item name="android:paddingEnd">34dp</item>
-        <item name="android:gravity">center_vertical|end</item>
-        <item name="android:drawableRight">@drawable/ic_chevron_right_dark</item>
-    </style>
-
     <style name="LocaleWidget">
         <item name="android:textAppearance">?android:attr/textAppearance</item>
     </style>
diff --git a/src/org/lineageos/setupwizard/BaseSetupWizardActivity.java b/src/org/lineageos/setupwizard/BaseSetupWizardActivity.java
index 512e75b..d27a5f6 100644
--- a/src/org/lineageos/setupwizard/BaseSetupWizardActivity.java
+++ b/src/org/lineageos/setupwizard/BaseSetupWizardActivity.java
@@ -56,12 +56,10 @@
 
 import com.android.settingslib.Utils;
 
-import com.google.android.setupdesign.view.NavigationBar;
-import com.google.android.setupdesign.view.NavigationBar.NavigationBarListener;
-import com.google.android.setupcompat.util.SystemBarHelper;
 import com.google.android.setupcompat.util.WizardManagerHelper;
 import com.google.android.setupdesign.GlifLayout;
 
+import org.lineageos.setupwizard.NavigationLayout.NavigationBarListener;
 import org.lineageos.setupwizard.util.SetupWizardUtils;
 
 import java.util.List;
@@ -83,11 +81,11 @@
     protected static final int BIOMETRIC_ACTIVITY_REQUEST = 10101;
     protected static final int SCREENLOCK_ACTIVITY_REQUEST = 10102;
 
-    private static final int IMMERSIVE_FLAGS =
-            View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
-    private int mSystemUiFlags = IMMERSIVE_FLAGS | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
+    private static final int IMMERSIVE_FLAGS = View.STATUS_BAR_DISABLE_HOME
+            | View.STATUS_BAR_DISABLE_RECENT;
+    private int mSystemUiFlags = IMMERSIVE_FLAGS;
 
-    private NavigationBar mNavigationBar;
+    private NavigationLayout mNavigationBar;
 
     protected boolean mIsActivityVisible = false;
     protected boolean mIsExiting = false;
@@ -96,6 +94,7 @@
     private boolean mIsPrimaryUser;
     protected int mResultCode = 0;
     private Intent mResultData;
+
     private final BroadcastReceiver finishReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -121,11 +120,6 @@
         mNavigationBar = getNavigationBar();
         if (mNavigationBar != null) {
             mNavigationBar.setNavigationBarListener(this);
-            mNavigationBar.addOnLayoutChangeListener((View view,
-                    int left, int top, int right, int bottom,
-                    int oldLeft, int oldTop, int oldRight, int oldBottom) -> {
-                view.requestApplyInsets();
-            });
             mNavigationBar.setSystemUiVisibility(mSystemUiFlags);
             // Set the UI flags before draw because the visibility might change in unexpected /
             // undetectable times, like transitioning from a finishing activity that had a keyboard
@@ -237,59 +231,9 @@
      * @return The navigation bar instance in the layout, or null if the layout does not have a
      *     navigation bar.
      */
-    public NavigationBar getNavigationBar() {
+    public NavigationLayout getNavigationBar() {
         final View view = findViewById(R.id.navigation_bar);
-        return view instanceof NavigationBar ? (NavigationBar) view : null;
-    }
-
-    /**
-     * Sets whether system navigation bar should be hidden.
-     * @param useImmersiveMode True to activate immersive mode and hide the system navigation bar
-     */
-    public void setUseImmersiveMode(boolean useImmersiveMode) {
-        // By default, enable layoutHideNavigation if immersive mode is used
-        setUseImmersiveMode(useImmersiveMode, useImmersiveMode);
-    }
-
-    public void setUseImmersiveMode(boolean useImmersiveMode, boolean layoutHideNavigation) {
-        if (useImmersiveMode) {
-            mSystemUiFlags |= IMMERSIVE_FLAGS;
-            if (layoutHideNavigation) {
-                mSystemUiFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
-            }
-        } else {
-            mSystemUiFlags &= ~(IMMERSIVE_FLAGS | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
-        }
-        if (mNavigationBar != null) {
-            mNavigationBar.setSystemUiVisibility(mSystemUiFlags);
-        }
-    }
-
-    protected void setBackDrawable(Drawable drawable) {
-        if (mNavigationBar != null) {
-            mNavigationBar.getBackButton().setCompoundDrawables(drawable, null, null, null);
-        }
-    }
-
-    protected void setNextDrawable(Drawable drawable) {
-        if (mNavigationBar != null) {
-            mNavigationBar.getBackButton().setCompoundDrawables(null, null, drawable, null);
-        }
-    }
-
-    public void setBackAllowed(boolean allowed) {
-        SystemBarHelper.setBackButtonVisible(getWindow(), allowed);
-        if (mNavigationBar != null) {
-            Button backButton = mNavigationBar.getBackButton();
-            backButton.setEnabled(allowed);
-        }
-    }
-
-    protected boolean isBackAllowed() {
-        if (mNavigationBar != null) {
-            mNavigationBar.getBackButton().isEnabled();
-        }
-        return false;
+        return view instanceof NavigationLayout ? (NavigationLayout) view : null;
     }
 
     public void setNextAllowed(boolean allowed) {
@@ -309,15 +253,19 @@
         nextAction(NEXT_REQUEST);
     }
 
+    protected void onSkipPressed() {
+        nextAction(NEXT_REQUEST);
+    }
+
     protected void setNextText(int resId) {
         if (mNavigationBar != null) {
             mNavigationBar.getNextButton().setText(resId);
         }
     }
 
-    protected void setBackText(int resId) {
+    protected void setSkipText(int resId) {
         if (mNavigationBar != null) {
-            mNavigationBar.getBackButton().setText(resId);
+            mNavigationBar.getSkipButton().setText(resId);
         }
     }
 
@@ -351,6 +299,10 @@
         onNextPressed();
     }
 
+    public void onSkip() {
+        onSkipPressed();
+    }
+
     protected void startEmergencyDialer() {
         try {
             startFirstRunActivityForResult(new Intent(ACTION_EMERGENCY_DIAL),
@@ -528,15 +480,6 @@
         }
     }
 
-    protected void hideBackButton() {
-        if (mNavigationBar != null) {
-            Animation fadeOut = AnimationUtils.loadAnimation(this, android.R.anim.fade_out);
-            final Button back = mNavigationBar.getBackButton();
-            back.startAnimation(fadeOut);
-            back.setVisibility(INVISIBLE);
-        }
-    }
-
     protected int getTransition() {
         return TRANSITION_ID_SLIDE;
     }
diff --git a/src/org/lineageos/setupwizard/BiometricActivity.java b/src/org/lineageos/setupwizard/BiometricActivity.java
index 0eaaa26..510bc46 100644
--- a/src/org/lineageos/setupwizard/BiometricActivity.java
+++ b/src/org/lineageos/setupwizard/BiometricActivity.java
@@ -51,9 +51,13 @@
     }
 
     @Override
+    protected void onNextPressed() {
+        launchBiometricSetup();
+    }
+
+    @Override
     protected void onStartSubactivity() {
         setNextAllowed(true);
-        findViewById(R.id.setup_biometric).setOnClickListener(view -> launchBiometricSetup());
     }
 
     @Override
diff --git a/src/org/lineageos/setupwizard/FinishActivity.java b/src/org/lineageos/setupwizard/FinishActivity.java
index 4eeaeb9..6937454 100644
--- a/src/org/lineageos/setupwizard/FinishActivity.java
+++ b/src/org/lineageos/setupwizard/FinishActivity.java
@@ -111,7 +111,6 @@
         sendBroadcastAsUser(i, getCallingUserHandle(), FINISH_SETUP);
 
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
-        hideBackButton();
         hideNextButton();
         finishSetup();
     }
diff --git a/src/org/lineageos/setupwizard/NavigationLayout.java b/src/org/lineageos/setupwizard/NavigationLayout.java
new file mode 100644
index 0000000..daa837f
--- /dev/null
+++ b/src/org/lineageos/setupwizard/NavigationLayout.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2021 The LineageOS Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.lineageos.setupwizard;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.Button;
+import android.widget.RelativeLayout;
+
+public class NavigationLayout extends RelativeLayout {
+    /*
+     * An interface to listen to events of the navigation bar,
+     * namely when the user clicks on the back or next button.
+     */
+    public interface NavigationBarListener {
+        void onNavigateBack();
+        void onNavigateNext();
+        void onSkip();
+    }
+
+    private final Button mNextButton;
+    private final Button mSkipButton;
+
+    public NavigationLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        View.inflate(context, R.layout.navigation_layout, this);
+        mNextButton = findViewById(R.id.navbar_next);
+        mSkipButton = findViewById(R.id.navbar_skip);
+
+        TypedArray a = context.getTheme().obtainStyledAttributes(
+             attrs, R.styleable.NavigationLayout, 0, 0);
+        final boolean showSkipButton;
+        try {
+            showSkipButton = a.getBoolean(
+                    R.styleable.NavigationLayout_showSkipButton, false);
+        } finally {
+            a.recycle();
+        }
+
+        if (showSkipButton) {
+            mSkipButton.setVisibility(View.VISIBLE);
+        }
+    }
+
+    public Button getSkipButton() {
+        return mSkipButton;
+    }
+
+    public Button getNextButton() {
+        return mNextButton;
+    }
+
+    public void setNavigationBarListener(NavigationBarListener listener) {
+        mSkipButton.setOnClickListener(view -> listener.onSkip());
+        mNextButton.setOnClickListener(view -> listener.onNavigateNext());
+    }
+}
diff --git a/src/org/lineageos/setupwizard/ScreenLockActivity.java b/src/org/lineageos/setupwizard/ScreenLockActivity.java
index 92fa528..74b1062 100644
--- a/src/org/lineageos/setupwizard/ScreenLockActivity.java
+++ b/src/org/lineageos/setupwizard/ScreenLockActivity.java
@@ -24,8 +24,8 @@
 
 import android.app.KeyguardManager;
 import android.content.Intent;
+import android.os.Bundle;
 import android.util.Log;
-import android.view.View;
 
 import org.lineageos.setupwizard.util.SetupWizardUtils;
 
@@ -34,6 +34,11 @@
     public static final String TAG = ScreenLockActivity.class.getSimpleName();
 
     @Override
+    protected void onNextPressed() {
+        launchLockscreenSetup();
+    }
+
+    @Override
     protected void onStartSubactivity() {
         if (isKeyguardSecure()) {
             Log.v(TAG, "Screen lock already set up; skipping ScreenLockActivity");
@@ -43,12 +48,6 @@
             return;
         }
         setNextAllowed(true);
-        findViewById(R.id.setup_lockscreen).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                launchLockscreenSetup();
-            }
-        });
     }
 
     @Override
diff --git a/src/org/lineageos/setupwizard/WelcomeActivity.java b/src/org/lineageos/setupwizard/WelcomeActivity.java
index 7f6aac2..3fef20d 100644
--- a/src/org/lineageos/setupwizard/WelcomeActivity.java
+++ b/src/org/lineageos/setupwizard/WelcomeActivity.java
@@ -35,8 +35,7 @@
         super.onCreate(savedInstanceState);
         mRootView = findViewById(R.id.setup_wizard_layout);
         setNextText(R.string.next);
-        setBackText(R.string.emergency_call);
-        setBackDrawable(null);
+        setSkipText(R.string.emergency_call);
         mEnableAccessibilityController =
                 EnableAccessibilityController.getInstance(getApplicationContext());
         mRootView.setOnTouchListener((v, event) ->
@@ -48,6 +47,11 @@
     public void onBackPressed() {}
 
     @Override
+    public void onSkip() {
+        startEmergencyDialer();
+    }
+
+    @Override
     public void onNavigateBack() {
         startEmergencyDialer();
     }
diff --git a/src/org/lineageos/setupwizard/backup/RestoreIntroActivity.java b/src/org/lineageos/setupwizard/backup/RestoreIntroActivity.java
index b0ee807..aa10d97 100644
--- a/src/org/lineageos/setupwizard/backup/RestoreIntroActivity.java
+++ b/src/org/lineageos/setupwizard/backup/RestoreIntroActivity.java
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2019-2020 The Calyx Institute
- * Copyright (C) 2020 The LineageOS Project
+ * Copyright (C) 2020-2021 The LineageOS Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
 
+import org.lineageos.setupwizard.NavigationLayout;
 import org.lineageos.setupwizard.R;
 import org.lineageos.setupwizard.SubBaseActivity;
 
@@ -33,12 +34,15 @@
     @Override
     protected void onStartSubactivity() {
         setNextAllowed(true);
-
-        findViewById(R.id.intro_restore_button).setOnClickListener(v -> launchRestore());
     }
 
     @Override
     protected void onNextPressed() {
+        launchRestore();
+    }
+
+    @Override
+    protected void onSkipPressed() {
         Intent intent = WizardManagerHelper.getNextIntent(getIntent(), Activity.RESULT_OK);
         nextAction(NEXT_REQUEST, intent);
     }