Snap for 11908474 from c4b622b391d4bb0bb98b433fc9b95da73c965ccc to 24Q3-release

Change-Id: Ib2c0e31c26135e1885af8909f36a4379fb3646c0
diff --git a/service/java/com/android/server/wifi/DeviceConfigFacade.java b/service/java/com/android/server/wifi/DeviceConfigFacade.java
index f908046..6116aae 100644
--- a/service/java/com/android/server/wifi/DeviceConfigFacade.java
+++ b/service/java/com/android/server/wifi/DeviceConfigFacade.java
@@ -918,6 +918,15 @@
         mOobPseudonymFeatureFlagChangedListener = listener;
     }
 
+    /**
+     * Get the set of bugreports that are explicitly disabled.
+     * @return A Set of String to indicate disabled auto-bugreports trigger points.
+     */
+    public Set<String> getDisabledAutoBugreportTitleAndDetails() {
+        // TODO: b/336376991
+        return Collections.EMPTY_SET;
+    }
+
     public FeatureFlags getFeatureFlags() {
         return mFeatureFlags;
     }
diff --git a/service/java/com/android/server/wifi/HalDeviceManager.java b/service/java/com/android/server/wifi/HalDeviceManager.java
index 99f929c..b5ff88a 100644
--- a/service/java/com/android/server/wifi/HalDeviceManager.java
+++ b/service/java/com/android/server/wifi/HalDeviceManager.java
@@ -1114,6 +1114,7 @@
         dispatchRttControllerLifecycleOnDestroyed();
         mRttControllerLifecycleCallbacks.clear();
         mWifiP2pIfaces.clear();
+        mWifiInjector.getWifiConfigManager().writeDataToStorage();
     }
 
     private class WifiDeathRecipient implements WifiHal.DeathRecipient {
diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java
index ba6ec48..9b0af36 100644
--- a/service/java/com/android/server/wifi/WifiConfigManager.java
+++ b/service/java/com/android/server/wifi/WifiConfigManager.java
@@ -4566,9 +4566,9 @@
     }
 
     /**
-     * Handle the device shutdown, should write all cached data to the storage
+     * Write all cached data to the storage
      */
-    public void handleShutDown() {
+    public void writeDataToStorage() {
         if (mPendingStoreRead) {
             Log.e(TAG, "Cannot save to store before store is read!");
             return;
diff --git a/service/java/com/android/server/wifi/WifiDiagnostics.java b/service/java/com/android/server/wifi/WifiDiagnostics.java
index 19fece6..4c48868 100644
--- a/service/java/com/android/server/wifi/WifiDiagnostics.java
+++ b/service/java/com/android/server/wifi/WifiDiagnostics.java
@@ -1023,6 +1023,24 @@
         }
     }
 
+    private boolean shouldTakeBugreport(String bugTitle, String bugDetail) {
+        long currentTimeMs = mClock.getWallClockMillis();
+        long timeSinceLastUploadMs = currentTimeMs - mLastBugReportTime;
+        if (timeSinceLastUploadMs
+                < mWifiInjector.getDeviceConfigFacade().getBugReportMinWindowMs()
+                && mLastBugReportTime > 0) {
+            Log.d(TAG, "Bugreport was filed recently, skip " + bugTitle + "(" + bugDetail + ")");
+            return false;
+        }
+        String titleAndDetail = bugTitle + bugDetail;
+        if (mWifiInjector.getDeviceConfigFacade().getDisabledAutoBugreportTitleAndDetails()
+                .contains(titleAndDetail)) {
+            Log.d(TAG, "Bugreport explicitly disabled " + bugTitle + "(" + bugDetail + ")");
+            return false;
+        }
+        return true;
+    }
+
     /**
      * Initiates a system-level bug report if there is no bug report taken recently.
      * This is done in a non-blocking fashion.
@@ -1035,12 +1053,7 @@
             return;
         }
 
-        long currentTimeMs = mClock.getWallClockMillis();
-        long timeSinceLastUploadMs = currentTimeMs - mLastBugReportTime;
-        if (timeSinceLastUploadMs
-                < mWifiInjector.getDeviceConfigFacade().getBugReportMinWindowMs()
-                && mLastBugReportTime > 0) {
-            Log.d(TAG, "Bugreport was filed recently, skip " + bugTitle + "(" + bugDetail + ")");
+        if (!shouldTakeBugreport(bugTitle, bugDetail)) {
             return;
         }
 
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 7914f15..752d9a6 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -1033,7 +1033,7 @@
         // before memory store write triggered by mMemoryStoreImpl.stop().
         mWifiScoreCard.resetAllConnectionStates();
         mMemoryStoreImpl.stop();
-        mWifiConfigManager.handleShutDown();
+        mWifiConfigManager.writeDataToStorage();
     }
 
     private boolean checkNetworkSettingsPermission(int pid, int uid) {
diff --git a/service/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
index 36e54b0..67293df 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
@@ -138,6 +138,7 @@
     @Mock private WorkSourceHelper mWorkSourceHelper1;
     @Mock private WorkSourceHelper mWorkSourceHelper2;
     @Mock private DeviceConfigFacade mDeviceConfigFacade;
+    @Mock private WifiConfigManager mWifiConfigManager;
     @Mock private FeatureFlags mFeatureFlags;
     private TestLooper mTestLooper;
     private Handler mHandler;
@@ -175,6 +176,7 @@
         mHandler = new Handler(mTestLooper.getLooper());
 
         when(mWifiInjector.getInterfaceConflictManager()).thenReturn(mInterfaceConflictManager);
+        when(mWifiInjector.getWifiConfigManager()).thenReturn(mWifiConfigManager);
         when(mInterfaceConflictManager.needsUserApprovalToDelete(anyInt(), any(), anyInt(), any()))
                 .thenReturn(false);
         when(mWifiInjector.makeWsHelper(TEST_WORKSOURCE_0)).thenReturn(mWorkSourceHelper0);
@@ -248,6 +250,7 @@
         // verify: onStop called
         mInOrder.verify(mWifiMock).stop();
         mInOrder.verify(mManagerStatusListenerMock).onStatusChanged();
+        verify(mWifiConfigManager).writeDataToStorage();
 
         verifyNoMoreInteractions(mManagerStatusListenerMock);
     }
@@ -300,6 +303,7 @@
 
         // verify: getting onStop
         mInOrder.verify(mManagerStatusListenerMock).onStatusChanged();
+        verify(mWifiConfigManager).writeDataToStorage();
 
         // act: start
         collector.checkThat(mDut.start(), equalTo(true));
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
index 7441990..68a763e 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
@@ -4080,7 +4080,7 @@
         mContextConfigStoreMockOrder.verify(mWifiConfigStore).write();
         verify(mWifiMetrics).wifiConfigStored(anyInt());
         // Verify shut down handling
-        mWifiConfigManager.handleShutDown();
+        mWifiConfigManager.writeDataToStorage();
         mContextConfigStoreMockOrder.verify(mWifiConfigStore).write();
     }
 
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiDiagnosticsTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiDiagnosticsTest.java
index f2a2f44..4457977 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiDiagnosticsTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiDiagnosticsTest.java
@@ -59,6 +59,8 @@
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.regex.Pattern;
 
@@ -159,6 +161,8 @@
         when(mActiveModeWarden.getPrimaryClientModeManager()).thenReturn(mClientModeManager);
         when(mActiveModeWarden.getClientModeManagers()).thenReturn(clientModeManagerList);
         when(mDeviceConfigFacade.getBugReportMinWindowMs()).thenReturn(BUG_REPORT_MIN_WINDOW_MS);
+        when(mDeviceConfigFacade.getDisabledAutoBugreportTitleAndDetails()).thenReturn(
+                Collections.EMPTY_SET);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
         when(mPackageManager.queryIntentActivities(any(), anyInt())).thenReturn(mResolveInfoList);
         // needed to for the loop in WifiDiagnostics.readLogcatStreamLinesWithTimeout().
@@ -924,6 +928,17 @@
     }
 
     @Test
+    public void takeBugreportIgnoredWhenTitleAndDetailDisabled() {
+        // Verify bugreport is disabled for a specific title and detail.
+        // Use set of empty String here to match empty title and detail.
+        when(mDeviceConfigFacade.getDisabledAutoBugreportTitleAndDetails()).thenReturn(
+                new HashSet<>(Arrays.asList("TITLEDETAIL")));
+        when(mBuildProperties.isUserBuild()).thenReturn(false);
+        mWifiDiagnostics.takeBugReport("TITLE", "DETAIL");
+        verify(mPackageManager, never()).queryIntentActivities(any(), anyInt());
+    }
+
+    @Test
     public void takeBugReportSwallowsExceptions() {
         when(mBuildProperties.isUserBuild()).thenReturn(false);
         doThrow(new RuntimeException()).when(mBugreportManager).requestBugreport(
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
index 18851ea..284bb26 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
@@ -12168,7 +12168,7 @@
         mBroadcastReceiverCaptor.getValue().onReceive(mContext, intent);
         verify(mActiveModeWarden).notifyShuttingDown();
         verify(mWifiScoreCard).resetAllConnectionStates();
-        verify(mWifiConfigManager).handleShutDown();
+        verify(mWifiConfigManager).writeDataToStorage();
     }
 
     @Test(expected = SecurityException.class)