Navbar: Introduce navbar styles [1/3]

Change-Id: I286e77eaadc1bd914d16444c25a0e5228e444a79
Signed-off-by: rohan <purohit.rohan@gmail.com>
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 5cdba9d..df72c62 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -6691,6 +6691,12 @@
         private static final Validator CENTER_NOTIFICATION_HEADERS_VALIDATOR = BOOLEAN_VALIDATOR;
 
         /**
+         * Switch between different navbar styles
+         * @hide
+         */
+        public static final String NAVBAR_STYLE = "navbar_style";
+
+        /**
          * Settings to backup. This is here so that it's in the same place as the settings
          * keys and easy to update.
          *
diff --git a/core/java/com/android/internal/util/bliss/BlissUtils.java b/core/java/com/android/internal/util/bliss/BlissUtils.java
index 03c6aa3..b6a0178 100644
--- a/core/java/com/android/internal/util/bliss/BlissUtils.java
+++ b/core/java/com/android/internal/util/bliss/BlissUtils.java
@@ -159,6 +159,15 @@
         "com.android.systemui.qsheader.transparent", // 4
     };
 
+    // Navbar styles
+    public static final String[] NAVBAR_STYLES = {
+        "com.android.system.navbar.stock", //0
+        "com.android.system.navbar.asus", //1
+        "com.android.system.navbar.oneplus", //2
+        "com.android.system.navbar.oneui", //3
+        "com.android.system.navbar.tecno", //4
+    };
+
     public static boolean isChineseLanguage() {
        return Resources.getSystem().getConfiguration().locale.getLanguage().startsWith(
                Locale.CHINESE.getLanguage());
@@ -874,4 +883,27 @@
            }
         }
     }
+
+    // Unloads the navbar styles
+    private static void unloadNavbarStyle(IOverlayManager om, int userId) {
+        for (String style : NAVBAR_STYLES) {
+            try {
+                om.setEnabled(style, false, userId);
+            } catch (RemoteException e) {
+            }
+        }
+    }
+
+    // Set navbar style
+    public static void setNavbarStyle(IOverlayManager om, int userId, int navbarStyle) {
+        // Always unload navbar styles
+        unloadNavbarStyle(om, userId);
+
+        if (navbarStyle == 0) return;
+
+        try {
+            om.setEnabled(NAVBAR_STYLES[navbarStyle], true, userId);
+        } catch (RemoteException e) {
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 765088f..b5daff9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -342,6 +342,8 @@
             "system:" + Settings.System.STOCK_STATUSBAR_IN_HIDE;
     private static final String STATUS_BAR_CUSTOM_HEADER =
             "system:" + Settings.System.OMNI_STATUS_BAR_CUSTOM_HEADER;
+    private static final String NAVBAR_STYLE =
+            "system:" + Settings.System.NAVBAR_STYLE;
 
     private static final String BANNER_ACTION_CANCEL =
             "com.android.systemui.statusbar.banner_action_cancel";
@@ -682,6 +684,7 @@
     private boolean mWereIconsJustHidden;
     private boolean mBouncerWasShowingWhenHidden;
 
+    private int mNavbarStyle;
     private int mImmerseMode;
     private boolean mStockStatusBar = true;
     private boolean mPortrait = true;
@@ -844,6 +847,8 @@
         tunerService.addTunable(this, DISPLAY_CUTOUT_MODE);
         tunerService.addTunable(this, STOCK_STATUSBAR_IN_HIDE);
         tunerService.addTunable(this, STATUS_BAR_CUSTOM_HEADER);
+        tunerService.addTunable(this, NAVBAR_STYLE);
+
         mDisplayManager = mContext.getSystemService(DisplayManager.class);
 
         mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
@@ -4428,6 +4433,12 @@
         updateQSPanel();
     }
 
+    private void updateNavbarStyle() {
+        mUiOffloadThread.submit(() -> {
+            BlissUtils.setNavbarStyle(mOverlayManager, mLockscreenUserManager.getCurrentUserId(), mNavbarStyle);
+        });
+    }
+
     private void updateCorners() {
         if (mSysuiRoundedFwvals && !isCurrentRoundedSameAsFw()) {
             float density = Resources.getSystem().getDisplayMetrics().density;
@@ -5913,6 +5924,14 @@
             case STATUS_BAR_CUSTOM_HEADER:
                 updateTheme();
                 break;
+            case NAVBAR_STYLE:
+                int navbarStyle =
+                        TunerService.parseInteger(newValue, 0);
+                if (mNavbarStyle != navbarStyle) {
+                    mNavbarStyle = navbarStyle;
+                    updateNavbarStyle();
+                }
+                break;
             default:
                 break;
         }