Enable/disable auto-join for Suggestions

allow user override auto-join for network suggestion, when disabled,
will not be considered for network selection.

Bug: 139199957
Test: atest com.android.server.wifi
Change-Id: If021be2fea2a7ee2bd7694b41dc495fb0bcad7f6
diff --git a/service/java/com/android/server/wifi/NetworkSuggestionNominator.java b/service/java/com/android/server/wifi/NetworkSuggestionNominator.java
index 4032598..d2808de 100644
--- a/service/java/com/android/server/wifi/NetworkSuggestionNominator.java
+++ b/service/java/com/android/server/wifi/NetworkSuggestionNominator.java
@@ -30,6 +30,7 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -74,6 +75,8 @@
             boolean untrustedNetworkAllowed,
             @NonNull OnConnectableListener onConnectableListener) {
         MatchMetaInfo matchMetaInfo = new MatchMetaInfo();
+        Set<ExtendedWifiNetworkSuggestion> autoJoinDisabledSuggestions = new HashSet<>();
+
         List<ScanDetail> filteredScanDetails = scanDetails.stream().filter(scanDetail ->
                 !mWifiConfigManager.wasEphemeralNetworkDeleted(
                         ScanResultUtil.createQuotedSSID(scanDetail.getScanResult().SSID)))
@@ -82,13 +85,16 @@
             return;
         }
         findMatchedPasspointSuggestionNetworks(filteredScanDetails, matchMetaInfo);
-        findMatchedSuggestionNetworks(filteredScanDetails, matchMetaInfo);
-        // Return early on no match.
+        findMatchedSuggestionNetworks(filteredScanDetails, matchMetaInfo,
+                autoJoinDisabledSuggestions);
+
         if (matchMetaInfo.isEmpty()) {
-            mLocalLog.log("did not see any matching network suggestions.");
-            return;
+            mLocalLog.log("did not see any matching auto-join enabled network suggestions.");
+        } else {
+            matchMetaInfo.findConnectableNetworksAndHighestPriority(onConnectableListener);
         }
-        matchMetaInfo.findConnectableNetworksAndHighestPriority(onConnectableListener);
+
+        addAutojoinDisabledSuggestionToWifiConfigManager(autoJoinDisabledSuggestions);
     }
 
     private void findMatchedPasspointSuggestionNetworks(List<ScanDetail> scanDetails,
@@ -98,7 +104,11 @@
         for (Pair<ScanDetail, WifiConfiguration> candidate : candidates) {
             Set<ExtendedWifiNetworkSuggestion> matchingPasspointExtSuggestions =
                     mWifiNetworkSuggestionsManager
-                            .getNetworkSuggestionsForFqdn(candidate.second.FQDN);
+                            .getNetworkSuggestionsForFqdn(candidate.second.FQDN)
+                                .stream()
+                                .filter(
+                                    ens -> ens.isAutoJoinEnabled)
+                                .collect(Collectors.toSet());
             if (matchingPasspointExtSuggestions == null
                     || matchingPasspointExtSuggestions.isEmpty()) {
                 continue;
@@ -109,19 +119,32 @@
     }
 
     private void findMatchedSuggestionNetworks(List<ScanDetail> scanDetails,
-            MatchMetaInfo matchMetaInfo) {
+            MatchMetaInfo matchMetaInfo,
+            Set<ExtendedWifiNetworkSuggestion> autoJoinDisabledSuggestions) {
         for (ScanDetail scanDetail : scanDetails) {
             Set<ExtendedWifiNetworkSuggestion> matchingExtNetworkSuggestions =
                     mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail(scanDetail);
             if (matchingExtNetworkSuggestions == null || matchingExtNetworkSuggestions.isEmpty()) {
                 continue;
             }
+            Set<ExtendedWifiNetworkSuggestion> autojoinEnableSuggestions =
+                    matchingExtNetworkSuggestions.stream()
+                            .filter(ewns -> ewns.isAutoJoinEnabled)
+                            .collect(Collectors.toSet());
+            autoJoinDisabledSuggestions.addAll(
+                    matchingExtNetworkSuggestions.stream()
+                    .filter(ewns -> !ewns.isAutoJoinEnabled)
+                    .collect(Collectors.toSet()));
+
+            if (autojoinEnableSuggestions.isEmpty()) {
+                continue;
+            }
             // All matching suggestions have the same network credentials type. So, use any one of
             // them to lookup/add the credentials to WifiConfigManager.
             // Note: Apps could provide different credentials (password, ceritificate) for the same
             // network, need to handle that in the future.
             ExtendedWifiNetworkSuggestion matchingExtNetworkSuggestion =
-                    matchingExtNetworkSuggestions.stream().findAny().get();
+                    autojoinEnableSuggestions.stream().findAny().get();
             // Check if we already have a network with the same credentials in WifiConfigManager
             // database.
             WifiConfiguration wCmConfiguredNetwork =
@@ -129,12 +152,15 @@
                             matchingExtNetworkSuggestion.wns.wifiConfiguration.getKey());
             if (wCmConfiguredNetwork != null) {
                 // If existing network is not from suggestion, ignore.
-                if (!wCmConfiguredNetwork.fromWifiNetworkSuggestion) {
+                if (!(wCmConfiguredNetwork.fromWifiNetworkSuggestion
+                        && wCmConfiguredNetwork.allowAutojoin)) {
                     continue;
                 }
                 // Update the WifiConfigManager with the latest WifiConfig
+                WifiConfiguration config = createConfigForAddingToWifiConfigManager(
+                        matchingExtNetworkSuggestion.wns.wifiConfiguration, true);
                 NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(
-                        matchingExtNetworkSuggestion.wns.wifiConfiguration,
+                        config,
                         matchingExtNetworkSuggestion.perAppInfo.uid,
                         matchingExtNetworkSuggestion.perAppInfo.packageName);
                 if (result.isSuccess()) {
@@ -153,14 +179,48 @@
         }
     }
 
+    // Add auto-join disabled suggestions also to WifiConfigManager if the app allows credential
+    // sharing.This will surface these networks on the UI, to allow the user manually connect to it.
+    private void addAutojoinDisabledSuggestionToWifiConfigManager(
+            Set<ExtendedWifiNetworkSuggestion> autoJoinDisabledSuggestions) {
+        for (ExtendedWifiNetworkSuggestion ewns : autoJoinDisabledSuggestions) {
+            if (!ewns.wns.isUserAllowedToManuallyConnect) {
+                continue;
+            }
+            WifiConfiguration config =
+                    createConfigForAddingToWifiConfigManager(ewns.wns.wifiConfiguration, false);
+            WifiConfiguration wCmConfiguredNetwork =
+                    mWifiConfigManager.getConfiguredNetwork(config.getKey());
+            NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(
+                    config, ewns.perAppInfo.uid, ewns.perAppInfo.packageName);
+            if (!result.isSuccess()) {
+                mLocalLog.log("Failed to add network suggestion");
+                continue;
+            }
+            WifiConfiguration currentWCmConfiguredNetwork =
+                    mWifiConfigManager.getConfiguredNetwork(result.netId);
+            // Try to enable network selection
+            if (wCmConfiguredNetwork == null) {
+                if (!mWifiConfigManager.updateNetworkSelectionStatus(result.getNetworkId(),
+                        WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLE)) {
+                    mLocalLog.log("Failed to make network suggestion selectable");
+                }
+            } else {
+                if (!currentWCmConfiguredNetwork.getNetworkSelectionStatus().isNetworkEnabled()
+                        && !mWifiConfigManager.tryEnableNetwork(wCmConfiguredNetwork.networkId)) {
+                    mLocalLog.log("Ignoring blacklisted network: "
+                            + WifiNetworkSelector.toNetworkString(wCmConfiguredNetwork));
+                }
+            }
+        }
+    }
+
     // Add and enable this network to the central database (i.e WifiConfigManager).
     // Returns the copy of WifiConfiguration with the allocated network ID filled in.
     private WifiConfiguration addCandidateToWifiConfigManager(
-            @NonNull WifiConfiguration wifiConfiguration, int uid, @NonNull String packageName) {
-        // Mark the network ephemeral because we don't want these persisted by WifiConfigManager.
-        wifiConfiguration.ephemeral = true;
-        wifiConfiguration.fromWifiNetworkSuggestion = true;
-
+            @NonNull WifiConfiguration config, int uid, @NonNull String packageName) {
+        WifiConfiguration wifiConfiguration =
+                createConfigForAddingToWifiConfigManager(config, true);
         NetworkUpdateResult result =
                 mWifiConfigManager.addOrUpdateNetwork(wifiConfiguration, uid, packageName);
         if (!result.isSuccess()) {
@@ -176,6 +236,16 @@
         return mWifiConfigManager.getConfiguredNetwork(candidateNetworkId);
     }
 
+    private WifiConfiguration createConfigForAddingToWifiConfigManager(WifiConfiguration config,
+            boolean allowAutojoin) {
+        WifiConfiguration wifiConfiguration = new WifiConfiguration(config);
+        // Mark the network ephemeral because we don't want these persisted by WifiConfigManager.
+        wifiConfiguration.ephemeral = true;
+        wifiConfiguration.fromWifiNetworkSuggestion = true;
+        wifiConfiguration.allowAutojoin = allowAutojoin;
+        return wifiConfiguration;
+    }
+
     @Override
     public @NominatorId int getId() {
         return NOMINATOR_ID_SUGGESTION;
diff --git a/service/java/com/android/server/wifi/NetworkSuggestionStoreData.java b/service/java/com/android/server/wifi/NetworkSuggestionStoreData.java
index 2a4ae35..f3b5e95 100644
--- a/service/java/com/android/server/wifi/NetworkSuggestionStoreData.java
+++ b/service/java/com/android/server/wifi/NetworkSuggestionStoreData.java
@@ -65,6 +65,8 @@
     private static final String XML_TAG_IS_USER_INTERACTION_REQUIRED = "IsUserInteractionRequired";
     private static final String XML_TAG_IS_USER_ALLOWED_TO_MANUALLY_CONNECT =
             "IsUserAllowedToManuallyConnect";
+    private static final String XML_TAG_IS_INITIALIZED_AUTO_JOIN = "InitializedAutoJoinEnabled";
+    private static final String XML_TAG_IS_AUTO_JOIN = "AutoJoinEnabled";
     private static final String XML_TAG_SUGGESTOR_UID = "SuggestorUid";
     private static final String XML_TAG_SUGGESTOR_PACKAGE_NAME = "SuggestorPackageName";
     private static final String XML_TAG_SUGGESTOR_FEATURE_ID = "SuggestorFeatureId";
@@ -194,7 +196,7 @@
             @Nullable WifiConfigStoreEncryptionUtil encryptionUtil)
             throws XmlPullParserException, IOException {
         for (ExtendedWifiNetworkSuggestion extNetworkSuggestion : extNetworkSuggestions) {
-            serializeNetworkSuggestion(out, extNetworkSuggestion.wns, encryptionUtil);
+            serializeNetworkSuggestion(out, extNetworkSuggestion, encryptionUtil);
         }
     }
 
@@ -205,9 +207,11 @@
      * @throws IOException
      */
     private void serializeNetworkSuggestion(XmlSerializer out,
-            final WifiNetworkSuggestion suggestion,
+            final ExtendedWifiNetworkSuggestion extSuggestion,
             @Nullable WifiConfigStoreEncryptionUtil encryptionUtil)
             throws XmlPullParserException, IOException {
+        WifiNetworkSuggestion suggestion = extSuggestion.wns;
+
         XmlUtil.writeNextSectionStart(out, XML_TAG_SECTION_HEADER_NETWORK_SUGGESTION);
 
         // Serialize WifiConfiguration.
@@ -239,6 +243,10 @@
                 suggestion.isUserInteractionRequired);
         XmlUtil.writeNextValue(out, XML_TAG_IS_USER_ALLOWED_TO_MANUALLY_CONNECT,
                 suggestion.isUserAllowedToManuallyConnect);
+        XmlUtil.writeNextValue(out, XML_TAG_IS_INITIALIZED_AUTO_JOIN,
+                suggestion.isInitialAutoJoinEnabled);
+        XmlUtil.writeNextValue(out, XML_TAG_IS_AUTO_JOIN,
+                extSuggestion.isAutoJoinEnabled);
         XmlUtil.writeNextSectionEnd(out, XML_TAG_SECTION_HEADER_NETWORK_SUGGESTION);
     }
 
@@ -314,13 +322,14 @@
                         }
                         switch (tagName) {
                             case XML_TAG_SECTION_HEADER_NETWORK_SUGGESTION:
-                                WifiNetworkSuggestion networkSuggestion =
+                                Pair<WifiNetworkSuggestion, Boolean> networkSuggestionData =
                                         parseNetworkSuggestion(
                                                 in, outerTagDepth + 2, version, encryptionUtil,
                                                 perAppInfo);
                                 perAppInfo.extNetworkSuggestions.add(
                                         ExtendedWifiNetworkSuggestion.fromWns(
-                                                networkSuggestion, perAppInfo));
+                                                networkSuggestionData.first, perAppInfo,
+                                                networkSuggestionData.second));
                                 break;
                             default:
                                 Log.w(TAG, "Ignoring unknown tag under "
@@ -356,8 +365,8 @@
      * @throws XmlPullParserException
      * @throws IOException
      */
-    private WifiNetworkSuggestion parseNetworkSuggestion(XmlPullParser in, int outerTagDepth,
-            @WifiConfigStore.Version int version,
+    private Pair<WifiNetworkSuggestion, Boolean> parseNetworkSuggestion(XmlPullParser in,
+            int outerTagDepth, @WifiConfigStore.Version int version,
             @Nullable WifiConfigStoreEncryptionUtil encryptionUtil, PerAppInfo perAppInfo)
             throws XmlPullParserException, IOException {
         Pair<String, WifiConfiguration> parsedConfig = null;
@@ -366,6 +375,8 @@
         boolean isAppInteractionRequired = false;
         boolean isUserInteractionRequired = false;
         boolean isUserAllowedToManuallyConnect = false; // Backward compatibility.
+        boolean isInitializedAutoJoinEnabled = true; // backward compat
+        boolean isAutoJoinEnabled = true; // backward compat
         int suggestorUid = Process.INVALID_UID;
 
         // Loop through and parse out all the elements from the stream within this section.
@@ -384,6 +395,12 @@
                     case XML_TAG_IS_USER_ALLOWED_TO_MANUALLY_CONNECT:
                         isUserAllowedToManuallyConnect = (boolean) value;
                         break;
+                    case XML_TAG_IS_INITIALIZED_AUTO_JOIN:
+                        isInitializedAutoJoinEnabled = (boolean) value;
+                        break;
+                    case XML_TAG_IS_AUTO_JOIN:
+                        isAutoJoinEnabled = (boolean) value;
+                        break;
                     case XML_TAG_SUGGESTOR_UID:
                         // Only needed for migration of data from Q to R.
                         suggestorUid = (int) value;
@@ -441,13 +458,13 @@
         // ExtWifiNetworkSuggestion to the top level PerAppInfo. This block of code helps
         // with migration of data for devices upgrading from Q to R.
         perAppInfo.setUid(suggestorUid);
-        WifiConfiguration wifiConfiguration =  parsedConfig.second;
+        WifiConfiguration wifiConfiguration = parsedConfig.second;
         if (enterpriseConfig != null) {
             wifiConfiguration.enterpriseConfig = enterpriseConfig;
         }
-        return new WifiNetworkSuggestion(
-                wifiConfiguration, passpointConfiguration, isAppInteractionRequired,
-                isUserInteractionRequired, isUserAllowedToManuallyConnect);
+        return Pair.create(new WifiNetworkSuggestion(wifiConfiguration, passpointConfiguration,
+                isAppInteractionRequired, isUserInteractionRequired, isUserAllowedToManuallyConnect,
+                isInitializedAutoJoinEnabled), isAutoJoinEnabled);
     }
 }
 
diff --git a/service/java/com/android/server/wifi/SavedNetworkNominator.java b/service/java/com/android/server/wifi/SavedNetworkNominator.java
index 7603bbf..fdfa891 100644
--- a/service/java/com/android/server/wifi/SavedNetworkNominator.java
+++ b/service/java/com/android/server/wifi/SavedNetworkNominator.java
@@ -101,11 +101,6 @@
                 continue;
             }
 
-            // Ignore networks that the user has disallowed auto-join for.
-            if (!network.allowAutojoin) {
-                continue;
-            }
-
             /**
              * Ignore Passpoint and Ephemeral networks. They are configured networks,
              * but without being persisted to the storage. They are nominated by
@@ -116,6 +111,11 @@
                 continue;
             }
 
+            // Ignore networks that the user has disallowed auto-join for.
+            if (!network.allowAutojoin) {
+                continue;
+            }
+
             WifiConfiguration.NetworkSelectionStatus status =
                     network.getNetworkSelectionStatus();
             // TODO (b/112196799): another side effect
diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java
index dd3997a..1a10d93 100644
--- a/service/java/com/android/server/wifi/WifiConfigManager.java
+++ b/service/java/com/android/server/wifi/WifiConfigManager.java
@@ -1949,9 +1949,12 @@
                     + " has no matching config");
             return false;
         }
+
         config.allowAutojoin = choice;
         sendConfiguredNetworkChangedBroadcast(config, WifiManager.CHANGE_REASON_CONFIG_CHANGE);
-        saveToStore(true);
+        if (!config.ephemeral) {
+            saveToStore(true);
+        }
         return true;
     }
 
diff --git a/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java b/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java
index 5199759..7ac92c2 100644
--- a/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java
+++ b/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java
@@ -208,11 +208,14 @@
         public final WifiNetworkSuggestion wns;
         // Store the pointer to the corresponding app's meta data.
         public final PerAppInfo perAppInfo;
+        public boolean isAutoJoinEnabled;
 
         public ExtendedWifiNetworkSuggestion(@NonNull WifiNetworkSuggestion wns,
-                                             @NonNull PerAppInfo perAppInfo) {
+                                             @NonNull PerAppInfo perAppInfo,
+                                             boolean isAutoJoinEnabled) {
             this.wns = wns;
             this.perAppInfo = perAppInfo;
+            this.isAutoJoinEnabled = isAutoJoinEnabled;
         }
 
         @Override
@@ -236,16 +239,18 @@
 
         @Override
         public String toString() {
-            return wns.toString();
+            return new StringBuilder(wns.toString())
+                    .append(", isAutoJoinEnabled=").append(isAutoJoinEnabled)
+                    .toString();
         }
 
         /**
          * Convert from {@link WifiNetworkSuggestion} to a new instance of
          * {@link ExtendedWifiNetworkSuggestion}.
          */
-        public static ExtendedWifiNetworkSuggestion fromWns(
-                @NonNull WifiNetworkSuggestion wns, @NonNull PerAppInfo perAppInfo) {
-            return new ExtendedWifiNetworkSuggestion(wns, perAppInfo);
+        public static ExtendedWifiNetworkSuggestion fromWns(@NonNull WifiNetworkSuggestion wns,
+                @NonNull PerAppInfo perAppInfo, boolean isAutoJoinEnabled) {
+            return new ExtendedWifiNetworkSuggestion(wns, perAppInfo, isAutoJoinEnabled);
         }
     }
 
@@ -623,7 +628,8 @@
         return networkSuggestions
                 .stream()
                 .collect(Collectors.mapping(
-                        n -> ExtendedWifiNetworkSuggestion.fromWns(n, perAppInfo),
+                        n -> ExtendedWifiNetworkSuggestion.fromWns(n, perAppInfo,
+                                n.isInitialAutoJoinEnabled),
                         Collectors.toSet()));
     }
 
@@ -709,6 +715,7 @@
                 if (carrierId != TelephonyManager.UNKNOWN_CARRIER_ID) {
                     ewns.wns.passpointConfiguration.setCarrierId(carrierId);
                 }
+                ewns.wns.passpointConfiguration.setAutoJoinEnabled(ewns.isAutoJoinEnabled);
                 // Install Passpoint config, if failure, ignore that suggestion
                 if (!mWifiInjector.getPasspointManager().addOrUpdateProvider(
                         ewns.wns.passpointConfiguration, uid,
@@ -1584,6 +1591,33 @@
     }
 
     /**
+     * Set auto-join enable/disable for suggestion network
+     * @param config WifiConfiguration which is to change.
+     * @param choice true to enable auto-join, false to disable.
+     * @return true on success, false otherwise (e.g. if no match suggestion exists).
+     */
+    public boolean allowNetworkSuggestionAutojoin(WifiConfiguration config, boolean choice) {
+        if (!config.fromWifiNetworkSuggestion) {
+            Log.e(TAG, "allowNetworkSuggestionAutojoin: on non-suggestion network: "
+                    + config);
+            return false;
+        }
+
+        Set<ExtendedWifiNetworkSuggestion> matchingExtendedWifiNetworkSuggestions =
+                getNetworkSuggestionsForWifiConfiguration(config, config.BSSID);
+        if (config.isPasspoint()) {
+            if (!mWifiInjector.getPasspointManager().enableAutojoin(config.FQDN, choice)) {
+                return false;
+            }
+        }
+        for (ExtendedWifiNetworkSuggestion ewns : matchingExtendedWifiNetworkSuggestions) {
+            ewns.isAutoJoinEnabled = choice;
+        }
+        saveToStore();
+        return true;
+    }
+
+    /**
      * Dump of {@link WifiNetworkSuggestionsManager}.
      */
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
@@ -1606,4 +1640,3 @@
                 + mActiveNetworkSuggestionsMatchingConnection);
     }
 }
-
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 4bd2927..3dc8b14 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -2417,8 +2417,35 @@
 
         int callingUid = Binder.getCallingUid();
         mLog.info("allowAutojoin=% uid=%").c(choice).c(callingUid).flush();
-        mWifiThreadRunner.post(
-                () -> mWifiConfigManager.allowAutojoin(netId, choice));
+        mWifiThreadRunner.post(() -> {
+            WifiConfiguration config = mWifiConfigManager.getConfiguredNetwork(netId);
+            if (config == null) {
+                return;
+            }
+            if (config.fromWifiNetworkSpecifier) {
+                Log.e(TAG, "Auto-join configuration is not permitted for NetworkSpecifier "
+                        + "connections: " + config);
+                return;
+            }
+            if (config.isPasspoint() && !config.isEphemeral()) {
+                Log.e(TAG,
+                        "Auto-join configuration for a non-ephemeral Passpoint network should be "
+                                + "configured using FQDN: "
+                                + config);
+                return;
+            }
+            // If the network is a suggestion, store the auto-join configure to the
+            // WifiNetWorkSuggestionsManager.
+            if (config.fromWifiNetworkSuggestion) {
+                if (!mWifiNetworkSuggestionsManager
+                        .allowNetworkSuggestionAutojoin(config, choice)) {
+                    return;
+                }
+            }
+            // even for Suggestion, modify the current ephemeral configuration so that
+            // existing configuration auto-connection is updated correctly
+            mWifiConfigManager.allowAutojoin(netId, choice);
+        });
     }
 
     /**
diff --git a/service/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java b/service/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java
index 0d2f239..b53fcb5 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java
@@ -17,14 +17,25 @@
 package com.android.server.wifi;
 
 import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID;
-import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus
-        .NETWORK_SELECTION_TEMPORARY_DISABLED;
+import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED;
 
 import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_PSK;
 import static com.android.server.wifi.WifiConfigurationTestUtil.generateWifiConfig;
 
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.argThat;
+import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
 
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiNetworkSuggestion;
@@ -96,11 +107,14 @@
         int[] priorities = {};
         int[] uids = {};
         String[] packageNames = {};
+        boolean[] autojoin = {};
+        boolean[] shareWithUser = {};
 
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
 
@@ -132,11 +146,14 @@
         int[] priorities = {-1};
         int[] uids = {TEST_UID};
         String[] packageNames = {TEST_PACKAGE};
+        boolean[] autojoin = {true};
+        boolean[] shareWithUser = {true};
 
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // setup config manager interactions.
@@ -173,11 +190,14 @@
         int[] priorities = {-1, -1};
         int[] uids = {TEST_UID, TEST_UID};
         String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE};
+        boolean[] autojoin = {true, true};
+        boolean[] shareWithUser = {true, true};
 
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // setup config manager interactions.
@@ -216,11 +236,14 @@
         int[] priorities = {5, 1};
         int[] uids = {TEST_UID, TEST_UID};
         String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE};
+        boolean[] autojoin = {true, true};
+        boolean[] shareWithUser = {true, true};
 
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // setup config manager interactions.
@@ -260,11 +283,14 @@
         int[] priorities = {-1, -1, -1};
         int[] uids = {TEST_UID, TEST_UID, TEST_UID_OTHER};
         String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE, TEST_PACKAGE_OTHER};
+        boolean[] autojoin = {true, true, true};
+        boolean[] shareWithUser = {true, true, true};
 
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // setup config manager interactions.
@@ -314,11 +340,14 @@
         int[] uids = {TEST_UID, TEST_UID, TEST_UID_OTHER, TEST_UID_OTHER};
         String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE, TEST_PACKAGE_OTHER,
                 TEST_PACKAGE_OTHER};
+        boolean[] autojoin = {true, true, true, true};
+        boolean[] shareWithUser = {true, true, true, true};
 
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // setup config manager interactions.
@@ -359,11 +388,14 @@
         int[] priorities = {-1};
         int[] uids = {TEST_UID};
         String[] packageNames = {TEST_PACKAGE};
+        boolean[] autojoin = {true};
+        boolean[] shareWithUser = {true};
 
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // Fail add to WifiConfigManager
@@ -409,11 +441,14 @@
         int[] priorities = {-1};
         int[] uids = {TEST_UID};
         String[] packageNames = {TEST_PACKAGE};
+        boolean[] autojoin = {true};
+        boolean[] shareWithUser = {true};
 
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // setup config manager interactions.
@@ -438,7 +473,8 @@
                 .wasEphemeralNetworkDeleted(anyString());
         verify(mWifiConfigManager)
                 .getConfiguredNetwork(suggestions[0].wns.wifiConfiguration.getKey());
-        verify(mWifiConfigManager).addOrUpdateNetwork(eq(suggestions[0].wns.wifiConfiguration),
+        verify(mWifiConfigManager).addOrUpdateNetwork(
+                argThat(new WifiConfigMatcher(suggestions[0].wns.wifiConfiguration)),
                 eq(suggestions[0].perAppInfo.uid), eq(suggestions[0].perAppInfo.packageName));
         verify(mWifiConfigManager).getConfiguredNetwork(
                 suggestions[0].wns.wifiConfiguration.networkId);
@@ -467,11 +503,14 @@
         int[] priorities = {-1};
         int[] uids = {TEST_UID};
         String[] packageNames = {TEST_PACKAGE};
+        boolean[] autojoin = {true};
+        boolean[] shareWithUser = {true};
 
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // setup config manager interactions.
@@ -514,11 +553,14 @@
         int[] priorities = {-1};
         int[] uids = {TEST_UID};
         String[] packageNames = {TEST_PACKAGE};
+        boolean[] autojoin = {true};
+        boolean[] shareWithUser = {true};
 
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // setup config manager interactions.
@@ -545,7 +587,8 @@
                 .wasEphemeralNetworkDeleted(anyString());
         verify(mWifiConfigManager).getConfiguredNetwork(eq(
                 suggestions[0].wns.wifiConfiguration.getKey()));
-        verify(mWifiConfigManager).addOrUpdateNetwork(eq(suggestions[0].wns.wifiConfiguration),
+        verify(mWifiConfigManager).addOrUpdateNetwork(
+                argThat(new WifiConfigMatcher(suggestions[0].wns.wifiConfiguration)),
                 eq(suggestions[0].perAppInfo.uid), eq(suggestions[0].perAppInfo.packageName));
         verify(mWifiConfigManager).getConfiguredNetwork(
                 suggestions[0].wns.wifiConfiguration.networkId);
@@ -577,11 +620,14 @@
         int[] priorities = {-1};
         int[] uids = {TEST_UID};
         String[] packageNames = {TEST_PACKAGE};
+        boolean[] autojoin = {true};
+        boolean[] shareWithUser = {true};
 
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
         // Link the scan result with suggestions.
         linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
         // setup config manager interactions.
@@ -610,7 +656,8 @@
                 .wasEphemeralNetworkDeleted(anyString());
         verify(mWifiConfigManager).getConfiguredNetwork(eq(
                 suggestions[0].wns.wifiConfiguration.getKey()));
-        verify(mWifiConfigManager).addOrUpdateNetwork(eq(suggestions[0].wns.wifiConfiguration),
+        verify(mWifiConfigManager).addOrUpdateNetwork(
+                argThat(new WifiConfigMatcher(suggestions[0].wns.wifiConfiguration)),
                 eq(suggestions[0].perAppInfo.uid), eq(suggestions[0].perAppInfo.packageName));
         verify(mWifiConfigManager).getConfiguredNetwork(
                 suggestions[0].wns.wifiConfiguration.networkId);
@@ -639,10 +686,14 @@
         int[] priorities = {-1};
         int[] uids = {TEST_UID};
         String[] packageNames = {TEST_PACKAGE};
+        boolean[] autojoin = {true};
+        boolean[] shareWithUser = {true};
+
         ScanDetail[] scanDetails =
                 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
         ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
-                securities, appInteractions, meteredness, priorities, uids, packageNames);
+                securities, appInteractions, meteredness, priorities, uids, packageNames,
+                autojoin, shareWithUser);
         HashSet<ExtendedWifiNetworkSuggestion> matchedExtSuggestions = new HashSet<>();
         matchedExtSuggestions.add(suggestions[0]);
         List<Pair<ScanDetail, WifiConfiguration>> passpointCandidates = new ArrayList<>();
@@ -663,6 +714,55 @@
         validateConnectableNetworks(connectableNetworks, new String[] {scanSsids[0]});
     }
 
+    /**
+     * Ensure that we will not nominate the matching network suggestions which auto-join is
+     * disabled.
+     * Expected connectable Networks: {}
+     */
+    @Test
+    public void testSelectNetworkSuggestionForOneMatchButAutojoinDisabled() {
+        String[] scanSsids = {"test1", "test2"};
+        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+        int[] freqs = {2470, 2437};
+        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+        int[] levels = {-67, -76};
+        String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\""};
+        int[] securities = {SECURITY_PSK, SECURITY_PSK};
+        boolean[] appInteractions = {true, true};
+        boolean[] meteredness = {true, true};
+        int[] priorities = {-1, -1};
+        int[] uids = {TEST_UID, TEST_UID};
+        String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE};
+        boolean[] autojoin = {false, false};
+        boolean[] shareWithUser = {true, false};
+
+        ScanDetail[] scanDetails =
+                buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock);
+        ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids,
+                securities, appInteractions, meteredness, priorities, uids,
+                packageNames, autojoin, shareWithUser);
+        // Link the scan result with suggestions.
+        linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions);
+        // setup config manager interactions.
+        setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration,
+                suggestions[1].wns.wifiConfiguration);
+
+        List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>();
+        mNetworkSuggestionNominator.nominateNetworks(
+                Arrays.asList(scanDetails), null, null, true, false,
+                (ScanDetail scanDetail, WifiConfiguration configuration) -> {
+                    connectableNetworks.add(Pair.create(scanDetail, configuration));
+                });
+
+        // Verify no network is nominated.
+        assertTrue(connectableNetworks.isEmpty());
+        // Verify we only add network apps shared with user to WifiConfigManager
+        verifyAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration);
+        verify(mWifiConfigManager, never())
+                .addOrUpdateNetwork(argThat(new WifiConfigMatcher(
+                        suggestions[1].wns.wifiConfiguration)), anyInt(), anyString());
+    }
+
     private void setupAddToWifiConfigManager(WifiConfiguration...candidates) {
         for (int i = 0; i < candidates.length; i++) {
             WifiConfiguration candidate = candidates[i];
@@ -753,7 +853,8 @@
 
     private ExtendedWifiNetworkSuggestion[] buildNetworkSuggestions(
             String[] ssids, int[] securities, boolean[] appInteractions, boolean[] meteredness,
-            int[] priorities, int[] uids, String[] packageNames) {
+            int[] priorities, int[] uids, String[] packageNames, boolean[] autojoin,
+            boolean[] shareWithUser) {
         WifiConfiguration[] configs = buildWifiConfigurations(ssids, securities);
         ExtendedWifiNetworkSuggestion[] suggestions =
                 new ExtendedWifiNetworkSuggestion[configs.length];
@@ -764,8 +865,9 @@
                     : WifiConfiguration.METERED_OVERRIDE_NONE;
             PerAppInfo perAppInfo = new PerAppInfo(uids[i], packageNames[i], null);
             WifiNetworkSuggestion suggestion =
-                    new WifiNetworkSuggestion(configs[i], null, appInteractions[i], false, true);
-            suggestions[i] = new ExtendedWifiNetworkSuggestion(suggestion, perAppInfo);
+                    new WifiNetworkSuggestion(configs[i], null, appInteractions[i], false,
+                            shareWithUser[i], true);
+            suggestions[i] = new ExtendedWifiNetworkSuggestion(suggestion, perAppInfo, autojoin[i]);
         }
         return suggestions;
     }
diff --git a/service/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionStoreDataTest.java b/service/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionStoreDataTest.java
index ae40804..6f77b16 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionStoreDataTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionStoreDataTest.java
@@ -284,10 +284,10 @@
         configuration.enterpriseConfig =
                 WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
         WifiNetworkSuggestion networkSuggestion =
-                new WifiNetworkSuggestion(configuration, null, false, false, true);
+                new WifiNetworkSuggestion(configuration, null, false, false, true, true);
         appInfo.hasUserApproved = false;
         appInfo.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion, appInfo));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion, appInfo, true));
         networkSuggestionsMap.put(TEST_PACKAGE_NAME_1, appInfo);
 
         Map<String, PerAppInfo> deserializedPerAppInfoMap =
@@ -313,18 +313,18 @@
 
         PerAppInfo appInfo1 = new PerAppInfo(TEST_UID_1, TEST_PACKAGE_NAME_1, TEST_FEATURE_ID);
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         appInfo1.hasUserApproved = false;
         appInfo1.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo1));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo1, true));
         networkSuggestionsMap.put(TEST_PACKAGE_NAME_1, appInfo1);
 
         PerAppInfo appInfo2 = new PerAppInfo(TEST_UID_2, TEST_PACKAGE_NAME_2, TEST_FEATURE_ID);
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         appInfo2.hasUserApproved = true;
         appInfo2.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion2, appInfo2));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion2, appInfo2, true));
         networkSuggestionsMap.put(TEST_PACKAGE_NAME_2, appInfo2);
 
         assertSerializeDeserialize(networkSuggestionsMap);
@@ -339,26 +339,26 @@
 
         PerAppInfo appInfo1 = new PerAppInfo(TEST_UID_1, TEST_PACKAGE_NAME_1, TEST_FEATURE_ID);
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, true, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, true, true, true);
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         appInfo1.hasUserApproved = true;
         appInfo1.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo1));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo1, true));
         appInfo1.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion2, appInfo1));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion2, appInfo1, true));
         networkSuggestionsMap.put(TEST_PACKAGE_NAME_1, appInfo1);
 
         PerAppInfo appInfo2 = new PerAppInfo(TEST_UID_2, TEST_PACKAGE_NAME_2, TEST_FEATURE_ID);
         WifiNetworkSuggestion networkSuggestion3 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         WifiNetworkSuggestion networkSuggestion4 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, true, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, true, true, true);
         appInfo2.hasUserApproved = true;
         appInfo2.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion3, appInfo2));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion3, appInfo2, true));
         appInfo2.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion4, appInfo2));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion4, appInfo2, true));
         networkSuggestionsMap.put(TEST_PACKAGE_NAME_2, appInfo2);
 
         assertSerializeDeserialize(networkSuggestionsMap);
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WakeupControllerTest.java b/service/tests/wifitests/src/com/android/server/wifi/WakeupControllerTest.java
index 8b66430..e6d4e34 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WakeupControllerTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WakeupControllerTest.java
@@ -368,10 +368,10 @@
         // suggestions
         WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork(quotedSsid);
         WifiNetworkSuggestion openNetworkSuggestion =
-                new WifiNetworkSuggestion(openNetwork, null, false, false, true);
+                new WifiNetworkSuggestion(openNetwork, null, false, false, true, true);
         WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
         WifiNetworkSuggestion wepNetworkSuggestion =
-                new WifiNetworkSuggestion(wepNetwork, null, false, false, true);
+                new WifiNetworkSuggestion(wepNetwork, null, false, false, true, true);
         when(mWifiNetworkSuggestionsManager.getAllNetworkSuggestions())
                 .thenReturn(new HashSet<>(Arrays.asList(
                         openNetworkSuggestion, wepNetworkSuggestion)));
@@ -413,7 +413,7 @@
 
         WifiConfiguration oweNetwork = WifiConfigurationTestUtil.createOweNetwork(quotedSsid2);
         WifiNetworkSuggestion oweNetworkSuggestion =
-                new WifiNetworkSuggestion(oweNetwork, null, false, false, true);
+                new WifiNetworkSuggestion(oweNetwork, null, false, false, true, true);
         when(mWifiNetworkSuggestionsManager.getAllNetworkSuggestions())
                 .thenReturn(new HashSet<>(Arrays.asList(oweNetworkSuggestion)));
 
@@ -511,7 +511,7 @@
         WifiConfiguration openNetwork = WifiConfigurationTestUtil
                 .createOpenNetwork(ScanResultUtil.createQuotedSSID(SAVED_SSID));
         WifiNetworkSuggestion openNetworkSuggestion =
-                new WifiNetworkSuggestion(openNetwork, null, false, false, true);
+                new WifiNetworkSuggestion(openNetwork, null, false, false, true, true);
         when(mWifiNetworkSuggestionsManager.getAllNetworkSuggestions())
                 .thenReturn(new HashSet<>(Collections.singletonList(openNetworkSuggestion)));
 
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 9e85cae..e38efdf 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java
@@ -140,6 +140,7 @@
     @Mock private DeviceConfigFacade mDeviceConfigFacade;
     @Mock private MacAddressUtil mMacAddressUtil;
     @Mock private BssidBlocklistMonitor mBssidBlocklistMonitor;
+    @Mock private WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager;
 
     private MockResources mResources;
     private InOrder mContextConfigStoreMockOrder;
@@ -217,6 +218,8 @@
         when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(true);
         when(mWifiPermissionsUtil.isDeviceOwner(anyInt(), any())).thenReturn(false);
         when(mWifiPermissionsUtil.isProfileOwner(anyInt(), any())).thenReturn(false);
+        when(mWifiInjector.getWifiNetworkSuggestionsManager())
+                .thenReturn(mWifiNetworkSuggestionsManager);
         when(mWifiInjector.getBssidBlocklistMonitor()).thenReturn(mBssidBlocklistMonitor);
         when(mWifiInjector.getWifiLastResortWatchdog()).thenReturn(mWifiLastResortWatchdog);
         when(mWifiInjector.getWifiLastResortWatchdog().shouldIgnoreSsidUpdate())
@@ -1308,7 +1311,7 @@
 
     /**
      * Verifies the allowance/disallowance of autojoin to a network using
-     * {@link WifiConfigManager.allowAutojoin(int, boolean)}
+     * {@link WifiConfigManager#allowAutojoin(int, boolean)}
      */
     @Test
     public void testAllowDisallowAutojoin() throws Exception {
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java
index 83e7c68..1cd3b1d 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java
@@ -213,9 +213,9 @@
         WifiConfiguration dummyConfiguration = new WifiConfiguration();
         dummyConfiguration.FQDN = TEST_FQDN;
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                dummyConfiguration, passpointConfiguration, false, false, true);
+                dummyConfiguration, passpointConfiguration, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -265,9 +265,9 @@
         WifiConfiguration dummyConfiguration = new WifiConfiguration();
         dummyConfiguration.FQDN = TEST_FQDN;
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                dummyConfiguration, passpointConfiguration, false, false, true);
+                dummyConfiguration, passpointConfiguration, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -317,9 +317,9 @@
         WifiConfiguration dummyConfiguration = new WifiConfiguration();
         dummyConfiguration.FQDN = TEST_FQDN;
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                dummyConfiguration, passpointConfiguration, false, false, true);
+                dummyConfiguration, passpointConfiguration, false, false, true, true);
 
 
         List<WifiNetworkSuggestion> networkSuggestionList1 =
@@ -358,7 +358,7 @@
     @Test
     public void testReplaceNetworkSuggestionsSuccess() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -390,7 +390,7 @@
     @Test
     public void testAddNetworkSuggestionsSuccessOnInPlaceModification() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                 add(networkSuggestion);
@@ -422,7 +422,7 @@
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         for (int i = 0; i < WifiManager.NETWORK_SUGGESTIONS_MAX_PER_APP_HIGH_RAM; i++) {
             networkSuggestionList.add(new WifiNetworkSuggestion(
-                    WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true));
+                    WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true));
         }
         // The first add should succeed.
         assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
@@ -434,7 +434,7 @@
         networkSuggestionList = new ArrayList<>();
         for (int i = 0; i < 3; i++) {
             networkSuggestionList.add(new WifiNetworkSuggestion(
-                    WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true));
+                    WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true));
         }
         // The second add should fail.
         assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_EXCEEDS_MAX_PER_APP,
@@ -455,7 +455,7 @@
         networkSuggestionList = new ArrayList<>();
         for (int i = 0; i < 2; i++) {
             networkSuggestionList.add(new WifiNetworkSuggestion(
-                    WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true));
+                    WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true));
         }
         // This add should now succeed.
         assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
@@ -469,9 +469,9 @@
     @Test
     public void testRemoveNetworkSuggestionsFailureOnInvalid() {
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -497,7 +497,7 @@
     public void
             testGetNetworkSuggestionsForScanDetailSuccessWithOneMatchForCarrierProvisioningApp() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -530,7 +530,7 @@
                 WifiEnterpriseConfig.Eap.SIM, WifiEnterpriseConfig.Phase2.NONE);
         config.carrierId = VALID_CARRIER_ID;
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                config, null, false, false, true);
+                config, null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -560,7 +560,7 @@
     @Test
     public void testGetNetworkSuggestionsForScanDetailSuccessWithOneMatch() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -588,10 +588,10 @@
     public void testGetNetworkSuggestionsForScanDetailSuccessWithMultipleMatch() {
         WifiConfiguration wifiConfiguration = WifiConfigurationTestUtil.createOpenNetwork();
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, false, false, true);
+                wifiConfiguration, null, false, false, true, true);
         // Reuse the same network credentials to ensure they both match.
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, false, false, true);
+                wifiConfiguration, null, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -633,7 +633,7 @@
         wifiConfiguration.BSSID = scanDetail.getBSSIDString();
 
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                wifiConfiguration, null, false, false, true);
+                wifiConfiguration, null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -662,10 +662,10 @@
         wifiConfiguration.BSSID = scanDetail.getBSSIDString();
 
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, false, false, true);
+                wifiConfiguration, null, false, false, true, true);
         // Reuse the same network credentials to ensure they both match.
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, false, false, true);
+                wifiConfiguration, null, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -706,10 +706,10 @@
         wifiConfiguration.BSSID = scanDetail.getBSSIDString();
 
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, false, false, true);
+                wifiConfiguration, null, false, false, true, true);
         // Reuse the same network credentials to ensure they both match.
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, false, false, true);
+                wifiConfiguration, null, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -744,10 +744,10 @@
         wifiConfiguration2.BSSID = scanDetail.getBSSIDString();
 
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                wifiConfiguration1, null, false, false, true);
+                wifiConfiguration1, null, false, false, true, true);
         // Reuse the same network credentials to ensure they both match.
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                wifiConfiguration2, null, false, false, true);
+                wifiConfiguration2, null, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -795,7 +795,7 @@
     @Test
     public void testGetNetworkSuggestionsForScanDetailFailureOnAppNotApproved() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -817,7 +817,7 @@
     public void testGetNetworkSuggestionsForScanDetailFailureOnSuggestionRemoval() {
         WifiConfiguration wifiConfiguration = WifiConfigurationTestUtil.createOpenNetwork();
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                wifiConfiguration, null, false, false, true);
+                wifiConfiguration, null, false, false, true, true);
         ScanDetail scanDetail = createScanDetailForNetwork(wifiConfiguration);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -845,7 +845,7 @@
     @Test
     public void testGetNetworkSuggestionsForScanDetailFailureOnWrongNetwork() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -876,7 +876,7 @@
                 .registerSuggestionConnectionStatusListener(mBinder, mListener,
                         NETWORK_CALLBACK_ID, TEST_PACKAGE_1));
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -917,7 +917,7 @@
                         NETWORK_CALLBACK_ID, TEST_PACKAGE_1));
         verify(mBinder).linkToDeath(drCaptor.capture(), anyInt());
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -966,7 +966,7 @@
                 .registerSuggestionConnectionStatusListener(mBinder, mListener,
                         NETWORK_CALLBACK_ID, TEST_PACKAGE_1));
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -1009,13 +1009,13 @@
     public void testOnNetworkConnectionSuccessWithMultipleMatch() {
         WifiConfiguration wifiConfiguration = WifiConfigurationTestUtil.createOpenNetwork();
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, true, false, true);
+                wifiConfiguration, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion1);
                 }};
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, true, false, true);
+                wifiConfiguration, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList2 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion2);
@@ -1070,13 +1070,13 @@
         WifiConfiguration wifiConfiguration = WifiConfigurationTestUtil.createOpenNetwork();
         wifiConfiguration.BSSID = TEST_BSSID;
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, true, false, true);
+                wifiConfiguration, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion1);
                 }};
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, true, false, true);
+                wifiConfiguration, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList2 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion2);
@@ -1131,13 +1131,13 @@
         WifiConfiguration wifiConfiguration2 = new WifiConfiguration(wifiConfiguration1);
         wifiConfiguration2.BSSID = TEST_BSSID;
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                wifiConfiguration1, null, true, false, true);
+                wifiConfiguration1, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion1);
                 }};
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                wifiConfiguration2, null, true, false, true);
+                wifiConfiguration2, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList2 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion2);
@@ -1192,7 +1192,7 @@
     @Test
     public void testOnNetworkConnectionWhenAppNotApproved() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -1232,7 +1232,7 @@
     @Test
     public void testOnNetworkConnectionWhenIsAppInteractionRequiredNotSet() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -1272,7 +1272,7 @@
     @Test
     public void testOnNetworkConnectionWhenAppDoesNotHoldLocationPermission() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -1311,7 +1311,7 @@
     @Test
     public void testAddNetworkSuggestionsConfigStoreWrite() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -1352,7 +1352,7 @@
     @Test
     public void testRemoveNetworkSuggestionsConfigStoreWrite() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -1395,13 +1395,13 @@
         PerAppInfo appInfo = new PerAppInfo(TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE);
         appInfo.hasUserApproved = true;
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                dummyConfiguration, passpointConfiguration, false, false, true);
+                dummyConfiguration, passpointConfiguration, false, false, true, true);
         appInfo.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion, appInfo));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion, appInfo, true));
         appInfo.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo, true));
         mDataSource.fromDeserialized(new HashMap<String, PerAppInfo>() {{
                         put(TEST_PACKAGE_1, appInfo);
                 }});
@@ -1433,7 +1433,7 @@
                         .getNetworkSuggestionsForWifiConfiguration(connectNetwork, null);
         Set<ExtendedWifiNetworkSuggestion> expectedMatchingExtNetworkSuggestions =
                 new HashSet<ExtendedWifiNetworkSuggestion>() {{
-                    add(ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo));
+                    add(ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo, true));
                 }};
         assertEquals(expectedMatchingExtNetworkSuggestions, matchingExtNetworkSuggestions);
     }
@@ -1447,9 +1447,9 @@
         PerAppInfo appInfo1 = new PerAppInfo(TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE);
         appInfo1.hasUserApproved = true;
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         appInfo1.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo1));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion1, appInfo1, true));
         mDataSource.fromDeserialized(new HashMap<String, PerAppInfo>() {{
                     put(TEST_PACKAGE_1, appInfo1);
                 }});
@@ -1460,9 +1460,9 @@
         PerAppInfo appInfo2 = new PerAppInfo(TEST_UID_2, TEST_PACKAGE_2, TEST_FEATURE);
         appInfo2.hasUserApproved = true;
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         appInfo2.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion2, appInfo2));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion2, appInfo2, true));
         mDataSource.fromDeserialized(new HashMap<String, PerAppInfo>() {{
                     put(TEST_PACKAGE_2, appInfo2);
                 }});
@@ -1498,7 +1498,7 @@
     public void
             testRemoveNetworkSuggestionsMatchingConnectionSuccessWithOneMatch() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -1533,7 +1533,7 @@
     public void
             testRemoveAllNetworkSuggestionsMatchingConnectionSuccessWithOneMatch() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -1570,13 +1570,13 @@
     public void testRemoveAppMatchingConnectionSuccessWithMultipleMatch() {
         WifiConfiguration wifiConfiguration = WifiConfigurationTestUtil.createOpenNetwork();
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, true, false, true);
+                wifiConfiguration, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion1);
                 }};
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                wifiConfiguration, null, true, false, true);
+                wifiConfiguration, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList2 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion2);
@@ -1618,7 +1618,7 @@
     @Test
     public void testRemoveAppNotMatchingConnectionSuccess() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -1645,7 +1645,7 @@
     @Test
     public void testRemoveNetworkSuggestionsNotMatchingConnectionSuccessAfterConnectionFailure() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -1681,9 +1681,9 @@
     @Test
     public void testAddRemoveNetworkSuggestionsStartStopAppOpsWatch() {
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -1728,7 +1728,7 @@
     @Test
     public void testAppOpsChangeAfterSuggestionsAdd() {
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion1);
@@ -1779,9 +1779,9 @@
     public void testAppOpsChangeAfterConfigStoreLoad() {
         PerAppInfo appInfo = new PerAppInfo(TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE);
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         appInfo.extNetworkSuggestions.add(
-                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion, appInfo));
+                ExtendedWifiNetworkSuggestion.fromWns(networkSuggestion, appInfo, true));
         mDataSource.fromDeserialized(new HashMap<String, PerAppInfo>() {{
                     put(TEST_PACKAGE_1, appInfo);
                 }});
@@ -1825,7 +1825,7 @@
     @Test
     public void testAppOpsChangeWrongUid() {
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion1);
@@ -1867,9 +1867,9 @@
     @Test
     public void testRemoveApp() {
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -1931,9 +1931,9 @@
     @Test
     public void testClear() {
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
 
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
@@ -1986,7 +1986,7 @@
     @Test
     public void testUserApprovalNotificationDismissalWhenGetScanResult() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -2026,7 +2026,7 @@
     @Test
     public void testUserApprovalNotificationClickOnAllowWhenGetScanResult() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -2071,7 +2071,7 @@
     @Test
     public void testUserApprovalNotificationClickOnDisallowWhenGetScanResult() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -2139,7 +2139,7 @@
     @Test
     public void testUserApprovalNotificationWhilePreviousNotificationActive() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -2177,13 +2177,13 @@
 
         // App add network suggestions then get stored suggestions.
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOweNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOweNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion3 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createSaeNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createSaeNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion4 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createPskNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createPskNetwork(), null, false, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion1);
         networkSuggestionList.add(networkSuggestion2);
@@ -2214,11 +2214,11 @@
     public void testGetHiddenNetworks() {
 
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         WifiNetworkSuggestion hiddenNetworkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createPskHiddenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createPskHiddenNetwork(), null, true, false, true, true);
         WifiNetworkSuggestion hiddenNetworkSuggestion2 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createPskHiddenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createPskHiddenNetwork(), null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList1 =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -2249,7 +2249,7 @@
     @Test
     public void testUserApprovalNotificationClickOnAllowDuringAddingSuggestions() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -2283,7 +2283,7 @@
     @Test
     public void testUserApprovalNotificationClickOnDisallowWhenAddSuggestions() {
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false,  true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false,  true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -2346,7 +2346,7 @@
         WifiConfiguration dummyConfiguration = new WifiConfiguration();
         dummyConfiguration.FQDN = TEST_FQDN;
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                dummyConfiguration, passpointConfiguration, true, false, true);
+                dummyConfiguration, passpointConfiguration, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList =
                 new ArrayList<WifiNetworkSuggestion>() {{
                     add(networkSuggestion);
@@ -2444,7 +2444,7 @@
         WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
         config.carrierId = VALID_CARRIER_ID;
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                config, null, true, false, true);
+                config, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
@@ -2462,7 +2462,7 @@
         WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
         config.carrierId = VALID_CARRIER_ID;
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                config, null, true, false, true);
+                config, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
@@ -2479,7 +2479,7 @@
     public void testAddSuggestionWithDefaultCarrierIdWithoutCarrierProvisionPermission() {
         WifiConfiguration config = WifiConfigurationTestUtil.createOpenNetwork();
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                config, null, true, false, true);
+                config, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
@@ -2505,7 +2505,7 @@
         WifiConfiguration dummyConfiguration = new WifiConfiguration();
         dummyConfiguration.FQDN = TEST_FQDN;
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(dummyConfiguration,
-                passpointConfiguration, true, false, true);
+                passpointConfiguration, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         when(mPasspointManager.addOrUpdateProvider(any(PasspointConfiguration.class),
@@ -2531,7 +2531,7 @@
         WifiConfiguration dummyConfiguration = new WifiConfiguration();
         dummyConfiguration.FQDN = TEST_FQDN;
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(dummyConfiguration,
-                passpointConfiguration, true, false, true);
+                passpointConfiguration, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         dummyConfiguration.creatorUid = TEST_UID_1;
@@ -2556,7 +2556,7 @@
         WifiConfiguration dummyConfiguration = new WifiConfiguration();
         dummyConfiguration.FQDN = TEST_FQDN;
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(dummyConfiguration,
-                passpointConfiguration, true, false, true);
+                passpointConfiguration, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         dummyConfiguration.creatorUid = TEST_UID_1;
@@ -2586,7 +2586,7 @@
         WifiConfiguration dummyConfiguration = new WifiConfiguration();
         dummyConfiguration.FQDN = TEST_FQDN;
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(dummyConfiguration,
-                passpointConfiguration, true, false, false);
+                passpointConfiguration, true, false, false, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         when(mPasspointManager.addOrUpdateProvider(any(PasspointConfiguration.class),
@@ -2612,11 +2612,11 @@
     @Test
     public void testGetWifiConfigForMatchedNetworkSuggestionsSharedWithUser() {
         WifiNetworkSuggestion networkSuggestion1 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
         WifiNetworkSuggestion networkSuggestion2 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createPskNetwork(), null, false, false, false);
+                WifiConfigurationTestUtil.createPskNetwork(), null, false, false, false, true);
         WifiNetworkSuggestion networkSuggestion3 = new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createPskNetwork(), null, false, false, true);
+                WifiConfigurationTestUtil.createPskNetwork(), null, false, false, true, true);
         List<ScanResult> scanResults = new ArrayList<>();
         scanResults.add(
                 createScanDetailForNetwork(networkSuggestion1.wifiConfiguration).getScanResult());
@@ -2682,7 +2682,7 @@
                 WifiConfigurationTestUtil.createEapNetwork(WifiEnterpriseConfig.Eap.SIM,
                         WifiEnterpriseConfig.Phase2.NONE);
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                config, null, true, false, true);
+                config, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
@@ -2705,7 +2705,7 @@
                 WifiConfigurationTestUtil.createEapNetwork(WifiEnterpriseConfig.Eap.SIM,
                         WifiEnterpriseConfig.Phase2.NONE);
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                config, null, true, false, true);
+                config, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
@@ -2728,7 +2728,7 @@
                 WifiConfigurationTestUtil.createEapNetwork(WifiEnterpriseConfig.Eap.SIM,
                         WifiEnterpriseConfig.Phase2.NONE);
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                config, null, true, false, true);
+                config, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
@@ -2751,7 +2751,7 @@
                 WifiConfigurationTestUtil.createEapNetwork(WifiEnterpriseConfig.Eap.SIM,
                         WifiEnterpriseConfig.Phase2.NONE);
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                config, null, true, false, true);
+                config, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
@@ -2787,7 +2787,7 @@
                 WifiConfigurationTestUtil.createEapNetwork(WifiEnterpriseConfig.Eap.SIM,
                         WifiEnterpriseConfig.Phase2.NONE);
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                config, null, true, false, true);
+                config, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
@@ -2819,7 +2819,7 @@
                 WifiConfigurationTestUtil.createEapNetwork(WifiEnterpriseConfig.Eap.SIM,
                         WifiEnterpriseConfig.Phase2.NONE);
         WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
-                config, null, true, false, true);
+                config, null, true, false, true, true);
         List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
         networkSuggestionList.add(networkSuggestion);
         when(mWifiPermissionsUtil.checkNetworkCarrierProvisioningPermission(TEST_UID_1))
@@ -2840,10 +2840,99 @@
         assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_APP_DISALLOWED, status);
         networkSuggestionList.clear();
         networkSuggestionList.add(new WifiNetworkSuggestion(
-                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true));
+                WifiConfigurationTestUtil.createOpenNetwork(), null, true, false, true, true));
         status = mWifiNetworkSuggestionsManager
                 .add(networkSuggestionList, TEST_UID_1, TEST_PACKAGE_1, TEST_FEATURE);
         assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS, status);
         verify(mNotificationManger).notify(anyInt(), any());
     }
+
+    /**
+     * Verify set AllowAutoJoin on suggestion network .
+     */
+    @Test
+    public void testSetAllowAutoJoinOnSuggestionNetwork()  {
+        WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
+                WifiConfigurationTestUtil.createOpenNetwork(), null, false, false, true, true);
+        List<WifiNetworkSuggestion> networkSuggestionList =
+                new ArrayList<WifiNetworkSuggestion>() {{
+                    add(networkSuggestion);
+                }};
+        // No matching will return false.
+        assertFalse(mWifiNetworkSuggestionsManager
+                .allowNetworkSuggestionAutojoin(networkSuggestion.wifiConfiguration, false));
+        verify(mWifiConfigManager, never()).saveToStore(true);
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
+                mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1,
+                        TEST_PACKAGE_1, TEST_FEATURE));
+        mWifiNetworkSuggestionsManager.setHasUserApprovedForApp(true, TEST_PACKAGE_1);
+        verify(mWifiConfigManager, times(2)).saveToStore(true);
+        reset(mWifiConfigManager);
+        WifiConfiguration configuration =
+                new WifiConfiguration(networkSuggestion.wifiConfiguration);
+        configuration.fromWifiNetworkSuggestion = true;
+        configuration.ephemeral = true;
+        configuration.creatorName = TEST_PACKAGE_1;
+        configuration.creatorUid = TEST_UID_1;
+
+        assertTrue(mWifiNetworkSuggestionsManager
+                .allowNetworkSuggestionAutojoin(configuration, false));
+        verify(mWifiConfigManager).saveToStore(true);
+        Set<ExtendedWifiNetworkSuggestion> matchedSuggestions = mWifiNetworkSuggestionsManager
+                .getNetworkSuggestionsForWifiConfiguration(configuration,
+                        TEST_BSSID);
+        for (ExtendedWifiNetworkSuggestion ewns : matchedSuggestions) {
+            assertFalse(ewns.isAutoJoinEnabled);
+        }
+    }
+
+    /**
+     * Verify set AllowAutoJoin on passpoint suggestion network.
+     */
+    @Test
+    public void testSetAllowAutoJoinOnPasspointSuggestionNetwork() {
+        PasspointConfiguration passpointConfiguration = new PasspointConfiguration();
+        HomeSp homeSp = new HomeSp();
+        homeSp.setFqdn(TEST_FQDN);
+        passpointConfiguration.setHomeSp(homeSp);
+        WifiConfiguration dummyConfiguration = new WifiConfiguration();
+        dummyConfiguration.FQDN = TEST_FQDN;
+        WifiNetworkSuggestion networkSuggestion = new WifiNetworkSuggestion(
+                dummyConfiguration, passpointConfiguration, false, false, true, true);
+        List<WifiNetworkSuggestion> networkSuggestionList =
+                new ArrayList<WifiNetworkSuggestion>() {{
+                    add(networkSuggestion);
+                }};
+        when(mPasspointManager.addOrUpdateProvider(any(), anyInt(), anyString(), anyBoolean()))
+                .thenReturn(true);
+        assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS,
+                mWifiNetworkSuggestionsManager.add(networkSuggestionList, TEST_UID_1,
+                        TEST_PACKAGE_1, TEST_FEATURE));
+        mWifiNetworkSuggestionsManager.setHasUserApprovedForApp(true, TEST_PACKAGE_1);
+        verify(mWifiConfigManager, times(2)).saveToStore(true);
+        reset(mWifiConfigManager);
+        // Create WifiConfiguration for Passpoint network.
+        WifiConfiguration config = WifiConfigurationTestUtil.createPasspointNetwork();
+        config.FQDN = TEST_FQDN;
+        config.fromWifiNetworkSuggestion = true;
+        config.ephemeral = true;
+        config.creatorName = TEST_PACKAGE_1;
+        config.creatorUid = TEST_UID_1;
+        // When update PasspointManager is failure, will return false.
+        when(mPasspointManager.enableAutojoin(anyString(), anyBoolean())).thenReturn(false);
+        assertFalse(mWifiNetworkSuggestionsManager
+                .allowNetworkSuggestionAutojoin(config, false));
+        verify(mWifiConfigManager, never()).saveToStore(true);
+
+        // When update PasspointManager is success, will return true and persist suggestion.
+        when(mPasspointManager.enableAutojoin(anyString(), anyBoolean())).thenReturn(true);
+        assertTrue(mWifiNetworkSuggestionsManager
+                .allowNetworkSuggestionAutojoin(config, false));
+        verify(mWifiConfigManager).saveToStore(true);
+        Set<ExtendedWifiNetworkSuggestion> matchedSuggestions = mWifiNetworkSuggestionsManager
+                .getNetworkSuggestionsForWifiConfiguration(config, TEST_BSSID);
+        for (ExtendedWifiNetworkSuggestion ewns : matchedSuggestions) {
+            assertFalse(ewns.isAutoJoinEnabled);
+        }
+    }
 }
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 ff77118..afebe69 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
@@ -4697,6 +4697,61 @@
         }
     }
 
+    @Test
+    public void testAllowAutojoinOnSuggestionNetwork() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.fromWifiNetworkSuggestion = true;
+        when(mWifiConfigManager.getConfiguredNetwork(anyInt())).thenReturn(config);
+        when(mWifiNetworkSuggestionsManager.allowNetworkSuggestionAutojoin(any(), anyBoolean()))
+                .thenReturn(true);
+        mWifiServiceImpl.allowAutojoin(0, true);
+        mLooper.dispatchAll();
+        verify(mWifiConfigManager).getConfiguredNetwork(0);
+        verify(mWifiNetworkSuggestionsManager).allowNetworkSuggestionAutojoin(any(), anyBoolean());
+        verify(mWifiConfigManager).allowAutojoin(anyInt(), anyBoolean());
+    }
+
+    @Test
+    public void testAllowAutojoinOnSavedNetwork() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.fromWifiNetworkSuggestion = false;
+        config.fromWifiNetworkSpecifier = false;
+        when(mWifiConfigManager.getConfiguredNetwork(0)).thenReturn(config);
+        mWifiServiceImpl.allowAutojoin(0, true);
+        mLooper.dispatchAll();
+        verify(mWifiConfigManager).getConfiguredNetwork(0);
+        verify(mWifiNetworkSuggestionsManager, never())
+                .allowNetworkSuggestionAutojoin(any(), anyBoolean());
+        verify(mWifiConfigManager).allowAutojoin(anyInt(), anyBoolean());
+    }
+
+    @Test
+    public void testAllowAutojoinOnWifiNetworkSpecifier() {
+        WifiConfiguration config = new WifiConfiguration();
+        config.fromWifiNetworkSpecifier = true;
+        when(mWifiConfigManager.getConfiguredNetwork(0)).thenReturn(config);
+        mWifiServiceImpl.allowAutojoin(0, true);
+        mLooper.dispatchAll();
+        verify(mWifiConfigManager).getConfiguredNetwork(0);
+        verify(mWifiNetworkSuggestionsManager, never())
+                .allowNetworkSuggestionAutojoin(config, true);
+        verify(mWifiConfigManager, never()).allowAutojoin(0, true);
+    }
+
+    @Test
+    public void testAllowAutojoinOnSavedPasspointNetwork() {
+        WifiConfiguration config = WifiConfigurationTestUtil.createPasspointNetwork();
+        when(mWifiConfigManager.getConfiguredNetwork(0)).thenReturn(config);
+        when(mWifiNetworkSuggestionsManager.allowNetworkSuggestionAutojoin(any(), anyBoolean()))
+                .thenReturn(true);
+        mWifiServiceImpl.allowAutojoin(0, true);
+        mLooper.dispatchAll();
+        verify(mWifiConfigManager).getConfiguredNetwork(0);
+        verify(mWifiNetworkSuggestionsManager, never())
+                .allowNetworkSuggestionAutojoin(config, true);
+        verify(mWifiConfigManager, never()).allowAutojoin(0, true);
+    }
+
     /**
      * Test handle boot completed sequence.
      */