Removable Google Search bar on home screen

Add toggle for Google search bar visibility in "Display"
options and added controller file.

Issue: FP4-A14#151
Change-Id: I5dbe4c46d8687741c30a5d79e75a9191a6981bee
(cherry picked from commit d9acd6d96164b6daa321df7e0274f14f19770e45)
(cherry picked from commit 17f9cd917a2c3f6bbd5053834bdf5aafcb5e922a)
(cherry picked from commit 8d5e37c05d0fbbd11b641e79406a06a2dd3ac005)
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 52f28f3..d6afc18 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -5960,4 +5960,9 @@
     <string name="find_broadcast_password_dialog_password_error" msgid="243855327674765">"Forkert adgangskode"</string>
     <string name="bt_le_audio_scan_qr_code_scanner" msgid="7614569515419813053">"Centrer QR-koden nedenfor for at gå i gang med at lytte"</string>
     <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="7821837654128137901">"QR-koden har ikke et gyldigt format"</string>
+
+    <string name="qsb_search_bar_title">Søgelinje</string>
+    <string name="qsb_search_bar_title_description">Vis/Skjul søgelinje på startskærmen</string>
+    <string name="reboot_required_title">Genstart påkrævet</string>
+    <string name="reboot_required_message">Anvend og genstart for at anvende ændringer</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 95a66f7..2e252e4 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -5966,4 +5966,9 @@
     <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="7821837654128137901">"Das Format des QR-Codes ist ungültig"</string>
     <string name="swap_back_recents_title">Zurück/Zuletzt verwendet wechseln</string>
     <string name="swap_back_recents_summary">Die Schaltflächen "Zurück" und "Zuletzt verwendet" in der Navigationsleiste austauschen</string>
+
+    <string name="qsb_search_bar_title">Suchleiste</string>
+    <string name="qsb_search_bar_title_description">Suchleiste des Startbildschirms anzeigen/verbergen</string>
+    <string name="reboot_required_title">Neustart erforderlich</string>
+    <string name="reboot_required_message">Übernehmen und neu starten, um anzuwenden</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 009a404..e3a8e30 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -5965,4 +5965,9 @@
     <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="7821837654128137901">"El código QR no tiene un formato válido"</string>
     <string name="swap_back_recents_title">Cambia la navegación de volver/recientes</string>
     <string name="swap_back_recents_summary">Cambia los botones de volver y recientes en la barra de navegación</string>
+
+    <string name="qsb_search_bar_title">Barra de búsqueda</string>
+    <string name="qsb_search_bar_title_description">Mostrar/Ocultar la barra de búsqueda en la pantalla de inicio</string>
+    <string name="reboot_required_title">Reinicio necesario</string>
+    <string name="reboot_required_message">Aplicar y reiniciar para que los cambios tengan efecto</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index a329245..8eb5439 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -5966,4 +5966,9 @@
     <string name="battery_info">Batterie Information</string>
     <string name="swap_back_recents_title">Échanger la navigation arrière / récentes</string>
     <string name="swap_back_recents_summary">Échangez les boutons arrière et récent dans la barre de navigation</string>
+
+    <string name="qsb_search_bar_title">Barre de recherche</string>
+    <string name="qsb_search_bar_title_description">Afficher/supprimer la barre de recherche sur l\'écran d\'accueil</string>
+    <string name="reboot_required_title">Redémarrer le téléphone (obligatoire)</string>
+    <string name="reboot_required_message">Enregistrer les préférences et redémarrer</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 16629fe..7ee2fe1 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -5966,4 +5966,9 @@
     <string name="data_preference">"Preferenze dati mobili"</string>
     <string name="swap_back_recents_title">Inverti l\'ordine dei pulsanti Indietro e Panoramica App</string>
     <string name="swap_back_recents_summary">Inverti l\'ordine dei pulsanti per tornare indietro e mostrare l\'elenco app recenti nella barra di navigazione inferiore</string>
+
+    <string name="qsb_search_bar_title">Barra di ricerca</string>
+    <string name="qsb_search_bar_title_description">Mostra/Nascondi la barra di ricerca della schermata iniziale</string>
+    <string name="reboot_required_title">Riavvio richiesto</string>
+    <string name="reboot_required_message">Applica e riavvia per applicare le modifiche</string>
     </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 29636a8..c350f00 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -5966,4 +5966,9 @@
     <string name="data_preference">"Gegevens en voorkeuren"</string>
     <string name="swap_back_recents_title">Terug- en recent-knop omwissel</string>
     <string name="swap_back_recents_summary">Wissel de terug- en recent-knop om in de navigatiebalk</string>
+
+    <string name="qsb_search_bar_title">Zoekbalk</string>
+    <string name="qsb_search_bar_title_description">Zoekbalk startscherm weergeven/verbergen</string>
+    <string name="reboot_required_title">Opnieuw opstarten vereist</string>
+    <string name="reboot_required_message">Toepassen en herstarten om toe te passen</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 178d298..aed1bc6 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -5962,4 +5962,9 @@
     <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="7821837654128137901">"O código QR não está em um formato válido"</string>
     <string name="swap_back_recents_title">Troque a ordem de Anterior e Vista geral de apps</string>
     <string name="swap_back_recents_summary">Troque a ordem dos botões Anterior e Vista geral de apps na barra de navegação</string>
+
+    <string name="qsb_search_bar_title">Barra de pesquisa</string>
+    <string name="qsb_search_bar_title_description">Mostrar/Ocultar a barra de pesquisa da tela inicial</string>
+    <string name="reboot_required_title">Reinicialização necessária</string>
+    <string name="reboot_required_message">Aplicar alterações e Reiniciar</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 6d57dd4..69ae493 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -5965,4 +5965,9 @@
     <string name="find_broadcast_password_dialog_password_error" msgid="243855327674765">"Fel lösenord"</string>
     <string name="bt_le_audio_scan_qr_code_scanner" msgid="7614569515419813053">"Centrera QR-koden nedan om du vill börja lyssna"</string>
     <string name="bt_le_audio_qr_code_is_not_valid_format" msgid="7821837654128137901">"QR-kodens format är ogiltigt"</string>
+
+    <string name="qsb_search_bar_title">Sökfält</string>
+    <string name="qsb_search_bar_title_description">Visa/Dölj sökfältet på startskärmen</string>
+    <string name="reboot_required_title">Omstart krävs</string>
+    <string name="reboot_required_message">Tillämpa och starta om för att tillämpa ändringar</string>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e8e5c28..ec7202c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -14603,4 +14603,10 @@
     <string name="swap_back_recents_title">Swap Back/Recents Navigation</string>
     <!-- Summary text for swapping the back and recents buttons in the navigation bar. [CHAR LIMIT=NONE] -->
     <string name="swap_back_recents_summary">Swap the back and recents button in the navigation bar.</string>
+
+    <!--add search bar toggle-->
+    <string name="qsb_search_bar_title">Search bar</string>
+    <string name="qsb_search_bar_title_description">Show/Hide Homescreen Search Bar</string>
+    <string name="reboot_required_title">Reboot Required</string>
+    <string name="reboot_required_message">Apply &amp; Reboot to Apply Changes</string>
 </resources>
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index ad5236e..a3f0d36 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -172,5 +172,12 @@
             android:key="vr_display_pref"
             android:title="@string/display_vr_pref_title"
             android:fragment="com.android.settings.display.VrDisplayPreferencePicker"/>
+
+        <SwitchPreference
+            android:key="qsb_search_bar"
+            android:title="@string/qsb_search_bar_title"
+            android:summary="@string/qsb_search_bar_title_description"
+            android:defaultValue="true"
+            settings:controller="com.android.settings.display.SearchModePreferenceController"/>
     </PreferenceCategory>
 </PreferenceScreen>
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index 97b9aae..0ff06de 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -26,6 +26,7 @@
 import com.android.settings.display.LiftToWakePreferenceController;
 import com.android.settings.display.ShowOperatorNamePreferenceController;
 import com.android.settings.display.TapToWakePreferenceController;
+import com.android.settings.display.SearchModePreferenceController;
 import com.android.settings.display.ThemePreferenceController;
 import com.android.settings.display.VrDisplayPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -76,6 +77,7 @@
         controllers.add(new CameraGesturePreferenceController(context));
         controllers.add(new LiftToWakePreferenceController(context));
         controllers.add(new TapToWakePreferenceController(context));
+        controllers.add(new SearchModePreferenceController(context));
         controllers.add(new VrDisplayPreferenceController(context));
         controllers.add(new ShowOperatorNamePreferenceController(context));
         controllers.add(new ThemePreferenceController(context));
diff --git a/src/com/android/settings/display/SearchModePreferenceController.java b/src/com/android/settings/display/SearchModePreferenceController.java
new file mode 100644
index 0000000..4974d9b
--- /dev/null
+++ b/src/com/android/settings/display/SearchModePreferenceController.java
@@ -0,0 +1,116 @@
+package com.android.settings.display;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.util.Log;
+import android.widget.Toast;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import android.app.ActivityManager;
+import android.os.PowerManager;
+import android.os.UserHandle;
+
+public class SearchModePreferenceController extends BasePreferenceController {
+
+    private static final String TAG = "SearchModePreferenceController";
+    private static final String KEY_SEARCH_BAR = "qsb_search_bar";
+
+    private SharedPreferences sharedPreferences;
+    private static final String PREF_NAME = "QsbPrefs";
+    public static final int AVAILABLE = 1;
+
+    private SwitchPreference switchPreference;
+    private boolean previousState;
+
+    public SearchModePreferenceController(Context context) {
+        super(context, KEY_SEARCH_BAR);
+        // Initialize SharedPreferences
+        sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY_SEARCH_BAR;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        try {
+            switchPreference = screen.findPreference(KEY_SEARCH_BAR);
+            if (switchPreference != null) {
+                boolean isSearchModeEnabled = sharedPreferences.getBoolean(KEY_SEARCH_BAR, true);
+                switchPreference.setChecked(isSearchModeEnabled);
+                switchPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+                    @Override
+                    public boolean onPreferenceChange(Preference preference, Object newValue) {
+                        boolean isEnabled = (Boolean) newValue;
+                        previousState = switchPreference.isChecked(); // Save the previous state
+                        showRebootDialog(isEnabled);
+                        return false; // Do not change the state immediately
+                    }
+                });
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "Error displaying preference", e);
+        }
+    }
+
+    private void showRebootDialog(boolean isEnabled) {
+        new AlertDialog.Builder(mContext)
+            .setTitle(mContext.getString(R.string.reboot_required_title))
+            .setMessage(mContext.getString(R.string.reboot_required_message))
+            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
+                public void onClick(DialogInterface dialog, int which) {
+                    // Save the new value to SharedPreferences
+                    sharedPreferences.edit().putBoolean(KEY_SEARCH_BAR, isEnabled).apply();
+                    broadcastSwitchState(isEnabled);
+                    rebootDevice();
+                }
+            })
+            .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
+                public void onClick(DialogInterface dialog, int which) {
+                    // User cancelled the dialog
+                    dialog.dismiss();
+                    // Reset the toggle to its previous state
+                    switchPreference.setChecked(previousState);
+                }
+            })
+            .setIcon(android.R.drawable.ic_dialog_alert)
+            .show();
+    }
+
+    private void broadcastSwitchState(boolean isEnabled) {
+        try {
+            Intent intent = new Intent("com.android.display.ACTION_SWITCH_TOGGLED");
+            intent.putExtra(KEY_SEARCH_BAR, isEnabled);
+            int userId = ActivityManager.getCurrentUser();
+            mContext.sendBroadcastAsUser(intent, new UserHandle(userId));
+        } catch (Exception e) {
+            Log.e(TAG, "Failed to broadcast switch state", e);
+        }
+    }
+
+    private void rebootDevice() {
+        try {
+            PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+            if (pm != null) {
+                pm.reboot(null);
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "Failed to reboot the device", e);
+            Toast.makeText(mContext, "Failed to reboot the device", Toast.LENGTH_SHORT).show();
+        }
+    }
+}