Merge "FlaggedApi: enable UnflaggedApi lint for public + system API" into main
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index c6cb604..80b7d40 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -4663,26 +4663,6 @@
     }
 
     /**
-     * Returns number of full users on the device.
-     * @hide
-     */
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.MANAGE_USERS,
-            android.Manifest.permission.CREATE_USERS
-    })
-    public int getFullUserCount() {
-        List<UserInfo> users = getUsers(/* excludePartial= */ true, /* excludeDying= */ true,
-                /* excludePreCreated= */ true);
-        int count = 0;
-        for (UserInfo user : users) {
-            if (user.isFull()) {
-                count++;
-            }
-        }
-        return count;
-    }
-
-    /**
      * @deprecated use {@link #getAliveUsers()} for {@code getUsers(true)}, or
      * {@link #getUsers()} for @code getUsers(false)}.
      *
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 1ee5aa3..8e9c079 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -931,8 +931,7 @@
      * @return a MediaPlayer object, or null if creation failed
      */
     public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder) {
-        int s = AudioSystem.newAudioSessionId();
-        return create(context, uri, holder, null, s > 0 ? s : 0);
+        return create(context, uri, holder, null, AudioSystem.AUDIO_SESSION_ALLOCATE);
     }
 
     /**
@@ -994,8 +993,7 @@
      * @return a MediaPlayer object, or null if creation failed
      */
     public static MediaPlayer create(Context context, int resid) {
-        int s = AudioSystem.newAudioSessionId();
-        return create(context, resid, null, s > 0 ? s : 0);
+        return create(context, resid, null, AudioSystem.AUDIO_SESSION_ALLOCATE);
     }
 
     /**
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaPlayerUnitTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaPlayerUnitTest.java
index f812d5f..f27a568 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaPlayerUnitTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaPlayerUnitTest.java
@@ -30,6 +30,7 @@
 
 import android.companion.virtual.VirtualDeviceManager;
 import android.content.Context;
+import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.media.MediaPlayer;
 import android.test.mock.MockContext;
@@ -37,6 +38,8 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.android.mediaframeworktest.R;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -45,6 +48,8 @@
 public class MediaPlayerUnitTest {
 
     private static final int TEST_VIRTUAL_DEVICE_ID = 42;
+    private static final AudioAttributes AUDIO_ATTRIBUTES_MEDIA =
+            new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build();
 
     @Test
     public void testConstructionWithContext_virtualDeviceDefaultAudioPolicy() {
@@ -89,6 +94,49 @@
         assertEquals(anotherSessionId, mediaPlayer.getAudioSessionId());
     }
 
+    @Test
+    public void testCreateFromResource_virtualDeviceDefaultAudioPolicy() {
+        int vdmPlaybackSessionId = getContext().getSystemService(
+                AudioManager.class).generateAudioSessionId();
+        VirtualDeviceManager mockVdm = getMockVirtualDeviceManager(TEST_VIRTUAL_DEVICE_ID,
+                vdmPlaybackSessionId, DEVICE_POLICY_DEFAULT);
+        Context virtualDeviceContext = getVirtualDeviceMockContext(TEST_VIRTUAL_DEVICE_ID, mockVdm);
+
+        MediaPlayer mediaPlayer = MediaPlayer.create(virtualDeviceContext, R.raw.testmp3);
+
+        assertNotEquals(vdmPlaybackSessionId, mediaPlayer.getAudioSessionId());
+        assertTrue(mediaPlayer.getAudioSessionId() > 0);
+    }
+
+    @Test
+    public void testCreateFromResource_virtualDeviceCustomAudioPolicy() {
+        int vdmPlaybackSessionId = getContext().getSystemService(
+                AudioManager.class).generateAudioSessionId();
+        VirtualDeviceManager mockVdm = getMockVirtualDeviceManager(TEST_VIRTUAL_DEVICE_ID,
+                vdmPlaybackSessionId, DEVICE_POLICY_CUSTOM);
+        Context virtualDeviceContext = getVirtualDeviceMockContext(TEST_VIRTUAL_DEVICE_ID, mockVdm);
+
+        MediaPlayer mediaPlayer = MediaPlayer.create(virtualDeviceContext, R.raw.testmp3);
+
+        assertEquals(vdmPlaybackSessionId, mediaPlayer.getAudioSessionId());
+    }
+
+    @Test
+    public void testCreateFromResource_explicitSessionIdOverridesContext() {
+        int vdmPlaybackSessionId = getContext().getSystemService(
+                AudioManager.class).generateAudioSessionId();
+        int anotherSessionId = getContext().getSystemService(
+                AudioManager.class).generateAudioSessionId();
+        VirtualDeviceManager mockVdm = getMockVirtualDeviceManager(TEST_VIRTUAL_DEVICE_ID,
+                vdmPlaybackSessionId, DEVICE_POLICY_CUSTOM);
+        Context virtualDeviceContext = getVirtualDeviceMockContext(TEST_VIRTUAL_DEVICE_ID, mockVdm);
+
+        MediaPlayer mediaPlayer = MediaPlayer.create(virtualDeviceContext, R.raw.testmp3,
+                AUDIO_ATTRIBUTES_MEDIA, anotherSessionId);
+
+        assertEquals(anotherSessionId, mediaPlayer.getAudioSessionId());
+    }
+
     private Context getContext() {
         return InstrumentationRegistry.getInstrumentation().getContext();
     }
@@ -98,6 +146,7 @@
         when(mockContext.getDeviceId()).thenReturn(deviceId);
         when(mockContext.getSystemService(VirtualDeviceManager.class)).thenReturn(vdm);
         when(mockContext.getAttributionSource()).thenReturn(getContext().getAttributionSource());
+        when(mockContext.getResources()).thenReturn(getContext().getResources());
         return mockContext;
     }
 
diff --git a/packages/SystemUI/TEST_MAPPING b/packages/SystemUI/TEST_MAPPING
index 969c148..cb9e9ee 100644
--- a/packages/SystemUI/TEST_MAPPING
+++ b/packages/SystemUI/TEST_MAPPING
@@ -1,47 +1,23 @@
 {
-  // Curious where your @Scenario tests will run?
+  // Curious where your @Scenario tests are running?
   //
   // @Ignore: Will not run in any configuration
   //
-  // @FlakyTest: Tests that don't block pre/postsubmit but are staged to run known failures
+  // @FlakyTest: Tests that don't block pre/postsubmit but are staged to run known failures.
+  //             Tests will run in postsubmit on sysui-e2e-staged suite.
   //
-  // @Postsubmit: Runs in platinum suite and blocks droidfood in postsubmit
   //
-  // @PlatinumTest: As of May, 2023, running in postsubmit. Set to run in presubmit as part of
-  // v2/android-platinum/suite-test-mapping-platinum-sysui
-  // Please DO NOT annotate new or old tests with @PlatinumTest annotation without discussing
-  // with mdb:android-platinum
+  // @PlatinumTest: Marking your test with this annotation will put your tests in presubmit.
+  //                Please DO NOT annotate new or old tests with @PlatinumTest annotation
+  //                without discussing with mdb:android-platinum
   //
-  // As of May, 2023, If you don't use @Postsubmit, your new test will immediately
-  // block presubmit, which is probably NOT what you want. This will change effectively once
-  // we move to @PlatinumTest annotation.
+  // @Postsubmit: Do not use this annotation for e2e tests. This won't have any affect.
 
-  // v2/sysui/test-mapping-presubmit-sysui_cloud-tf
-  "presubmit-sysui": [
-    {
-      "name": "PlatformScenarioTests",
-      "options": [
-        {
-            "include-filter": "android.platform.test.scenario.sysui"
-        },
-        {
-            "include-annotation": "android.platform.test.scenario.annotation.Scenario"
-        },
-        {
-            "exclude-annotation": "org.junit.Ignore"
-        },
-        {
-            "exclude-annotation": "android.platform.test.annotations.Postsubmit"
-        },
-        {
-            "exclude-annotation": "android.platform.test.annotations.FlakyTest"
-        },
-        {
-            "exclude-annotation": "androidx.test.filters.FlakyTest"
-        }
-      ]
-    }
-  ],
+  // For all other e2e tests which are not platinum, they run in sysui-silver suite,that
+  // primarily runs in postsubmit with an exception to e2e test related changes.
+  // If you want to see one shot place to monitor all e2e tests, look for
+  // sysui-e2e-staged suite.
+
   // v2/android-virtual-infra/test_mapping/presubmit-avd
   "presubmit": [
     {
@@ -138,31 +114,6 @@
       ]
     }
   ],
-  "silver-sysui": [
-   {
-      "name": "PlatformScenarioTests",
-      "options": [
-        {
-            "include-filter": "android.platform.test.scenario.sysui"
-        },
-        {
-            "include-annotation": "android.platform.test.scenario.annotation.Scenario"
-        },
-        {
-            "exclude-annotation": "org.junit.Ignore"
-        },
-        {
-            "exclude-annotation": "android.platform.test.annotations.PlatinumTest"
-        },
-        {
-            "exclude-annotation": "android.platform.test.annotations.FlakyTest"
-        },
-        {
-            "exclude-annotation": "androidx.test.filters.FlakyTest"
-        }
-      ]
-    }
-  ],
   "postsubmit": [
    {
       "name": "SystemUIGoogleScreenshotTests",
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
index d8c8080..e48901e 100644
--- a/packages/SystemUI/res/values/ids.xml
+++ b/packages/SystemUI/res/values/ids.xml
@@ -207,13 +207,14 @@
     <!-- keyboard backlight indicator-->
     <item type="id" name="backlight_icon" />
 
+    <!-- IDs for use in the keyguard/lockscreen scene -->
     <item type="id" name="keyguard_root_view" />
     <item type="id" name="keyguard_indication_area" />
     <item type="id" name="keyguard_indication_text" />
     <item type="id" name="keyguard_indication_text_bottom" />
     <item type="id" name="nssl_guideline" />
-    <item type="id" name="nssl_top_barrier" />
-    <item type="id" name="nssl_bottom_barrier" />
+    <item type="id" name="nssl_placeholder" />
+    <item type="id" name="aod_notification_icon_container" />
     <item type="id" name="split_shade_guideline" />
     <item type="id" name="lock_icon" />
     <item type="id" name="lock_icon_bg" />
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
index d897960..11f9589 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
@@ -18,7 +18,6 @@
 
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
-
 import static com.android.keyguard.KeyguardClockSwitch.LARGE;
 import static com.android.keyguard.KeyguardClockSwitch.SMALL;
 import static com.android.systemui.flags.Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED;
@@ -42,6 +41,7 @@
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.dump.DumpManager;
 import com.android.systemui.flags.FeatureFlags;
+import com.android.systemui.flags.Flags;
 import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
 import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
 import com.android.systemui.log.LogBuffer;
@@ -240,7 +240,9 @@
 
         View nic = mView.findViewById(
                 R.id.left_aligned_notification_icon_container);
-        nic.setVisibility(View.GONE);
+        if (nic != null) {
+            nic.setVisibility(View.GONE);
+        }
     }
 
     @Override
@@ -307,7 +309,11 @@
     }
 
     int getNotificationIconAreaHeight() {
-        return mNotificationIconAreaController.getHeight();
+        if (mFeatureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
+            return 0;
+        } else {
+            return mNotificationIconAreaController.getHeight();
+        }
     }
 
     @Override
@@ -518,10 +524,12 @@
     }
 
     private void updateAodIcons() {
-        NotificationIconContainer nic = (NotificationIconContainer)
-                mView.findViewById(
-                        com.android.systemui.R.id.left_aligned_notification_icon_container);
-        mNotificationIconAreaController.setupAodIcons(nic);
+        if (!mFeatureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
+            NotificationIconContainer nic = (NotificationIconContainer)
+                    mView.findViewById(
+                            com.android.systemui.R.id.left_aligned_notification_icon_container);
+            mNotificationIconAreaController.setupAodIcons(nic);
+        }
     }
 
     private void setClock(ClockController clock) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
index 8b0b0ae..9503f2c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
@@ -177,14 +177,13 @@
             oldRight: Int,
             oldBottom: Int
         ) {
-            val ksv = v.findViewById(R.id.keyguard_status_view) as View?
-            val lockIcon = v.findViewById(R.id.lock_icon_view) as View?
+            val nsslPlaceholder = v.findViewById(R.id.nssl_placeholder) as View?
 
-            if (ksv != null && lockIcon != null) {
+            if (nsslPlaceholder != null) {
                 // After layout, ensure the notifications are positioned correctly
                 viewModel.onSharedNotificationContainerPositionChanged(
-                    ksv!!.top.toFloat() + ksv!!.height,
-                    lockIcon!!.y
+                    nsslPlaceholder.top.toFloat(),
+                    nsslPlaceholder.bottom.toFloat(),
                 )
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
index b0c969f..15bb909 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
@@ -22,6 +22,7 @@
 import com.android.systemui.flags.FeatureFlags
 import com.android.systemui.flags.Flags
 import com.android.systemui.keyguard.shared.model.KeyguardBlueprint
+import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection
 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultAmbientIndicationAreaSection
 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection
 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultLockIconSection
@@ -50,6 +51,7 @@
     defaultStatusViewSection: DefaultStatusViewSection,
     defaultNotificationStackScrollLayoutSection: DefaultNotificationStackScrollLayoutSection,
     splitShadeGuidelines: SplitShadeGuidelines,
+    aodNotificationIconsSection: AodNotificationIconsSection,
     private val featureFlags: FeatureFlags,
 ) : KeyguardBlueprint {
     override val id: String = DEFAULT
@@ -64,6 +66,7 @@
             defaultStatusViewSection,
             defaultNotificationStackScrollLayoutSection,
             splitShadeGuidelines,
+            aodNotificationIconsSection,
         )
 
     override fun replaceViews(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/ShortcutsBesideUdfpsKeyguardBlueprint.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/ShortcutsBesideUdfpsKeyguardBlueprint.kt
index bb3af6c..79a97fb 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/ShortcutsBesideUdfpsKeyguardBlueprint.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/ShortcutsBesideUdfpsKeyguardBlueprint.kt
@@ -20,6 +20,7 @@
 import com.android.systemui.dagger.SysUISingleton
 import com.android.systemui.keyguard.shared.model.KeyguardBlueprint
 import com.android.systemui.keyguard.ui.view.layout.sections.AlignShortcutsToUdfpsSection
+import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection
 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultAmbientIndicationAreaSection
 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection
 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultLockIconSection
@@ -42,6 +43,7 @@
     defaultStatusViewSection: DefaultStatusViewSection,
     splitShadeGuidelines: SplitShadeGuidelines,
     defaultNotificationStackScrollLayoutSection: DefaultNotificationStackScrollLayoutSection,
+    aodNotificationIconsSection: AodNotificationIconsSection,
 ) : KeyguardBlueprint {
     override val id: String = SHORTCUTS_BESIDE_UDFPS
 
@@ -55,6 +57,7 @@
             defaultStatusViewSection,
             defaultNotificationStackScrollLayoutSection,
             splitShadeGuidelines,
+            aodNotificationIconsSection,
         )
 
     companion object {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt
new file mode 100644
index 0000000..ac11ba5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.systemui.keyguard.ui.view.layout.sections
+
+import android.content.Context
+import android.view.View
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.constraintlayout.widget.ConstraintSet
+import androidx.constraintlayout.widget.ConstraintSet.BOTTOM
+import androidx.constraintlayout.widget.ConstraintSet.END
+import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
+import androidx.constraintlayout.widget.ConstraintSet.START
+import androidx.constraintlayout.widget.ConstraintSet.TOP
+import com.android.systemui.R
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.shared.model.KeyguardSection
+import com.android.systemui.shade.NotificationPanelView
+import com.android.systemui.statusbar.phone.NotificationIconAreaController
+import com.android.systemui.statusbar.phone.NotificationIconContainer
+import javax.inject.Inject
+
+class AodNotificationIconsSection
+@Inject
+constructor(
+    private val context: Context,
+    private val featureFlags: FeatureFlags,
+    private val notificationPanelView: NotificationPanelView,
+    private val notificationIconAreaController: NotificationIconAreaController,
+) : KeyguardSection() {
+    private val nicId = R.id.aod_notification_icon_container
+    private lateinit var nic: NotificationIconContainer
+
+    override fun addViews(constraintLayout: ConstraintLayout) {
+        if (!featureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
+            return
+        }
+        nic =
+            NotificationIconContainer(context, null).apply {
+                id = nicId
+                setPaddingRelative(
+                    resources.getDimensionPixelSize(R.dimen.below_clock_padding_start_icons),
+                    0,
+                    0,
+                    0
+                )
+                setVisibility(View.INVISIBLE)
+            }
+
+        constraintLayout.addView(nic)
+    }
+
+    override fun bindData(constraintLayout: ConstraintLayout) {
+        if (!featureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
+            return
+        }
+
+        notificationIconAreaController.setupAodIcons(nic)
+    }
+
+    override fun applyConstraints(constraintSet: ConstraintSet) {
+        if (!featureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
+            return
+        }
+        val bottomMargin =
+            context.resources.getDimensionPixelSize(R.dimen.keyguard_status_view_bottom_margin)
+
+        val useSplitShade = context.resources.getBoolean(R.bool.config_use_split_notification_shade)
+
+        val topAlignment =
+            if (useSplitShade) {
+                TOP
+            } else {
+                BOTTOM
+            }
+
+        constraintSet.apply {
+            connect(nicId, TOP, R.id.keyguard_status_view, topAlignment, bottomMargin)
+            connect(nicId, START, PARENT_ID, START)
+            connect(nicId, END, PARENT_ID, END)
+            constrainHeight(
+                nicId,
+                context.resources.getDimensionPixelSize(R.dimen.notification_shelf_height)
+            )
+        }
+    }
+
+    override fun removeViews(constraintLayout: ConstraintLayout) {
+        constraintLayout.removeView(nicId)
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultLockIconSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultLockIconSection.kt
index 3e91d93..9c6e953 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultLockIconSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultLockIconSection.kt
@@ -54,15 +54,15 @@
         if (!featureFlags.isEnabled(Flags.MIGRATE_LOCK_ICON)) {
             return
         }
-        notificationPanelView.findViewById<View>(R.id.lock_icon_view).let {
+        notificationPanelView.findViewById<View>(lockIconViewId).let {
             notificationPanelView.removeView(it)
         }
-        val view = LockIconView(context, null).apply { id = R.id.lock_icon_view }
+        val view = LockIconView(context, null).apply { id = lockIconViewId }
         constraintLayout.addView(view)
     }
 
     override fun bindData(constraintLayout: ConstraintLayout) {
-        constraintLayout.findViewById<LockIconView?>(R.id.lock_icon_view)?.let {
+        constraintLayout.findViewById<LockIconView?>(lockIconViewId)?.let {
             lockIconViewController.setLockIconView(it)
         }
     }
@@ -97,7 +97,7 @@
     }
 
     override fun removeViews(constraintLayout: ConstraintLayout) {
-        constraintLayout.removeView(R.id.lock_icon_view)
+        constraintLayout.removeView(lockIconViewId)
     }
 
     @VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultNotificationStackScrollLayoutSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultNotificationStackScrollLayoutSection.kt
index 59c5d78..7fff43b 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultNotificationStackScrollLayoutSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultNotificationStackScrollLayoutSection.kt
@@ -17,10 +17,16 @@
 
 package com.android.systemui.keyguard.ui.view.layout.sections
 
+import android.content.Context
 import android.view.View
 import android.view.ViewGroup
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.constraintlayout.widget.ConstraintSet
+import androidx.constraintlayout.widget.ConstraintSet.BOTTOM
+import androidx.constraintlayout.widget.ConstraintSet.END
+import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
+import androidx.constraintlayout.widget.ConstraintSet.START
+import androidx.constraintlayout.widget.ConstraintSet.TOP
 import com.android.systemui.R
 import com.android.systemui.flags.FeatureFlags
 import com.android.systemui.flags.Flags
@@ -35,12 +41,15 @@
 class DefaultNotificationStackScrollLayoutSection
 @Inject
 constructor(
+    private val context: Context,
     private val featureFlags: FeatureFlags,
     private val notificationPanelView: NotificationPanelView,
     private val sharedNotificationContainer: SharedNotificationContainer,
     private val sharedNotificationContainerViewModel: SharedNotificationContainerViewModel,
     private val controller: NotificationStackScrollLayoutController,
 ) : KeyguardSection() {
+    private val placeHolderId = R.id.nssl_placeholder
+
     override fun addViews(constraintLayout: ConstraintLayout) {
         if (!featureFlags.isEnabled(Flags.MIGRATE_NSSL)) {
             return
@@ -51,19 +60,52 @@
             (it.parent as ViewGroup).removeView(it)
             sharedNotificationContainer.addNotificationStackScrollLayout(it)
         }
+
+        val view = View(context, null).apply { id = placeHolderId }
+        constraintLayout.addView(view)
     }
 
     override fun bindData(constraintLayout: ConstraintLayout) {
-        if (featureFlags.isEnabled(Flags.MIGRATE_NSSL)) {
-            SharedNotificationContainerBinder.bind(
-                sharedNotificationContainer,
-                sharedNotificationContainerViewModel,
-                controller,
+        if (!featureFlags.isEnabled(Flags.MIGRATE_NSSL)) {
+            return
+        }
+        SharedNotificationContainerBinder.bind(
+            sharedNotificationContainer,
+            sharedNotificationContainerViewModel,
+            controller,
+        )
+    }
+
+    override fun applyConstraints(constraintSet: ConstraintSet) {
+        if (!featureFlags.isEnabled(Flags.MIGRATE_NSSL)) {
+            return
+        }
+        constraintSet.apply {
+            val bottomMargin =
+                context.resources.getDimensionPixelSize(R.dimen.keyguard_status_view_bottom_margin)
+            val useSplitShade =
+                context.resources.getBoolean(R.bool.config_use_split_notification_shade)
+
+            val topAlignment =
+                if (useSplitShade) {
+                    TOP
+                } else {
+                    BOTTOM
+                }
+            connect(
+                R.id.nssl_placeholder,
+                TOP,
+                R.id.keyguard_status_view,
+                topAlignment,
+                bottomMargin
             )
+            connect(R.id.nssl_placeholder, START, PARENT_ID, START)
+            connect(R.id.nssl_placeholder, END, PARENT_ID, END)
+            connect(R.id.nssl_placeholder, BOTTOM, R.id.lock_icon_view, TOP)
         }
     }
 
-    override fun applyConstraints(constraintSet: ConstraintSet) {}
-
-    override fun removeViews(constraintLayout: ConstraintLayout) {}
+    override fun removeViews(constraintLayout: ConstraintLayout) {
+        constraintLayout.removeView(placeHolderId)
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt
index b144f7a..b1dd373 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt
@@ -72,6 +72,11 @@
                     .inflate(R.layout.keyguard_status_view, constraintLayout, false)
                     as KeyguardStatusView)
                 .apply { clipChildren = false }
+
+        // This is diassembled and moved to [AodNotificationIconsSection]
+        keyguardStatusView.findViewById<View>(R.id.left_aligned_notification_icon_container)?.let {
+            it.setVisibility(View.GONE)
+        }
         constraintLayout.addView(keyguardStatusView)
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java
index 1be8746..3d87196 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java
@@ -20,6 +20,7 @@
 
 import static com.android.systemui.flags.Flags.FACE_AUTH_REFACTOR;
 import static com.android.systemui.flags.Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED;
+import static com.android.systemui.flags.Flags.MIGRATE_KEYGUARD_STATUS_VIEW;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.atLeast;
@@ -165,6 +166,7 @@
         mFakeFeatureFlags = new FakeFeatureFlags();
         mFakeFeatureFlags.set(FACE_AUTH_REFACTOR, false);
         mFakeFeatureFlags.set(LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false);
+        mFakeFeatureFlags.set(MIGRATE_KEYGUARD_STATUS_VIEW, false);
         mController = new KeyguardClockSwitchController(
                 mView,
                 mStatusBarStateController,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
index 41ba1f4..681fce8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
@@ -28,6 +28,7 @@
 import com.android.systemui.keyguard.shared.model.KeyguardBlueprint
 import com.android.systemui.keyguard.shared.model.KeyguardSection
 import com.android.systemui.keyguard.ui.view.KeyguardRootView
+import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection
 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultAmbientIndicationAreaSection
 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection
 import com.android.systemui.keyguard.ui.view.layout.sections.DefaultLockIconSection
@@ -61,6 +62,8 @@
     @Mock private lateinit var defaultStatusViewSection: DefaultStatusViewSection
     @Mock private lateinit var defaultNSSLSection: DefaultNotificationStackScrollLayoutSection
     @Mock private lateinit var splitShadeGuidelines: SplitShadeGuidelines
+    @Mock private lateinit var aodNotificationIconsSection: AodNotificationIconsSection
+
     private val featureFlags = FakeFeatureFlags()
 
     @Before
@@ -77,6 +80,7 @@
                 defaultStatusViewSection,
                 defaultNSSLSection,
                 splitShadeGuidelines,
+                aodNotificationIconsSection,
                 featureFlags,
             )
         featureFlags.set(Flags.LAZY_INFLATE_KEYGUARD, false)
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
index b22798e..5dfce06 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
@@ -326,24 +326,6 @@
         assertThat(hasUser(user2.id)).isTrue();
     }
 
-
-    @MediumTest
-    @Test
-    public void testGetFullUserCount() throws Exception {
-        assertThat(mUserManager.getFullUserCount()).isEqualTo(1);
-        UserInfo user1 = createUser("User 1", UserInfo.FLAG_FULL);
-        UserInfo user2 = createUser("User 2", UserInfo.FLAG_ADMIN);
-
-        assertThat(user1).isNotNull();
-        assertThat(user2).isNotNull();
-
-        assertThat(mUserManager.getFullUserCount()).isEqualTo(3);
-        removeUser(user1.id);
-        assertThat(mUserManager.getFullUserCount()).isEqualTo(2);
-        removeUser(user2.id);
-        assertThat(mUserManager.getFullUserCount()).isEqualTo(1);
-    }
-
     /**
      * Tests that UserManager knows how many users can be created.
      *
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
index c25f0cb..0eec9cd 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -89,6 +89,7 @@
 import android.view.InputDevice;
 
 import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.FlakyTest;
 
 import com.android.internal.app.IBatteryStats;
 import com.android.internal.util.FrameworkStatsLog;
@@ -834,6 +835,7 @@
                         eq(AudioAttributes.USAGE_UNKNOWN), anyInt(), anyString());
     }
 
+    @FlakyTest
     @Test
     public void vibrate_withOngoingRepeatingVibration_ignoresEffect() throws Exception {
         mockVibrators(1);
@@ -920,6 +922,7 @@
         cancelVibrate(service);  // Clean up repeating effect.
     }
 
+    @FlakyTest
     @Test
     public void vibrate_withNewSameImportanceVibrationButOngoingIsRepeating_ignoreNewVibration()
             throws Exception {
@@ -973,6 +976,7 @@
         cancelVibrate(service);  // Clean up repeating effect.
     }
 
+    @FlakyTest
     @Test
     public void vibrate_withNewUnknownUsageVibrationAndNotRepeating_ignoreNewVibration()
             throws Exception {
@@ -1764,6 +1768,7 @@
         cancelVibrate(service);  // Clean up long effect.
     }
 
+    @FlakyTest
     @Test
     public void onExternalVibration_withNewSameImportanceButRepeating_cancelsOngoingVibration()
             throws Exception {