Support AIDL IDumpstateDevice service in verbose vendor logging

IDumpstateDevice HAL switched to AIDL service in P22 devices.
This change will firstly apply to AIDL service if available and
fall back to HIDL service if not, making the feature work for
both HIDL an AIDL based devices.

Bug: 242634531
Test: make && make RunSettingsRoboTests
Change-Id: I4a2ec44092804574a60113e5be3df19b586bfa64
diff --git a/Android.bp b/Android.bp
index 4af8d09..9ddadaf 100644
--- a/Android.bp
+++ b/Android.bp
@@ -85,6 +85,7 @@
         "zxing-core-1.7",
         "android.hardware.dumpstate-V1.0-java",
         "android.hardware.dumpstate-V1.1-java",
+        "android.hardware.dumpstate-V1-java",
         "lottie",
         "WifiTrackerLib",
         "SettingsLibActivityEmbedding",
diff --git a/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceController.java b/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceController.java
index e1db74d..051cede 100644
--- a/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceController.java
+++ b/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceController.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.hardware.dumpstate.V1_0.IDumpstateDevice;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
@@ -40,8 +41,12 @@
 
     private static final String ENABLE_VERBOSE_VENDOR_LOGGING_KEY = "enable_verbose_vendor_logging";
     private static final int DUMPSTATE_HAL_VERSION_UNKNOWN = -1;
-    private static final int DUMPSTATE_HAL_VERSION_1_0 = 0;
-    private static final int DUMPSTATE_HAL_VERSION_1_1 = 1;
+    private static final int DUMPSTATE_HAL_VERSION_1_0 = 0; // HIDL v1.0
+    private static final int DUMPSTATE_HAL_VERSION_1_1 = 1; // HIDL v1.1
+    private static final int DUMPSTATE_HAL_VERSION_2_0 = 2; // AIDL v1
+
+    private static final String DUMP_STATE_AIDL_SERVICE_NAME =
+            android.hardware.dumpstate.IDumpstateDevice.DESCRIPTOR + "/default";
 
     private int mDumpstateHalVersion;
 
@@ -57,9 +62,8 @@
 
     @Override
     public boolean isAvailable() {
-        // Only show preference when IDumpstateDevice v1.1 is avalaible
-        // This is temperary strategy that may change later.
-        return isIDumpstateDeviceV1_1ServiceAvailable();
+        // Only show preference when IDumpstateDevice AIDL or HIDL v1.1 service is available
+        return isIDumpstateDeviceAidlServiceAvailable() || isIDumpstateDeviceV1_1ServiceAvailable();
     }
 
     @Override
@@ -86,15 +90,31 @@
     boolean isIDumpstateDeviceV1_1ServiceAvailable() {
         IDumpstateDevice service = getDumpstateDeviceService();
         if (service == null) {
-            if (DBG) Log.d(TAG, "IDumpstateDevice service is not available.");
+            if (DBG) Log.d(TAG, "IDumpstateDevice v1.1 service is not available.");
         }
-        return service != null && mDumpstateHalVersion >= DUMPSTATE_HAL_VERSION_1_1;
+        return service != null && mDumpstateHalVersion == DUMPSTATE_HAL_VERSION_1_1;
+    }
+
+    @VisibleForTesting
+    boolean isIDumpstateDeviceAidlServiceAvailable() {
+        android.hardware.dumpstate.IDumpstateDevice aidlService = getDumpstateDeviceAidlService();
+        return aidlService != null;
     }
 
     @VisibleForTesting
     void setVerboseLoggingEnabled(boolean enable) {
-        IDumpstateDevice service = getDumpstateDeviceService();
+        // First check if AIDL service is available
+        android.hardware.dumpstate.IDumpstateDevice aidlService = getDumpstateDeviceAidlService();
+        if (aidlService != null) {
+            try {
+                aidlService.setVerboseLoggingEnabled(enable);
+            } catch (RemoteException re) {
+                if (DBG) Log.e(TAG, "aidlService.setVerboseLoggingEnabled fail: " + re);
+            }
+        }
 
+        // Then check HIDL v1.1 service
+        IDumpstateDevice service = getDumpstateDeviceService();
         if (service == null || mDumpstateHalVersion < DUMPSTATE_HAL_VERSION_1_1) {
             if (DBG) Log.d(TAG, "setVerboseLoggingEnabled not supported.");
             return;
@@ -107,14 +127,24 @@
                 service11.setVerboseLoggingEnabled(enable);
             }
         } catch (RemoteException | RuntimeException e) {
-            if (DBG) Log.e(TAG, "setVerboseLoggingEnabled fail: " + e);
+            if (DBG) Log.e(TAG, "HIDL v1.1 setVerboseLoggingEnabled fail: " + e);
         }
     }
 
     @VisibleForTesting
     boolean getVerboseLoggingEnabled() {
-        IDumpstateDevice service = getDumpstateDeviceService();
+        // First check if AIDL service is available
+        android.hardware.dumpstate.IDumpstateDevice aidlService = getDumpstateDeviceAidlService();
+        if (aidlService != null) {
+            try {
+                return aidlService.getVerboseLoggingEnabled();
+            } catch (RemoteException re) {
+                if (DBG) Log.e(TAG, "aidlService.getVerboseLoggingEnabled fail: " + re);
+            }
+        }
 
+        // Then check HIDL v1.1 service
+        IDumpstateDevice service = getDumpstateDeviceService();
         if (service == null || mDumpstateHalVersion < DUMPSTATE_HAL_VERSION_1_1) {
             if (DBG) Log.d(TAG, "getVerboseLoggingEnabled not supported.");
             return false;
@@ -127,7 +157,7 @@
                 return service11.getVerboseLoggingEnabled();
             }
         } catch (RemoteException | RuntimeException e) {
-            if (DBG) Log.e(TAG, "getVerboseLoggingEnabled fail: " + e);
+            if (DBG) Log.e(TAG, "HIDL v1.1 getVerboseLoggingEnabled fail: " + e);
         }
         return false;
     }
@@ -141,6 +171,7 @@
                     .getService(true /* retry */);
             mDumpstateHalVersion = DUMPSTATE_HAL_VERSION_1_1;
         } catch (NoSuchElementException | RemoteException e) {
+            if (DBG) Log.e(TAG, "Get HIDL v1.1 service fail: " + e);
         }
 
         if (service == null) {
@@ -149,6 +180,7 @@
                         .getService(true /* retry */);
                 mDumpstateHalVersion = DUMPSTATE_HAL_VERSION_1_0;
             } catch (NoSuchElementException | RemoteException e) {
+                if (DBG) Log.e(TAG, "Get HIDL v1.0 service fail: " + e);
             }
         }
 
@@ -157,4 +189,24 @@
         }
         return service;
     }
+
+    /**
+     * Return a {@link android.hardware.dumpstate.IDumpstateDevice} instance or null if service is
+     * not available.
+     */
+    @VisibleForTesting
+    @Nullable android.hardware.dumpstate.IDumpstateDevice getDumpstateDeviceAidlService() {
+        android.hardware.dumpstate.IDumpstateDevice service = null;
+        try {
+            service = android.hardware.dumpstate.IDumpstateDevice.Stub.asInterface(
+                    ServiceManager.waitForDeclaredService(DUMP_STATE_AIDL_SERVICE_NAME));
+        } catch (NoSuchElementException e) {
+            if (DBG) Log.e(TAG, "Get AIDL service fail: " + e);
+        }
+
+        if (service != null) {
+            mDumpstateHalVersion = DUMPSTATE_HAL_VERSION_2_0;
+        }
+        return service;
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceControllerTest.java
index 6145939..8e62521 100644
--- a/tests/robotests/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceControllerTest.java
@@ -47,6 +47,8 @@
     private PreferenceScreen mPreferenceScreen;
     @Mock
     IDumpstateDevice mIDumpstateDevice;
+    @Mock
+    android.hardware.dumpstate.IDumpstateDevice mIDumpstateDeviceAidl;
 
     private Context mContext;
     private EnableVerboseVendorLoggingPreferenceController mController;
@@ -57,6 +59,7 @@
         mContext = RuntimeEnvironment.application;
         mController = spy(new EnableVerboseVendorLoggingPreferenceController(mContext));
         doReturn(mIDumpstateDevice).when(mController).getDumpstateDeviceService();
+        doReturn(mIDumpstateDeviceAidl).when(mController).getDumpstateDeviceAidlService();
 
         // mock with Dumpstate HAL v1.1
         Field f = EnableVerboseVendorLoggingPreferenceController.class
@@ -70,7 +73,9 @@
     }
 
     @Test
-    public void onPreferenceChange_settingEnable_enableVendorLoggingShouldBeOn() throws Exception {
+    public void onPreferenceChange_settingEnableByHidl_enableVendorLoggingShouldBeOn()
+            throws Exception {
+        doReturn(null).when(mController).getDumpstateDeviceAidlService();
         doReturn(true).when(mIDumpstateDevice).getVerboseLoggingEnabled();
 
         mController.onPreferenceChange(mPreference, true /* new value */);
@@ -80,8 +85,21 @@
     }
 
     @Test
-    public void onPreferenceChange_settingDisable_enableVendorLoggingShouldBeOff()
+    public void onPreferenceChange_settingEnableByAidl_enableVendorLoggingShouldBeOn()
             throws Exception {
+        doReturn(mIDumpstateDeviceAidl).when(mController).getDumpstateDeviceAidlService();
+        doReturn(true).when(mIDumpstateDeviceAidl).getVerboseLoggingEnabled();
+
+        mController.onPreferenceChange(mPreference, true /* new value */);
+
+        final boolean enabled = mController.getVerboseLoggingEnabled();
+        assertTrue(enabled);
+    }
+
+    @Test
+    public void onPreferenceChange_settingDisableByHidl_enableVendorLoggingShouldBeOff()
+            throws Exception {
+        doReturn(null).when(mController).getDumpstateDeviceAidlService();
         doReturn(false).when(mIDumpstateDevice).getVerboseLoggingEnabled();
 
         mController.onPreferenceChange(mPreference,  false /* new value */);
@@ -91,7 +109,20 @@
     }
 
     @Test
-    public void updateState_settingDisabled_preferenceShouldNotBeChecked() throws Exception {
+    public void onPreferenceChange_settingDisableByAidl_enableVendorLoggingShouldBeOff()
+            throws Exception {
+        doReturn(mIDumpstateDeviceAidl).when(mController).getDumpstateDeviceAidlService();
+        doReturn(false).when(mIDumpstateDeviceAidl).getVerboseLoggingEnabled();
+
+        mController.onPreferenceChange(mPreference,  false /* new value */);
+
+        final boolean enabled = mController.getVerboseLoggingEnabled();
+        assertFalse(enabled);
+    }
+
+    @Test
+    public void updateState_settingDisabledByHidl_preferenceShouldNotBeChecked() throws Exception {
+        doReturn(null).when(mController).getDumpstateDeviceAidlService();
         doReturn(false).when(mIDumpstateDevice).getVerboseLoggingEnabled();
 
         mController.setVerboseLoggingEnabled(false);
@@ -101,7 +132,19 @@
     }
 
     @Test
-    public void updateState_settingEnabled_preferenceShouldBeChecked() throws Exception {
+    public void updateState_settingDisabledByAidl_preferenceShouldNotBeChecked() throws Exception {
+        doReturn(mIDumpstateDeviceAidl).when(mController).getDumpstateDeviceAidlService();
+        doReturn(false).when(mIDumpstateDeviceAidl).getVerboseLoggingEnabled();
+
+        mController.setVerboseLoggingEnabled(false);
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(false);
+    }
+
+    @Test
+    public void updateState_settingEnabledByHidl_preferenceShouldBeChecked() throws Exception {
+        doReturn(null).when(mController).getDumpstateDeviceAidlService();
         doReturn(true).when(mIDumpstateDevice).getVerboseLoggingEnabled();
 
         mController.setVerboseLoggingEnabled(true);
@@ -111,7 +154,19 @@
     }
 
     @Test
-    public void onDeveloperOptionDisabled_shouldDisablePreference() throws Exception {
+    public void updateState_settingEnabledByAidl_preferenceShouldBeChecked() throws Exception {
+        doReturn(mIDumpstateDeviceAidl).when(mController).getDumpstateDeviceAidlService();
+        doReturn(true).when(mIDumpstateDeviceAidl).getVerboseLoggingEnabled();
+
+        mController.setVerboseLoggingEnabled(true);
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(true);
+    }
+
+    @Test
+    public void onDeveloperOptionDisabled_byHidl_shouldDisablePreference() throws Exception {
+        doReturn(null).when(mController).getDumpstateDeviceAidlService();
         doReturn(false).when(mIDumpstateDevice).getVerboseLoggingEnabled();
 
         mController.onDeveloperOptionsSwitchDisabled();
@@ -121,4 +176,17 @@
         verify(mPreference).setChecked(false);
         verify(mPreference).setEnabled(false);
     }
+
+    @Test
+    public void onDeveloperOptionDisabled_byAidl_shouldDisablePreference() throws Exception {
+        doReturn(mIDumpstateDeviceAidl).when(mController).getDumpstateDeviceAidlService();
+        doReturn(false).when(mIDumpstateDeviceAidl).getVerboseLoggingEnabled();
+
+        mController.onDeveloperOptionsSwitchDisabled();
+
+        final boolean enabled = mController.getVerboseLoggingEnabled();
+        assertFalse(enabled);
+        verify(mPreference).setChecked(false);
+        verify(mPreference).setEnabled(false);
+    }
 }