diff options
5 files changed, 43 insertions, 12 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index 9e0b16cfb312..feb9afb68ecb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -1767,7 +1767,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView */ public ExpandableNotificationRow(Context context, AttributeSet attrs) { this(context, attrs, context); - Log.e(TAG, "This constructor shouldn't be called"); + // NOTE(b/317503801): Always crash when using the insecure constructor. + throw new UnsupportedOperationException("Insecure constructor"); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowInflaterTask.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowInflaterTask.java index 5fbcebda7cd6..35afda7084d9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowInflaterTask.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RowInflaterTask.java @@ -33,6 +33,8 @@ import com.android.systemui.statusbar.InflationTask; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.util.time.SystemClock; +import java.util.concurrent.Executor; + import javax.inject.Inject; /** @@ -58,10 +60,22 @@ public class RowInflaterTask implements InflationTask, AsyncLayoutInflater.OnInf } /** - * Inflates a new notificationView. This should not be called twice on this object + * Inflates a new notificationView asynchronously, calling the {@code listener} on the main + * thread when done. This should not be called twice on this object. */ public void inflate(Context context, ViewGroup parent, NotificationEntry entry, RowInflationFinishedListener listener) { + inflate(context, parent, entry, null, listener); + } + + /** + * Inflates a new notificationView asynchronously, calling the {@code listener} on the supplied + * {@code listenerExecutor} (or the main thread if null) when done. This should not be called + * twice on this object. + */ + @VisibleForTesting + public void inflate(Context context, ViewGroup parent, NotificationEntry entry, + @Nullable Executor listenerExecutor, RowInflationFinishedListener listener) { if (TRACE_ORIGIN) { mInflateOrigin = new Throwable("inflate requested here"); } @@ -72,7 +86,7 @@ public class RowInflaterTask implements InflationTask, AsyncLayoutInflater.OnInf mLogger.logInflateStart(entry); mInflateStartTimeMs = mSystemClock.elapsedRealtime(); - inflater.inflate(R.layout.status_bar_notification_row, parent, this); + inflater.inflate(R.layout.status_bar_notification_row, parent, listenerExecutor, this); } private RowAsyncLayoutInflater makeRowInflater(NotificationEntry entry) { @@ -80,12 +94,12 @@ public class RowInflaterTask implements InflationTask, AsyncLayoutInflater.OnInf } @VisibleForTesting - static class RowAsyncLayoutInflater implements AsyncLayoutFactory { + public static class RowAsyncLayoutInflater implements AsyncLayoutFactory { private final NotificationEntry mEntry; private final SystemClock mSystemClock; private final RowInflaterTaskLogger mLogger; - RowAsyncLayoutInflater(NotificationEntry entry, SystemClock systemClock, + public RowAsyncLayoutInflater(NotificationEntry entry, SystemClock systemClock, RowInflaterTaskLogger logger) { mEntry = entry; mSystemClock = systemClock; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicChildBindControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicChildBindControllerTest.java index eb692eb1b4ac..0e24ed49fea0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicChildBindControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicChildBindControllerTest.java @@ -40,6 +40,9 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntryB import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.RowContentBindParams; import com.android.systemui.statusbar.notification.row.RowContentBindStage; +import com.android.systemui.statusbar.notification.row.RowInflaterTask; +import com.android.systemui.statusbar.notification.row.RowInflaterTaskLogger; +import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; import org.junit.Test; @@ -114,20 +117,25 @@ public class DynamicChildBindControllerTest extends SysuiTestCase { private NotificationEntry addGroup(int size) { NotificationEntry summary = new NotificationEntryBuilder().build(); - summary.setRow(createRow()); + summary.setRow(createRow(summary)); ArrayList<NotificationEntry> children = new ArrayList<>(); for (int i = 0; i < size; i++) { NotificationEntry child = new NotificationEntryBuilder().build(); - child.setRow(createRow()); + child.setRow(createRow(child)); children.add(child); } mGroupNotifs.put(summary, children); return summary; } - private ExpandableNotificationRow createRow() { + private ExpandableNotificationRow createRow(NotificationEntry entry) { + LayoutInflater inflater = LayoutInflater.from(mContext); + inflater.setFactory2( + new RowInflaterTask.RowAsyncLayoutInflater(entry, new FakeSystemClock(), mock( + RowInflaterTaskLogger.class))); + ExpandableNotificationRow row = (ExpandableNotificationRow) - LayoutInflater.from(mContext).inflate(R.layout.status_bar_notification_row, null); + inflater.inflate(R.layout.status_bar_notification_row, null); row.getPrivateLayout().setContractedChild(new View(mContext)); row.getPrivateLayout().setExpandedChild(new View(mContext)); return row; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.kt index 91e46668ed44..7332bc34b030 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.kt @@ -79,10 +79,11 @@ class NotificationContentViewTest : SysuiTestCase() { initMocks(this) fakeParent = spy(FrameLayout(mContext, /* attrs= */ null).also { it.visibility = View.GONE }) + val mockEntry = createMockNotificationEntry() row = spy( - ExpandableNotificationRow(mContext, /* attrs= */ null).apply { - entry = createMockNotificationEntry() + ExpandableNotificationRow(mContext, /* attrs= */ null, mockEntry).apply { + entry = mockEntry } ) ViewUtils.attachView(fakeParent) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt index 9a7b8ec2ec07..745d20dd686b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt @@ -1,5 +1,6 @@ package com.android.systemui.statusbar.notification.stack +import android.service.notification.StatusBarNotification import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper import android.view.LayoutInflater @@ -14,6 +15,7 @@ import com.android.systemui.res.R import com.android.systemui.shade.transition.LargeScreenShadeInterpolator import com.android.systemui.statusbar.NotificationShelf import com.android.systemui.statusbar.StatusBarIconView +import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView import com.android.systemui.statusbar.notification.shared.NotificationIconContainerRefactor @@ -457,8 +459,13 @@ open class NotificationShelfTest : SysuiTestCase() { expansionFraction: Float, expectedAlpha: Float ) { + val sbnMock: StatusBarNotification = mock() + val mockEntry = mock<NotificationEntry>().apply { + whenever(this.sbn).thenReturn(sbnMock) + } + val row = ExpandableNotificationRow(mContext, null, mockEntry) whenever(ambientState.lastVisibleBackgroundChild) - .thenReturn(ExpandableNotificationRow(mContext, null)) + .thenReturn(row) whenever(ambientState.isExpansionChanging).thenReturn(true) whenever(ambientState.expansionFraction).thenReturn(expansionFraction) whenever(hostLayoutController.speedBumpIndex).thenReturn(0) |