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 {