Merge "Support AIDL IDumpstateDevice service in verbose vendor logging" into tm-qpr-dev
diff --git a/Android.bp b/Android.bp
index 5bf5514..11a0d18 100644
--- a/Android.bp
+++ b/Android.bp
@@ -83,6 +83,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);
+    }
 }