Merge "Add edu for apps being stopped when PS is locked" into main
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e6d7f01..de34d8d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2366,6 +2366,8 @@
     <!-- Wifi Network Details -->
     <!-- Wifi details title-->
     <string name="wifi_details_title">Network details</string>
+    <!-- WEP network less secure warning title -->
+    <string name="wep_network_less_secure_warning_title">This network uses an older security protocol called WEP, which is less secure</string>
     <!-- Wifi details preference title to display router IP subnet mask -->
     <string name="wifi_details_subnet_mask">Subnet mask</string>
     <!-- Server name title-->
diff --git a/src/com/android/settings/SettingsInitialize.java b/src/com/android/settings/SettingsInitialize.java
index 297bad7..4887e26 100644
--- a/src/com/android/settings/SettingsInitialize.java
+++ b/src/com/android/settings/SettingsInitialize.java
@@ -32,14 +32,12 @@
 import android.content.pm.ShortcutInfo;
 import android.content.pm.ShortcutManager;
 import android.content.pm.UserInfo;
-import android.os.Flags;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
 
-import com.android.settings.Settings.CreateShortcutActivity;
 import com.android.settings.activityembedding.ActivityEmbeddingUtils;
 import com.android.settings.homepage.DeepLinkHomepageActivity;
 import com.android.settings.search.SearchStateReceiver;
@@ -49,7 +47,7 @@
 import java.util.List;
 
 /**
- * Listens to {@link Intent.ACTION_PRE_BOOT_COMPLETED} and {@link Intent.ACTION_USER_INITIALIZED}
+ * Listens to {@link Intent.ACTION_PRE_BOOT_COMPLETED} and {@link Intent.ACTION_USER_INITIALIZE}
  * performs setup steps for a managed profile (disables the launcher icon of the Settings app,
  * adds cross-profile intent filters for the appropriate Settings activities), disables the
  * webview setting for non-admin users, updates the intent flags for any existing shortcuts and
@@ -68,7 +66,6 @@
         final PackageManager pm = context.getPackageManager();
         managedProfileSetup(context, pm, broadcast, userInfo);
         cloneProfileSetup(context, pm, userInfo);
-        privateProfileSetup(context, pm, userInfo);
         webviewSettingSetup(context, pm, userInfo);
         ThreadUtils.postOnBackgroundThread(() -> refreshExistingShortcuts(context));
         enableTwoPaneDeepLinkActivityIfNecessary(pm, context);
@@ -106,7 +103,7 @@
             }
         }
 
-        disableComponentsToHideSettings(context, pm);
+        Utils.disableComponentsToHideSettings(context, pm);
     }
 
     private void cloneProfileSetup(Context context, PackageManager pm, UserInfo userInfo) {
@@ -114,31 +111,7 @@
             return;
         }
 
-        disableComponentsToHideSettings(context, pm);
-    }
-
-    private void privateProfileSetup(Context context, PackageManager pm, UserInfo userInfo) {
-        if (Flags.allowPrivateProfile()
-                && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
-            if (userInfo == null || !userInfo.isPrivateProfile()) {
-                return;
-            }
-
-            disableComponentsToHideSettings(context, pm);
-        }
-    }
-
-    private void disableComponentsToHideSettings(Context context, PackageManager pm) {
-        // Disable settings app launcher icon
-        disableComponent(pm, new ComponentName(context, Settings.class));
-
-        //Disable Shortcut picker
-        disableComponent(pm, new ComponentName(context, CreateShortcutActivity.class));
-    }
-
-    private void disableComponent(PackageManager pm, ComponentName componentName) {
-        pm.setComponentEnabledSetting(componentName,
-                PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
+        Utils.disableComponentsToHideSettings(context, pm);
     }
 
     // Disable WebView Setting if the current user is not an admin
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 145f3a4..7ed6ba0 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -1464,4 +1464,22 @@
             }
         };
     }
+
+    /**
+     * Disables the launcher icon and shortcut picker component for the Settings app corresponding
+     * to the context user.
+     */
+    public static void disableComponentsToHideSettings(@NonNull Context context,
+            @NonNull PackageManager pm) {
+        // Disable settings app launcher icon
+        disableComponent(pm, new ComponentName(context, Settings.class));
+
+        //Disable Shortcut picker
+        disableComponent(pm, new ComponentName(context, Settings.CreateShortcutActivity.class));
+    }
+
+    private static void disableComponent(PackageManager pm, ComponentName componentName) {
+        pm.setComponentEnabledSetting(componentName,
+                PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
+    }
 }
diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
index 9455b70..a16f4b5 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java
+++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
@@ -56,6 +56,8 @@
 
 import kotlin.Unit;
 
+import kotlinx.coroutines.Job;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -96,6 +98,8 @@
     private AtomicBoolean mShouldFilterOutSatellitePlmn = new AtomicBoolean();
 
     private NetworkScanRepository mNetworkScanRepository;
+    @Nullable
+    private Job mNetworkScanJob = null;
 
     private NetworkSelectRepository mNetworkSelectRepository;
 
@@ -213,13 +217,14 @@
 
     private void launchNetworkScan() {
         setProgressBarVisible(true);
-        mNetworkScanRepository.launchNetworkScan(getViewLifecycleOwner(), (networkScanResult) -> {
-            if (isPreferenceScreenEnabled()) {
-                scanResultHandler(networkScanResult);
-            }
+        mNetworkScanJob = mNetworkScanRepository.launchNetworkScan(getViewLifecycleOwner(),
+                (networkScanResult) -> {
+                    if (isPreferenceScreenEnabled()) {
+                        scanResultHandler(networkScanResult);
+                    }
 
-            return Unit.INSTANCE;
-        });
+                    return Unit.INSTANCE;
+                });
     }
 
     /**
@@ -245,6 +250,12 @@
             return false;
         }
 
+        // Need stop network scan before manual select network.
+        if (mNetworkScanJob != null) {
+            mNetworkScanJob.cancel(null);
+            mNetworkScanJob = null;
+        }
+
         // Refresh the last selected item in case users reselect network.
         clearPreferenceSummary();
         if (mSelectedPreference != null) {
diff --git a/src/com/android/settings/network/telephony/scan/NetworkScanRepository.kt b/src/com/android/settings/network/telephony/scan/NetworkScanRepository.kt
index 4ae5842..0e15033 100644
--- a/src/com/android/settings/network/telephony/scan/NetworkScanRepository.kt
+++ b/src/com/android/settings/network/telephony/scan/NetworkScanRepository.kt
@@ -52,9 +52,8 @@
     private val telephonyManager = context.telephonyManager(subId)
 
     /** TODO: Move this to UI layer, when UI layer migrated to Kotlin. */
-    fun launchNetworkScan(lifecycleOwner: LifecycleOwner, onResult: (NetworkScanResult) -> Unit) {
+    fun launchNetworkScan(lifecycleOwner: LifecycleOwner, onResult: (NetworkScanResult) -> Unit) =
         networkScanFlow().collectLatestWithLifecycle(lifecycleOwner, action = onResult)
-    }
 
     data class CellInfoScanKey(
         val title: String?,
@@ -101,7 +100,10 @@
             callback,
         )
 
-        awaitClose { networkScan.stopScan() }
+        awaitClose {
+            networkScan.stopScan()
+            Log.d(TAG, "network scan stopped")
+        }
     }.conflate().onEach { Log.d(TAG, "networkScanFlow: $it") }.flowOn(Dispatchers.Default)
 
     /** Create network scan for allowed network types. */
diff --git a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
index bdbe993..6b7a347 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
@@ -31,6 +31,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.IntentSender;
+import android.content.pm.PackageManager;
 import android.content.pm.UserInfo;
 import android.os.Flags;
 import android.os.UserHandle;
@@ -44,6 +45,7 @@
 import androidx.annotation.VisibleForTesting;
 
 import com.android.internal.annotations.GuardedBy;
+import com.android.settings.Utils;
 
 import java.util.List;
 
@@ -129,6 +131,7 @@
             resetPrivateSpaceSettings();
             setUserSetupComplete();
             setSkipFirstUseHints();
+            disableComponentsToHidePrivateSpaceSettings();
         }
         return true;
     }
@@ -357,6 +360,24 @@
     }
 
     /**
+     * Disables the launcher icon and shortcut picker component for the Settings app instance
+     * inside the private space
+     */
+    @GuardedBy("this")
+    private void disableComponentsToHidePrivateSpaceSettings() {
+        if (mUserHandle == null) {
+            Log.e(TAG, "User handle null while hiding settings icon");
+            return;
+        }
+
+        Context privateSpaceUserContext = mContext.createContextAsUser(mUserHandle, /* flags */ 0);
+        PackageManager packageManager = privateSpaceUserContext.getPackageManager();
+
+        Log.d(TAG, "Hiding settings app launcher icon for " + mUserHandle);
+        Utils.disableComponentsToHideSettings(privateSpaceUserContext, packageManager);
+    }
+
+    /**
      * Sets the SKIP_FIRST_USE_HINTS for private profile so that the first launch of an app in
      * private space will not display introductory hints.
      */
diff --git a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
index 36edfa0..2463d4c 100644
--- a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
@@ -33,8 +33,10 @@
 
 import android.app.ActivityManager;
 import android.app.IActivityManager;
+import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.os.Flags;
 import android.os.RemoteException;
 import android.os.UserManager;
@@ -433,6 +435,36 @@
     }
 
     @Test
+    public void createPrivateSpace_psDoesNotExist_setsPrivateSpaceSettingsComponentDisabled() {
+        mSetFlagsRule.enableFlags(
+                android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+        assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile());
+        PrivateSpaceMaintainer privateSpaceMaintainer =
+                PrivateSpaceMaintainer.getInstance(mContext);
+        privateSpaceMaintainer.createPrivateSpace();
+        assertThat(privateSpaceMaintainer.getPrivateProfileHandle()).isNotNull();
+        Context privateSpaceUserContext = mContext.createContextAsUser(
+                privateSpaceMaintainer.getPrivateProfileHandle(),
+                /* flags */ 0);
+
+        // Assert that private space settings launcher app icon is disabled
+        ComponentName settingsComponentName = new ComponentName(privateSpaceUserContext,
+                com.android.settings.Settings.class);
+        int settingsComponentEnabledSetting = privateSpaceUserContext.getPackageManager()
+                .getComponentEnabledSetting(settingsComponentName);
+        assertThat(settingsComponentEnabledSetting)
+                .isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
+
+        // Assert that private space settings create shortcut activity is disabled
+        ComponentName shortcutPickerComponentName = new ComponentName(privateSpaceUserContext,
+                com.android.settings.Settings.CreateShortcutActivity.class);
+        int settingsShortcutPickerEnabledSetting = privateSpaceUserContext.getPackageManager()
+                .getComponentEnabledSetting(shortcutPickerComponentName);
+        assertThat(settingsShortcutPickerEnabledSetting)
+                .isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
+    }
+
+    @Test
     public void createPrivateSpace_pSExists_doesNotChangeSkipFirstUseHints() {
         mSetFlagsRule.enableFlags(
                 android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);