Integrate Receiver for QSB visibility

Updated Launcher with QsbReceiver to adjust search bar
visibility based on Settings search bar toggle.

Issue: FP3-A13#366
Issue: FP4-A14#151
Change-Id: Ic4f907726f404d1f99d1d38dc18713baf0f58fa5
Depends-On: I5dbe4c46d8687741c30a5d79e75a9191a6981bee
(cherry picked from commit 3da9937cf41cc0c85af258b893316b725021b3a2)
(cherry picked from commit 0bf826f0eef6597ae79d78b033cca0b3cbf1f076)
(cherry picked from commit e0255c96fd8b34a743903f0dfc60113e374c3dc2)
(cherry picked from commit f18436992d14f476428924429507f13ba67d8c75)
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 7da16c0..51d4a59 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -81,6 +81,8 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentSender;
+import android.content.IntentFilter;
+import android.content.BroadcastReceiver;
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
@@ -333,6 +335,8 @@
 
     private DropTargetBar mDropTargetBar;
 
+    private QsbReceiver qsbReceiver;
+
     // Main container view for the all apps screen.
     @Thunk
     ActivityAllAppsContainerView<Launcher> mAppsView;
@@ -394,6 +398,7 @@
     private boolean mTouchInProgress;
 
     private SafeCloseable mUserChangedCallbackCloseable;
+    public static boolean GSB_ON_HOME_SCREEN = true;
 
     // New InstanceId is assigned to mAllAppsSessionLogId for each AllApps sessions.
     // When Launcher is not in AllApps state mAllAppsSessionLogId will be null.
@@ -476,6 +481,13 @@
         LauncherAppState app = LauncherAppState.getInstance(this);
         mModel = app.getModel();
 
+        qsbReceiver = new QsbReceiver();
+        registerReceiver();
+
+        // Initialize the search bar state from SharedPreferences
+        SharedPreferences sharedPreferences = getSharedPreferences("QsbPrefs", Context.MODE_PRIVATE);
+        GSB_ON_HOME_SCREEN = sharedPreferences.getBoolean(QsbReceiver.KEY_SEARCH_BAR, true);
+
         mRotationHelper = new RotationHelper(this);
         InvariantDeviceProfile idp = app.getInvariantDeviceProfile();
         initDeviceProfile(idp);
@@ -2363,7 +2375,7 @@
         int count = orderedScreenIds.size();
         for (int i = 0; i < count; i++) {
             int screenId = orderedScreenIds.get(i);
-            if (FeatureFlags.QSB_ON_FIRST_SCREEN && screenId == Workspace.FIRST_SCREEN_ID) {
+            if (FeatureFlags.QSB_ON_FIRST_SCREEN && Launcher.GSB_ON_HOME_SCREEN && screenId == Workspace.FIRST_SCREEN_ID) {
                 // No need to bind the first screen, as its always bound.
                 continue;
             }
@@ -3353,6 +3365,41 @@
         });
     }
 
+    private void registerReceiver() {
+        IntentFilter filter = new IntentFilter("com.android.display.ACTION_SWITCH_TOGGLED");
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            registerReceiver(qsbReceiver, filter, Context.RECEIVER_EXPORTED);
+        } else {
+            registerReceiver(qsbReceiver, filter);
+        }
+    }
+
+    public class QsbReceiver extends BroadcastReceiver {
+
+        private static final String TAG = "QsbReceiver";
+        // Action string for the broadcast intent
+        private static final String ACTION_SWITCH_TOGGLED = "com.android.display.ACTION_SWITCH_TOGGLED";
+
+        private static final String KEY_SEARCH_BAR = "qsb_search_bar";
+      //  public static final boolean GSB_ON_HOME_SCREEN = true; //Default value true
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (ACTION_SWITCH_TOGGLED.equals(intent.getAction())) {
+            boolean switchState = intent.getBooleanExtra(KEY_SEARCH_BAR, true);
+            GSB_ON_HOME_SCREEN = switchState; // Update the GSB_ON_HOME_SCREEN with the new switch state
+
+            // Save the state to SharedPreferences
+            SharedPreferences sharedPreferences = context.getSharedPreferences("QsbPrefs", Context.MODE_PRIVATE);
+            sharedPreferences.edit().putBoolean(KEY_SEARCH_BAR, switchState).apply();
+
+        } else {
+            Log.e(TAG, "Received unexpected action: " + intent.getAction());
+            }
+        }
+    }
+
+
     /**
      * Returns {@code true} if there are visible tasks with windowing mode set to
      * {@link android.app.WindowConfiguration#WINDOWING_MODE_FREEFORM}
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index ba492d5..a215fa9 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -591,7 +591,7 @@
      * Initializes and binds the first page
      */
     public void bindAndInitFirstWorkspaceScreen() {
-        if (!FeatureFlags.QSB_ON_FIRST_SCREEN) {
+        if (!FeatureFlags.QSB_ON_FIRST_SCREEN || !Launcher.GSB_ON_HOME_SCREEN) {
             return;
         }
 
diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java
index 855a69d..119c299 100644
--- a/src/com/android/launcher3/model/LoaderCursor.java
+++ b/src/com/android/launcher3/model/LoaderCursor.java
@@ -36,6 +36,7 @@
 import androidx.annotation.VisibleForTesting;
 
 import com.android.launcher3.InvariantDeviceProfile;
+import com.android.launcher3.Launcher;
 import com.android.launcher3.LauncherAppState;
 import com.android.launcher3.LauncherSettings.Favorites;
 import com.android.launcher3.Utilities;
@@ -542,7 +543,7 @@
                 // container.
                 int spanX = mIDP.numSearchContainerColumns;
                 int spanY = 1;
-                screen.markCells(0, 0, spanX, spanY, true);
+                screen.markCells(0, 0, spanX, spanY, Launcher.GSB_ON_HOME_SCREEN);
             }
             mOccupied.put(item.screenId, screen);
         }
diff --git a/src/com/android/launcher3/qsb/QsbContainerView.java b/src/com/android/launcher3/qsb/QsbContainerView.java
index f295204..17dd785 100644
--- a/src/com/android/launcher3/qsb/QsbContainerView.java
+++ b/src/com/android/launcher3/qsb/QsbContainerView.java
@@ -48,6 +48,7 @@
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.graphics.FragmentWithPreview;
 import com.android.launcher3.widget.util.WidgetSizes;
+import com.android.launcher3.Launcher;
 
 /**
  * A frame layout which contains a QSB. This internally uses fragment to bind the view, which
@@ -265,6 +266,12 @@
             if (mQsb != null && mQsb.isReinflateRequired(mOrientation)) {
                 rebindFragment();
             }
+            if (Launcher.GSB_ON_HOME_SCREEN) {
+                mWrapper.removeAllViews();
+                mWrapper.addView(createQsb(mWrapper));
+            } else {
+                mWrapper.removeAllViews();
+            }
         }
 
         @Override
@@ -286,7 +293,7 @@
         }
 
         public boolean isQsbEnabled() {
-            return FeatureFlags.QSB_ON_FIRST_SCREEN;
+            return FeatureFlags.QSB_ON_FIRST_SCREEN && Launcher.GSB_ON_HOME_SCREEN;
         }
 
         protected Bundle createBindOptions() {