Development Options: toggle binderized hals

This allows for quick performance testing and also for a better
dogfooding experience.

Bug: 34256441
Test: Verification with getprop.
Change-Id: I81c5e0b1044d4569a6fe55a4b30f7e21c4465fc2
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 877da58..1af24a7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7370,6 +7370,9 @@
     <!-- Name of the setting to disable the automatic update -->
     <string name="ota_disable_automatic_update">Automatic system updates</string>
 
+    <!-- Name of the setting to enable hal binderization -->
+    <string name="enable_hal_binderization">Binderized HALs (requires reboot)</string>
+
     <!-- Label for category for data usage [CHAR LIMIT=30] -->
     <string name="usage">Usage</string>
 
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index b655865..eebf47d 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -91,6 +91,10 @@
         android:summary="@string/color_temperature_desc" />
 
     <SwitchPreference
+        android:key="enable_hal_binderization"
+        android:title="@string/enable_hal_binderization" />
+
+    <SwitchPreference
         android:key="ota_disable_automatic_update"
         android:title="@string/ota_disable_automatic_update" />
 
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index c673676..d13dba3 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -222,6 +222,8 @@
     private static final String KEY_CONVERT_FBE = "convert_to_file_encryption";
 
     private static final String OTA_DISABLE_AUTOMATIC_UPDATE_KEY = "ota_disable_automatic_update";
+    private static final String ENABLE_HAL_BINDERIZATION_KEY = "enable_hal_binderization";
+    private static final String ENABLE_HAL_BINDERIZATION_PROPERTY = "persist.hal.binderization";
 
     private static final int RESULT_DEBUG_APP = 1000;
     private static final int RESULT_MOCK_LOCATION_APP = 1001;
@@ -284,6 +286,7 @@
     private ListPreference mBluetoothSelectA2dpLdacPlaybackQuality;
 
     private SwitchPreference mOtaDisableAutomaticUpdate;
+    private SwitchPreference mEnableHalBinderization;
     private SwitchPreference mWifiAllowScansWithTraffic;
     private SwitchPreference mStrictMode;
     private SwitchPreference mPointerLocation;
@@ -522,6 +525,8 @@
 
         mOtaDisableAutomaticUpdate = findAndInitSwitchPref(OTA_DISABLE_AUTOMATIC_UPDATE_KEY);
 
+        mEnableHalBinderization = findAndInitSwitchPref(ENABLE_HAL_BINDERIZATION_KEY);
+
         mColorModePreference = (ColorModePreference) findPreference(KEY_COLOR_MODE);
         mColorModePreference.updateCurrentAndSupported();
         if (mColorModePreference.getColorModeCount() < 2) {
@@ -751,6 +756,7 @@
         updateShowAllANRsOptions();
         updateVerifyAppsOverUsbOptions();
         updateOtaDisableAutomaticUpdateOptions();
+        updateEnableHalBinderizationOptions();
         updateBugreportOptions();
         updateForceRtlOptions();
         updateLogdSizeValues();
@@ -1040,6 +1046,17 @@
                 mOtaDisableAutomaticUpdate.isChecked() ? 0 : 1);
     }
 
+    private void updateEnableHalBinderizationOptions() {
+        updateSwitchPreference(mEnableHalBinderization,
+                SystemProperties.getBoolean(ENABLE_HAL_BINDERIZATION_PROPERTY, false));
+    }
+
+    private void writeEnableHalBinderizationOptions() {
+        SystemProperties.set(ENABLE_HAL_BINDERIZATION_PROPERTY,
+                             mEnableHalBinderization.isChecked() ? "true" : "false");
+        pokeSystemProperties();
+    }
+
     private boolean enableVerifierSetting() {
         final ContentResolver cr = getActivity().getContentResolver();
         if (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) == 0) {
@@ -2398,6 +2415,8 @@
             writeVerifyAppsOverUsbOptions();
         } else if (preference == mOtaDisableAutomaticUpdate) {
             writeOtaDisableAutomaticUpdateOptions();
+        } else if (preference == mEnableHalBinderization) {
+            writeEnableHalBinderizationOptions();
         } else if (preference == mStrictMode) {
             writeStrictModeVisualOptions();
         } else if (preference == mPointerLocation) {