diff options
| author | 2024-10-04 18:29:57 +0000 | |
|---|---|---|
| committer | 2024-10-04 18:29:57 +0000 | |
| commit | 11fef3f646c2e679322706320b672f5de80c5a60 (patch) | |
| tree | d39ede777945dc07c87332ebd8e342d4bd4cb99a | |
| parent | 1b9ad86f95b26a8bd168ec536f39a65d0b4b3d41 (diff) | |
| parent | a839a08aaa783e2c8b78ff28020ac6d7df2d71fd (diff) | |
Merge "Revert prototype RON changes:" into main
34 files changed, 4 insertions, 2678 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelTest.kt deleted file mode 100644 index a310ef44cf35..000000000000 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelTest.kt +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2024 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. - */ - -@file:OptIn(ExperimentalCoroutinesApi::class) - -package com.android.systemui.statusbar.notification.row.ui.viewmodel - -import android.platform.test.annotations.EnableFlags -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.SmallTest -import com.android.systemui.SysuiTestCase -import com.android.systemui.coroutines.collectLastValue -import com.android.systemui.kosmos.testScope -import com.android.systemui.statusbar.notification.row.data.repository.fakeNotificationRowRepository -import com.android.systemui.statusbar.notification.row.shared.EnRouteContentModel -import com.android.systemui.statusbar.notification.row.shared.IconModel -import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag -import com.android.systemui.testKosmos -import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.runTest -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.kotlin.mock - -@RunWith(AndroidJUnit4::class) -@SmallTest -@EnableFlags(RichOngoingNotificationFlag.FLAG_NAME) -class EnRouteViewModelTest : SysuiTestCase() { - private val kosmos = testKosmos() - private val testScope = kosmos.testScope - private val repository = kosmos.fakeNotificationRowRepository - - private var contentModel: EnRouteContentModel? - get() = repository.richOngoingContentModel.value as? EnRouteContentModel - set(value) { - repository.richOngoingContentModel.value = value - } - - private lateinit var underTest: EnRouteViewModel - - @Before - fun setup() { - underTest = kosmos.getEnRouteViewModel(repository) - } - - @Test - fun viewModelShowsContent() = - testScope.runTest { - val title by collectLastValue(underTest.title) - val text by collectLastValue(underTest.text) - contentModel = - exampleEnRouteContent( - title = "Example EnRoute Title", - text = "Example EnRoute Text", - ) - assertThat(title).isEqualTo("Example EnRoute Title") - assertThat(text).isEqualTo("Example EnRoute Text") - } - - private fun exampleEnRouteContent( - icon: IconModel = mock(), - title: CharSequence = "example text", - text: CharSequence = "example title", - ) = - EnRouteContentModel( - smallIcon = icon, - title = title, - text = text, - ) -} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelTest.kt deleted file mode 100644 index 61873ad294e3..000000000000 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelTest.kt +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2024 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. - */ - -@file:OptIn(ExperimentalCoroutinesApi::class) - -package com.android.systemui.statusbar.notification.row.ui.viewmodel - -import android.app.Notification -import android.app.PendingIntent -import android.platform.test.annotations.EnableFlags -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.SmallTest -import com.android.systemui.SysuiTestCase -import com.android.systemui.coroutines.collectLastValue -import com.android.systemui.kosmos.testScope -import com.android.systemui.statusbar.notification.row.data.repository.fakeNotificationRowRepository -import com.android.systemui.statusbar.notification.row.shared.IconModel -import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag -import com.android.systemui.statusbar.notification.row.shared.TimerContentModel -import com.android.systemui.statusbar.notification.row.shared.TimerContentModel.TimerState.Paused -import com.android.systemui.testKosmos -import com.google.common.truth.Truth.assertThat -import java.time.Duration -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.runTest -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.kotlin.mock - -@RunWith(AndroidJUnit4::class) -@SmallTest -@EnableFlags(RichOngoingNotificationFlag.FLAG_NAME) -class TimerViewModelTest : SysuiTestCase() { - private val kosmos = testKosmos() - private val testScope = kosmos.testScope - private val repository = kosmos.fakeNotificationRowRepository - - private var contentModel: TimerContentModel? - get() = repository.richOngoingContentModel.value as? TimerContentModel - set(value) { - repository.richOngoingContentModel.value = value - } - - private lateinit var underTest: TimerViewModel - - @Before - fun setup() { - underTest = kosmos.getTimerViewModel(repository) - } - - @Test - fun labelShowsTheTimerName() = - testScope.runTest { - val label by collectLastValue(underTest.label) - contentModel = pausedTimer(name = "Example Timer Name") - assertThat(label).isEqualTo("Example Timer Name") - } - - @Test - fun pausedTimeRemainingFormatsWell() = - testScope.runTest { - val label by collectLastValue(underTest.pausedTime) - contentModel = pausedTimer(timeRemaining = Duration.ofMinutes(3)) - assertThat(label).isEqualTo("3:00") - contentModel = pausedTimer(timeRemaining = Duration.ofSeconds(119)) - assertThat(label).isEqualTo("1:59") - contentModel = pausedTimer(timeRemaining = Duration.ofSeconds(121)) - assertThat(label).isEqualTo("2:01") - contentModel = pausedTimer(timeRemaining = Duration.ofHours(1)) - assertThat(label).isEqualTo("1:00:00") - contentModel = pausedTimer(timeRemaining = Duration.ofHours(24)) - assertThat(label).isEqualTo("24:00:00") - } - - private fun pausedTimer( - icon: IconModel = mock(), - name: String = "example", - timeRemaining: Duration = Duration.ofMinutes(3), - resumeIntent: PendingIntent? = null, - addMinuteAction: Notification.Action? = null, - resetAction: Notification.Action? = null - ) = - TimerContentModel( - icon = icon, - name = name, - state = - Paused( - timeRemaining = timeRemaining, - resumeIntent = resumeIntent, - addMinuteAction = addMinuteAction, - resetAction = resetAction, - ) - ) -} diff --git a/packages/SystemUI/res/layout/notification_template_en_route_contracted.xml b/packages/SystemUI/res/layout/notification_template_en_route_contracted.xml deleted file mode 100644 index e7a40d129d50..000000000000 --- a/packages/SystemUI/res/layout/notification_template_en_route_contracted.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ Copyright (C) 2024 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. - --> - -<com.android.systemui.statusbar.notification.row.ui.view.EnRouteView - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@*android:id/status_bar_latest_event_content" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_weight="1" - android:minHeight="@*android:dimen/notification_headerless_min_height" - android:tag="enroute" - > - - <include layout="@*android:layout/notification_template_material_base" /> - -</com.android.systemui.statusbar.notification.row.ui.view.EnRouteView>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/notification_template_en_route_expanded.xml b/packages/SystemUI/res/layout/notification_template_en_route_expanded.xml deleted file mode 100644 index ca6d66a370bd..000000000000 --- a/packages/SystemUI/res/layout/notification_template_en_route_expanded.xml +++ /dev/null @@ -1,86 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ Copyright (C) 2014 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 - --> -<com.android.systemui.statusbar.notification.row.ui.view.EnRouteView - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@*android:id/status_bar_latest_event_content" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:clipChildren="false" - android:tag="big" - > - - <LinearLayout - android:id="@*android:id/notification_action_list_margin_target" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="@*android:dimen/notification_content_margin" - android:orientation="vertical" - > - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_weight="1" - android:layout_gravity="top" - > - - <include layout="@*android:layout/notification_template_header" /> - - <LinearLayout - android:id="@*android:id/notification_main_column" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="@*android:dimen/notification_content_margin_start" - android:layout_marginEnd="@*android:dimen/notification_content_margin_end" - android:layout_marginTop="@*android:dimen/notification_content_margin_top" - android:orientation="vertical" - > - - <include layout="@*android:layout/notification_template_part_line1" /> - - <include layout="@*android:layout/notification_template_text_multiline" /> - - <include - android:layout_width="match_parent" - android:layout_height="@*android:dimen/notification_progress_bar_height" - android:layout_marginTop="@*android:dimen/notification_progress_margin_top" - layout="@*android:layout/notification_template_progress" - /> - </LinearLayout> - - <include layout="@*android:layout/notification_template_right_icon" /> - </FrameLayout> - - <ViewStub - android:layout="@*android:layout/notification_material_reply_text" - android:id="@*android:id/notification_material_reply_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - /> - - <include - layout="@*android:layout/notification_template_smart_reply_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="@*android:dimen/notification_content_margin_start" - android:layout_marginEnd="@*android:dimen/notification_content_margin_end" - android:layout_marginTop="@*android:dimen/notification_content_margin" - /> - - <include layout="@*android:layout/notification_material_action_list" /> - </LinearLayout> -</com.android.systemui.statusbar.notification.row.ui.view.EnRouteView> diff --git a/packages/SystemUI/res/layout/rich_ongoing_timer_notification.xml b/packages/SystemUI/res/layout/rich_ongoing_timer_notification.xml deleted file mode 100644 index 3a679e3c16cb..000000000000 --- a/packages/SystemUI/res/layout/rich_ongoing_timer_notification.xml +++ /dev/null @@ -1,122 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2024 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 - --> -<com.android.systemui.statusbar.notification.row.ui.view.TimerView - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="wrap_content" - xmlns:app="http://schemas.android.com/apk/res-auto"> - - <androidx.constraintlayout.widget.Guideline - android:id="@+id/topBaseline" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="horizontal" - app:layout_constraintGuide_begin="22sp" - /> - - <ImageView - android:id="@+id/icon" - android:layout_width="24dp" - android:layout_height="24dp" - app:tint="@android:color/white" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toStartOf="@id/label" - android:baseline="18dp" - app:layout_constraintBaseline_toTopOf="@id/topBaseline" - /> - <TextView - android:id="@+id/label" - android:layout_width="0dp" - android:layout_height="wrap_content" - app:layout_constraintStart_toEndOf="@id/icon" - app:layout_constraintEnd_toStartOf="@id/chronoRemaining" - android:singleLine="true" - tools:text="15s Timer" - app:layout_constraintBaseline_toTopOf="@id/topBaseline" - android:paddingEnd="4dp" - /> - <Chronometer - android:id="@+id/chronoRemaining" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:singleLine="true" - android:textSize="20sp" - android:gravity="end" - tools:text="0:12" - app:layout_constraintBaseline_toTopOf="@id/topBaseline" - app:layout_constraintEnd_toStartOf="@id/pausedTimeRemaining" - app:layout_constraintStart_toEndOf="@id/label" - android:countDown="true" - android:paddingEnd="4dp" - /> - <TextView - android:id="@+id/pausedTimeRemaining" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:singleLine="true" - android:textSize="20sp" - android:gravity="end" - tools:text="0:12" - app:layout_constraintBaseline_toTopOf="@id/topBaseline" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@id/chronoRemaining" - android:paddingEnd="4dp" - /> - - <androidx.constraintlayout.widget.Barrier - android:id="@+id/bottomOfTop" - android:layout_width="match_parent" - android:layout_height="match_parent" - app:barrierDirection="bottom" - app:constraint_referenced_ids="icon,label,chronoRemaining,pausedTimeRemaining" - /> - - <com.android.systemui.statusbar.notification.row.ui.view.TimerButtonView - style="@*android:style/NotificationEmphasizedAction" - android:id="@+id/mainButton" - android:layout_width="124dp" - android:layout_height="wrap_content" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toStartOf="@id/altButton" - app:layout_constraintTop_toBottomOf="@id/bottomOfTop" - app:layout_constraintHorizontal_chainStyle="spread" - android:paddingEnd="4dp" - /> - - <com.android.systemui.statusbar.notification.row.ui.view.TimerButtonView - style="@*android:style/NotificationEmphasizedAction" - android:id="@+id/altButton" - android:layout_width="124dp" - android:layout_height="wrap_content" - app:layout_constraintTop_toBottomOf="@id/bottomOfTop" - app:layout_constraintStart_toEndOf="@id/mainButton" - app:layout_constraintEnd_toEndOf="@id/resetButton" - android:paddingEnd="4dp" - /> - - <com.android.systemui.statusbar.notification.row.ui.view.TimerButtonView - style="@*android:style/NotificationEmphasizedAction" - android:id="@+id/resetButton" - android:layout_width="124dp" - android:layout_height="wrap_content" - app:layout_constraintTop_toBottomOf="@id/bottomOfTop" - app:layout_constraintStart_toEndOf="@id/altButton" - app:layout_constraintEnd_toEndOf="parent" - android:paddingEnd="4dp" - /> -</com.android.systemui.statusbar.notification.row.ui.view.TimerView>
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index cb133ecadab2..e74ed8d27ec2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -68,11 +68,9 @@ import com.android.systemui.statusbar.notification.icon.IconPack; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRowController; import com.android.systemui.statusbar.notification.row.NotificationGuts; -import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository; import com.android.systemui.statusbar.notification.row.shared.HeadsUpStatusBarModel; import com.android.systemui.statusbar.notification.row.shared.NotificationContentModel; import com.android.systemui.statusbar.notification.row.shared.NotificationRowContentBinderRefactor; -import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel; import com.android.systemui.statusbar.notification.stack.PriorityBucket; import com.android.systemui.util.ListenerSet; @@ -99,7 +97,7 @@ import java.util.Objects; * At the moment, there are many things here that shouldn't be and vice-versa. Hopefully we can * clean this up in the future. */ -public final class NotificationEntry extends ListEntry implements NotificationRowRepository { +public final class NotificationEntry extends ListEntry { private final String mKey; private StatusBarNotification mSbn; @@ -161,8 +159,6 @@ public final class NotificationEntry extends ListEntry implements NotificationRo StateFlowKt.MutableStateFlow(null); private final MutableStateFlow<CharSequence> mHeadsUpStatusBarTextPublic = StateFlowKt.MutableStateFlow(null); - private final MutableStateFlow<RichOngoingContentModel> mRichOngoingContentModel = - StateFlowKt.MutableStateFlow(null); // indicates when this entry's view was first attached to a window // this value will reset when the view is completely removed from the shade (ie: filtered out) @@ -969,12 +965,6 @@ public final class NotificationEntry extends ListEntry implements NotificationRo return mHeadsUpStatusBarTextPublic; } - /** Gets the current RON content model, which may be null */ - @NonNull - public StateFlow<RichOngoingContentModel> getRichOngoingContentModel() { - return mRichOngoingContentModel; - } - /** * Sets the text to be displayed on the StatusBar, when this notification is the top pinned * heads up, and its content is sensitive right now. @@ -1069,7 +1059,6 @@ public final class NotificationEntry extends ListEntry implements NotificationRo HeadsUpStatusBarModel headsUpStatusBarModel = contentModel.getHeadsUpStatusBarModel(); this.mHeadsUpStatusBarText.setValue(headsUpStatusBarModel.getPrivateText()); this.mHeadsUpStatusBarTextPublic.setValue(headsUpStatusBarModel.getPublicText()); - this.mRichOngoingContentModel.setValue(contentModel.getRichOngoingContentModel()); } /** Information about a suggestion that is being edited. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 48c974a33f12..9166e7e9bed2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -76,8 +76,6 @@ import com.android.systemui.statusbar.policy.dagger.RemoteInputViewSubcomponent; import com.android.systemui.util.Compile; import com.android.systemui.util.DumpUtilsKt; -import kotlinx.coroutines.DisposableHandle; - import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; @@ -116,10 +114,6 @@ public class NotificationContentView extends FrameLayout implements Notification @VisibleForTesting protected HybridNotificationView mSingleLineView; - @Nullable public DisposableHandle mContractedBinderHandle; - @Nullable public DisposableHandle mExpandedBinderHandle; - @Nullable public DisposableHandle mHeadsUpBinderHandle; - private RemoteInputView mExpandedRemoteInput; private RemoteInputView mHeadsUpRemoteInput; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt index c342bcd2706b..b166defb96a2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt @@ -46,9 +46,6 @@ import com.android.systemui.statusbar.NotificationRemoteInputManager import com.android.systemui.statusbar.notification.ConversationNotificationProcessor import com.android.systemui.statusbar.notification.InflationException import com.android.systemui.statusbar.notification.collection.NotificationEntry -import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.InflatedContentViewHolder -import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.KeepExistingView -import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.NullContentView import com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_CONTRACTED import com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_EXPANDED import com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_HEADSUP @@ -71,7 +68,6 @@ import com.android.systemui.statusbar.notification.row.shared.LockscreenOtpRedac import com.android.systemui.statusbar.notification.row.shared.NewRemoteViews import com.android.systemui.statusbar.notification.row.shared.NotificationContentModel import com.android.systemui.statusbar.notification.row.shared.NotificationRowContentBinderRefactor -import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel import com.android.systemui.statusbar.notification.row.ui.viewbinder.SingleLineViewBinder import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer @@ -95,8 +91,6 @@ constructor( private val remoteViewCache: NotifRemoteViewCache, private val remoteInputManager: NotificationRemoteInputManager, private val conversationProcessor: ConversationNotificationProcessor, - private val ronExtractor: RichOngoingNotificationContentExtractor, - private val ronInflater: RichOngoingNotificationViewInflater, @NotifInflation private val inflationExecutor: Executor, private val smartReplyStateInflater: SmartReplyStateInflater, private val notifLayoutInflaterFactoryProvider: NotifLayoutInflaterFactory.Provider, @@ -144,8 +138,6 @@ constructor( remoteViewCache, entry, conversationProcessor, - ronExtractor, - ronInflater, row, bindParams.isMinimized, bindParams.usesIncreasedHeight, @@ -190,7 +182,6 @@ constructor( notifLayoutInflaterFactoryProvider = notifLayoutInflaterFactoryProvider, headsUpStyleProvider = headsUpStyleProvider, conversationProcessor = conversationProcessor, - ronExtractor = ronExtractor, logger = logger, ) inflateSmartReplyViews( @@ -282,22 +273,16 @@ constructor( when (inflateFlag) { FLAG_CONTENT_VIEW_CONTRACTED -> row.privateLayout.performWhenContentInactive(VISIBLE_TYPE_CONTRACTED) { - row.privateLayout.mContractedBinderHandle?.dispose() - row.privateLayout.mContractedBinderHandle = null row.privateLayout.setContractedChild(null) remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_CONTRACTED) } FLAG_CONTENT_VIEW_EXPANDED -> row.privateLayout.performWhenContentInactive(VISIBLE_TYPE_EXPANDED) { - row.privateLayout.mExpandedBinderHandle?.dispose() - row.privateLayout.mExpandedBinderHandle = null row.privateLayout.setExpandedChild(null) remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_EXPANDED) } FLAG_CONTENT_VIEW_HEADS_UP -> row.privateLayout.performWhenContentInactive(VISIBLE_TYPE_HEADSUP) { - row.privateLayout.mHeadsUpBinderHandle?.dispose() - row.privateLayout.mHeadsUpBinderHandle = null row.privateLayout.setHeadsUpChild(null) remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_HEADS_UP) row.privateLayout.setHeadsUpInflatedSmartReplies(null) @@ -378,8 +363,6 @@ constructor( private val remoteViewCache: NotifRemoteViewCache, private val entry: NotificationEntry, private val conversationProcessor: ConversationNotificationProcessor, - private val ronExtractor: RichOngoingNotificationContentExtractor, - private val ronInflater: RichOngoingNotificationViewInflater, private val row: ExpandableNotificationRow, private val isMinimized: Boolean, private val usesIncreasedHeight: Boolean, @@ -459,7 +442,6 @@ constructor( notifLayoutInflaterFactoryProvider = notifLayoutInflaterFactoryProvider, headsUpStyleProvider = headsUpStyleProvider, conversationProcessor = conversationProcessor, - ronExtractor = ronExtractor, logger = logger ) logger.logAsyncTaskProgress( @@ -506,90 +488,6 @@ constructor( } } - val richOngoingContentModel = inflationProgress.contentModel.richOngoingContentModel - - if ( - richOngoingContentModel != null && - reInflateFlags and CONTENT_VIEWS_TO_CREATE_RICH_ONGOING != 0 - ) { - logger.logAsyncTaskProgress(entry, "inflating RON view") - val inflateContractedView = reInflateFlags and FLAG_CONTENT_VIEW_CONTRACTED != 0 - val inflateExpandedView = reInflateFlags and FLAG_CONTENT_VIEW_EXPANDED != 0 - val inflateHeadsUpView = reInflateFlags and FLAG_CONTENT_VIEW_HEADS_UP != 0 - - inflationProgress.contractedRichOngoingNotificationViewHolder = - if (inflateContractedView) { - ronInflater.inflateView( - contentModel = richOngoingContentModel, - existingView = row.privateLayout.contractedChild, - entry = entry, - systemUiContext = context, - parentView = row.privateLayout, - viewType = RichOngoingNotificationViewType.Contracted - ) - } else { - if ( - ronInflater.canKeepView( - contentModel = richOngoingContentModel, - existingView = row.privateLayout.contractedChild, - viewType = RichOngoingNotificationViewType.Contracted - ) - ) { - KeepExistingView - } else { - NullContentView - } - } - - inflationProgress.expandedRichOngoingNotificationViewHolder = - if (inflateExpandedView) { - ronInflater.inflateView( - contentModel = richOngoingContentModel, - existingView = row.privateLayout.expandedChild, - entry = entry, - systemUiContext = context, - parentView = row.privateLayout, - viewType = RichOngoingNotificationViewType.Expanded - ) - } else { - if ( - ronInflater.canKeepView( - contentModel = richOngoingContentModel, - existingView = row.privateLayout.expandedChild, - viewType = RichOngoingNotificationViewType.Expanded - ) - ) { - KeepExistingView - } else { - NullContentView - } - } - - inflationProgress.headsUpRichOngoingNotificationViewHolder = - if (inflateHeadsUpView) { - ronInflater.inflateView( - contentModel = richOngoingContentModel, - existingView = row.privateLayout.headsUpChild, - entry = entry, - systemUiContext = context, - parentView = row.privateLayout, - viewType = RichOngoingNotificationViewType.HeadsUp - ) - } else { - if ( - ronInflater.canKeepView( - contentModel = richOngoingContentModel, - existingView = row.privateLayout.headsUpChild, - viewType = RichOngoingNotificationViewType.HeadsUp - ) - ) { - KeepExistingView - } else { - NullContentView - } - } - } - logger.logAsyncTaskProgress(entry, "getting row image resolver (on wrong thread!)") val imageResolver = row.imageResolver // wait for image resolver to finish preloading @@ -695,9 +593,6 @@ constructor( var inflatedSmartReplyState: InflatedSmartReplyState? = null var expandedInflatedSmartReplies: InflatedSmartReplyViewHolder? = null var headsUpInflatedSmartReplies: InflatedSmartReplyViewHolder? = null - var contractedRichOngoingNotificationViewHolder: ContentViewInflationResult? = null - var expandedRichOngoingNotificationViewHolder: ContentViewInflationResult? = null - var headsUpRichOngoingNotificationViewHolder: ContentViewInflationResult? = null // Inflated SingleLineView that lacks the UI State var inflatedSingleLineView: HybridNotificationView? = null @@ -734,7 +629,6 @@ constructor( val inflateHeadsUp = (reInflateFlags and FLAG_CONTENT_VIEW_HEADS_UP != 0 && result.remoteViews.headsUp != null) - if (inflateContracted || inflateExpanded || inflateHeadsUp) { logger.logAsyncTaskProgress(entry, "inflating contracted smart reply state") result.inflatedSmartReplyState = inflater.inflateSmartReplyState(entry) @@ -776,7 +670,6 @@ constructor( notifLayoutInflaterFactoryProvider: NotifLayoutInflaterFactory.Provider, headsUpStyleProvider: HeadsUpStyleProvider, conversationProcessor: ConversationNotificationProcessor, - ronExtractor: RichOngoingNotificationContentExtractor, logger: NotificationRowContentBinderLogger ): InflationProgress { // process conversations and extract the messaging style @@ -785,24 +678,9 @@ constructor( conversationProcessor.processNotification(entry, builder, logger) } else null - val richOngoingContentModel = - if (reInflateFlags and CONTENT_VIEWS_TO_CREATE_RICH_ONGOING != 0) { - ronExtractor.extractContentModel( - entry = entry, - builder = builder, - systemUIContext = systemUIContext, - packageContext = packageContext - ) - } else { - // if we're not re-inflating any RON views, make sure the model doesn't change - entry.richOngoingContentModel.value - } - - val remoteViewsFlags = getRemoteViewsFlags(reInflateFlags, richOngoingContentModel) - val remoteViews = createRemoteViews( - reInflateFlags = remoteViewsFlags, + reInflateFlags = reInflateFlags, builder = builder, isMinimized = isMinimized, usesIncreasedHeight = usesIncreasedHeight, @@ -850,7 +728,6 @@ constructor( headsUpStatusBarModel = headsUpStatusBarModel, singleLineViewModel = singleLineViewModel, publicSingleLineViewModel = publicSingleLineViewModel, - richOngoingContentModel = richOngoingContentModel, ) return InflationProgress( @@ -1506,31 +1383,11 @@ constructor( } logger.logAsyncTaskProgress(entry, "finishing") - // before updating the content model, stop existing binding if necessary - if (result.contractedRichOngoingNotificationViewHolder.shouldDisposeViewBinder()) { - row.privateLayout.mContractedBinderHandle?.dispose() - row.privateLayout.mContractedBinderHandle = null - } - - if (result.expandedRichOngoingNotificationViewHolder.shouldDisposeViewBinder()) { - row.privateLayout.mExpandedBinderHandle?.dispose() - row.privateLayout.mExpandedBinderHandle = null - } - - if (result.headsUpRichOngoingNotificationViewHolder.shouldDisposeViewBinder()) { - row.privateLayout.mHeadsUpBinderHandle?.dispose() - row.privateLayout.mHeadsUpBinderHandle = null - } - - // set the content model after disposal and before setting new rich ongoing view entry.setContentModel(result.contentModel) result.inflatedSmartReplyState?.let { row.privateLayout.setInflatedSmartReplyState(it) } - // set normal remote views (skipping rich ongoing states when that model exists) - val remoteViewsFlags = - getRemoteViewsFlags(reInflateFlags, result.contentModel.richOngoingContentModel) setContentViewsFromRemoteViews( - remoteViewsFlags, + reInflateFlags, entry, remoteViewCache, result, @@ -1538,7 +1395,6 @@ constructor( isMinimized, ) - // set single line view if ( AsyncHybridViewInflation.isEnabled && reInflateFlags and FLAG_CONTENT_VIEW_SINGLE_LINE != 0 @@ -1563,55 +1419,6 @@ constructor( } } - val hasRichOngoingViewHolder = - result.contractedRichOngoingNotificationViewHolder != null || - result.expandedRichOngoingNotificationViewHolder != null || - result.headsUpRichOngoingNotificationViewHolder != null - - if (hasRichOngoingViewHolder) { - // after updating the content model, set the view, then start the new binder - result.contractedRichOngoingNotificationViewHolder?.let { contractedViewHolder -> - if (contractedViewHolder is InflatedContentViewHolder) { - row.privateLayout.contractedChild = contractedViewHolder.view - row.privateLayout.mContractedBinderHandle = - contractedViewHolder.binder.setupContentViewBinder() - } else if (contractedViewHolder == NullContentView) { - row.privateLayout.contractedChild = null - } - } - - result.expandedRichOngoingNotificationViewHolder?.let { expandedViewHolder -> - if (expandedViewHolder is InflatedContentViewHolder) { - row.privateLayout.expandedChild = expandedViewHolder.view - row.privateLayout.mExpandedBinderHandle = - expandedViewHolder.binder.setupContentViewBinder() - } else if (expandedViewHolder == NullContentView) { - row.privateLayout.expandedChild = null - } - } - - result.headsUpRichOngoingNotificationViewHolder?.let { headsUpViewHolder -> - if (headsUpViewHolder is InflatedContentViewHolder) { - row.privateLayout.headsUpChild = headsUpViewHolder.view - row.privateLayout.mHeadsUpBinderHandle = - headsUpViewHolder.binder.setupContentViewBinder() - } else if (headsUpViewHolder == NullContentView) { - row.privateLayout.headsUpChild = null - } - } - - // clean remoteViewCache when we don't keep existing views. - remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_CONTRACTED) - remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_EXPANDED) - remoteViewCache.removeCachedView(entry, FLAG_CONTENT_VIEW_HEADS_UP) - - // Since RONs don't support smart reply, remove them from HUNs and Expanded. - row.privateLayout.setExpandedInflatedSmartReplies(null) - row.privateLayout.setHeadsUpInflatedSmartReplies(null) - - row.setExpandable(row.privateLayout.expandedChild != null) - } - Trace.endAsyncSection(APPLY_TRACE_METHOD, System.identityHashCode(row)) endListener?.onAsyncInflationFinished(entry) return true @@ -1775,21 +1582,6 @@ constructor( !oldView.hasFlags(RemoteViews.FLAG_REAPPLY_DISALLOWED) } - @InflationFlag - private fun getRemoteViewsFlags( - @InflationFlag reInflateFlags: Int, - richOngoingContentModel: RichOngoingContentModel? - ): Int = - if (richOngoingContentModel != null) { - reInflateFlags and CONTENT_VIEWS_TO_CREATE_RICH_ONGOING.inv() - } else { - reInflateFlags - } - - @InflationFlag - private const val CONTENT_VIEWS_TO_CREATE_RICH_ONGOING = - FLAG_CONTENT_VIEW_CONTRACTED or FLAG_CONTENT_VIEW_EXPANDED or FLAG_CONTENT_VIEW_HEADS_UP - private const val ASYNC_TASK_TRACE_METHOD = "NotificationRowContentBinderImpl.AsyncInflationTask" private const val APPLY_TRACE_METHOD = "NotificationRowContentBinderImpl#apply" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java index c630c4d43fba..84f2f6670839 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowModule.java @@ -18,8 +18,6 @@ package com.android.systemui.statusbar.notification.row; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.notification.row.shared.NotificationRowContentBinderRefactor; -import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag; -import com.android.systemui.statusbar.notification.row.ui.viewmodel.RichOngoingViewModelComponent; import dagger.Binds; import dagger.Module; @@ -30,7 +28,7 @@ import javax.inject.Provider; /** * Dagger Module containing notification row and view inflation implementations. */ -@Module(subcomponents = {RichOngoingViewModelComponent.class}) +@Module public abstract class NotificationRowModule { /** @@ -49,25 +47,6 @@ public abstract class NotificationRowModule { } } - /** Provides ron content model extractor. */ - @Provides - @SysUISingleton - public static RichOngoingNotificationContentExtractor provideRonContentExtractor( - Provider<RichOngoingNotificationContentExtractorImpl> realImpl - ) { - if (RichOngoingNotificationFlag.isEnabled()) { - return realImpl.get(); - } else { - return new NoOpRichOngoingNotificationContentExtractor(); - } - } - - /** Provides ron view inflater. */ - @Binds - @SysUISingleton - public abstract RichOngoingNotificationViewInflater provideRonViewInflater( - RichOngoingNotificationViewInflaterImpl impl); - /** * Provides notification remote view cache instance. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationContentExtractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationContentExtractor.kt deleted file mode 100644 index ec5ebc3651ee..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationContentExtractor.kt +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row - -import android.app.Notification -import android.app.PendingIntent -import android.content.Context -import android.util.Log -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.statusbar.notification.collection.NotificationEntry -import com.android.systemui.statusbar.notification.row.shared.EnRouteContentModel -import com.android.systemui.statusbar.notification.row.shared.IconModel -import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel -import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag -import com.android.systemui.statusbar.notification.row.shared.TimerContentModel -import java.time.Duration -import java.time.LocalDate -import java.time.LocalDateTime -import java.time.LocalTime -import java.time.ZoneId -import javax.inject.Inject - -/** - * Interface which provides a [RichOngoingContentModel] for a given [Notification] when one is - * applicable to the given style. - */ -interface RichOngoingNotificationContentExtractor { - fun extractContentModel( - entry: NotificationEntry, - builder: Notification.Builder, - systemUIContext: Context, - packageContext: Context, - ): RichOngoingContentModel? -} - -class NoOpRichOngoingNotificationContentExtractor : RichOngoingNotificationContentExtractor { - override fun extractContentModel( - entry: NotificationEntry, - builder: Notification.Builder, - systemUIContext: Context, - packageContext: Context, - ): RichOngoingContentModel? = null -} - -@SysUISingleton -class RichOngoingNotificationContentExtractorImpl @Inject constructor() : - RichOngoingNotificationContentExtractor { - - init { - /* check if */ RichOngoingNotificationFlag.isUnexpectedlyInLegacyMode() - } - - override fun extractContentModel( - entry: NotificationEntry, - builder: Notification.Builder, - systemUIContext: Context, - packageContext: Context, - ): RichOngoingContentModel? { - val sbn = entry.sbn - val notification = sbn.notification - val icon = IconModel(notification.smallIcon) - - try { - return if (sbn.packageName == "com.google.android.deskclock") { - when (notification.channelId) { - "Timers v2" -> { - parseTimerNotification(notification, icon) - } - "Stopwatch v2" -> { - Log.i("RONs", "Can't process stopwatch yet") - null - } - else -> { - Log.i("RONs", "Can't process channel '${notification.channelId}'") - null - } - } - } else if (builder.style is Notification.ProgressStyle) { - parseEnRouteNotification(notification, icon) - } else null - } catch (e: Exception) { - Log.e("RONs", "Error parsing RON", e) - return null - } - } - - /** - * FOR PROTOTYPING ONLY: create a RON TimerContentModel using the time information available - * inside the sortKey of the clock app's timer notifications. - */ - private fun parseTimerNotification( - notification: Notification, - icon: IconModel, - ): TimerContentModel { - // sortKey=1 0|↺7|RUNNING|▶16:21:58.523|Σ0:05:00|Δ0:00:03|⏳0:04:57 - // sortKey=1 0|↺7|PAUSED|Σ0:05:00|Δ0:04:54|⏳0:00:06 - // sortKey=1 1|↺7|RUNNING|▶16:30:28.433|Σ0:04:05|Δ0:00:06|⏳0:03:59 - // sortKey=1 0|↺7|RUNNING|▶16:36:18.350|Σ0:05:00|Δ0:01:42|⏳0:03:18 - // sortKey=1 2|↺7|RUNNING|▶16:38:37.816|Σ0:02:00|Δ0:01:09|⏳0:00:51 - // ▶ = "current" time (when updated) - // Σ = total time - // Δ = time elapsed - // ⏳ = time remaining - val sortKey = notification.sortKey - val (_, _, state, extra) = sortKey.split("|", limit = 4) - return when (state) { - "PAUSED" -> { - val (total, _, remaining) = extra.split("|") - val timeRemaining = parseTimeDelta(remaining) - TimerContentModel( - icon = icon, - // TODO: b/352142761 - define and use a string resource rather than " Timer". - // (The UX isn't final so using " Timer" for now). - name = total.replace("Σ", "") + " Timer", - state = - TimerContentModel.TimerState.Paused( - timeRemaining = timeRemaining, - resumeIntent = notification.findStartIntent(), - addMinuteAction = notification.findAddMinuteAction(), - resetAction = notification.findResetAction(), - ), - ) - } - "RUNNING" -> { - val (current, total, _, remaining) = extra.split("|") - val finishTime = parseCurrentTime(current) + parseTimeDelta(remaining).toMillis() - TimerContentModel( - icon = icon, - // TODO: b/352142761 - define and use a string resource rather than " Timer". - // (The UX isn't final so using " Timer" for now). - name = total.replace("Σ", "") + " Timer", - state = - TimerContentModel.TimerState.Running( - finishTime = finishTime, - pauseIntent = notification.findPauseIntent(), - addMinuteAction = notification.findAddMinuteAction(), - resetAction = notification.findResetAction(), - ), - ) - } - else -> error("unknown state ($state) in sortKey=$sortKey") - } - } - - private fun Notification.findPauseIntent(): PendingIntent? { - return actions - .firstOrNull { it.actionIntent.intent?.action?.endsWith(".PAUSE_TIMER") == true } - ?.actionIntent - } - - private fun Notification.findStartIntent(): PendingIntent? { - return actions - .firstOrNull { it.actionIntent.intent?.action?.endsWith(".START_TIMER") == true } - ?.actionIntent - } - - // TODO: b/352142761 - switch to system attributes for label and icon. - // - We probably want a consistent look for the Reset button. (Double check with UX.) - // - Using the custom assets now since I couldn't an existing "Reset" icon. - private fun Notification.findResetAction(): Notification.Action? { - return actions.firstOrNull { - it.actionIntent.intent?.action?.endsWith(".RESET_TIMER") == true - } - } - - // TODO: b/352142761 - check with UX on whether this should be required. - // - Alternative is to allow for optional actions in addition to main and reset. - // - For optional actions, we should take the custom label and icon. - private fun Notification.findAddMinuteAction(): Notification.Action? { - return actions.firstOrNull { - it.actionIntent.intent?.action?.endsWith(".ADD_MINUTE_TIMER") == true - } - } - - private fun parseCurrentTime(current: String): Long { - val (hour, minute, second, millis) = current.replace("▶", "").split(":", ".") - // NOTE: this won't work correctly at/around midnight. It's just for prototyping. - val localDateTime = - LocalDateTime.of( - LocalDate.now(), - LocalTime.of(hour.toInt(), minute.toInt(), second.toInt(), millis.toInt() * 1000000), - ) - val offset = ZoneId.systemDefault().rules.getOffset(localDateTime) - return localDateTime.toInstant(offset).toEpochMilli() - } - - private fun parseTimeDelta(delta: String): Duration { - val (hour, minute, second) = delta.replace("Σ", "").replace("⏳", "").split(":") - return Duration.ofHours(hour.toLong()) - .plusMinutes(minute.toLong()) - .plusSeconds(second.toLong()) - } - - private fun parseEnRouteNotification( - notification: Notification, - icon: IconModel, - ): EnRouteContentModel { - return EnRouteContentModel( - smallIcon = icon, - title = notification.extras.getCharSequence(Notification.EXTRA_TITLE), - text = notification.extras.getCharSequence(Notification.EXTRA_TEXT), - ) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationViewInflater.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationViewInflater.kt deleted file mode 100644 index 77c4130482c8..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/RichOngoingNotificationViewInflater.kt +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row - -import android.app.Notification -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.res.R -import com.android.systemui.statusbar.notification.collection.NotificationEntry -import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.InflatedContentViewHolder -import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.KeepExistingView -import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.NullContentView -import com.android.systemui.statusbar.notification.row.shared.EnRouteContentModel -import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel -import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag -import com.android.systemui.statusbar.notification.row.shared.TimerContentModel -import com.android.systemui.statusbar.notification.row.ui.view.EnRouteView -import com.android.systemui.statusbar.notification.row.ui.view.TimerView -import com.android.systemui.statusbar.notification.row.ui.viewbinder.EnRouteViewBinder -import com.android.systemui.statusbar.notification.row.ui.viewbinder.TimerViewBinder -import com.android.systemui.statusbar.notification.row.ui.viewmodel.EnRouteViewModel -import com.android.systemui.statusbar.notification.row.ui.viewmodel.RichOngoingViewModelComponent -import com.android.systemui.statusbar.notification.row.ui.viewmodel.TimerViewModel -import javax.inject.Inject -import kotlinx.coroutines.DisposableHandle - -fun interface DeferredContentViewBinder { - fun setupContentViewBinder(): DisposableHandle -} - -enum class RichOngoingNotificationViewType { - Contracted, - Expanded, - HeadsUp, -} - -/** - * * Supertype of the 3 different possible result types of - * [RichOngoingNotificationViewInflater.inflateView]. - */ -sealed interface ContentViewInflationResult { - - /** Indicates that the content view should be removed if present. */ - data object NullContentView : ContentViewInflationResult - - /** - * Indicates that the content view (which *must be* present) should be unmodified during this - * inflation. - */ - data object KeepExistingView : ContentViewInflationResult - - /** - * Contains the new view and binder that should replace any existing content view for this slot. - */ - data class InflatedContentViewHolder(val view: View, val binder: DeferredContentViewBinder) : - ContentViewInflationResult -} - -fun ContentViewInflationResult?.shouldDisposeViewBinder() = this !is KeepExistingView - -/** - * Interface which provides a [RichOngoingContentModel] for a given [Notification] when one is - * applicable to the given style. - */ -interface RichOngoingNotificationViewInflater { - fun inflateView( - contentModel: RichOngoingContentModel, - existingView: View?, - entry: NotificationEntry, - systemUiContext: Context, - parentView: ViewGroup, - viewType: RichOngoingNotificationViewType, - ): ContentViewInflationResult - - fun canKeepView( - contentModel: RichOngoingContentModel, - existingView: View?, - viewType: RichOngoingNotificationViewType - ): Boolean -} - -@SysUISingleton -class RichOngoingNotificationViewInflaterImpl -@Inject -constructor( - private val viewModelComponentFactory: RichOngoingViewModelComponent.Factory, -) : RichOngoingNotificationViewInflater { - - override fun inflateView( - contentModel: RichOngoingContentModel, - existingView: View?, - entry: NotificationEntry, - systemUiContext: Context, - parentView: ViewGroup, - viewType: RichOngoingNotificationViewType, - ): ContentViewInflationResult { - if (RichOngoingNotificationFlag.isUnexpectedlyInLegacyMode()) return NullContentView - val component = viewModelComponentFactory.create(entry) - return when (contentModel) { - is TimerContentModel -> - inflateTimerView( - existingView, - component::createTimerViewModel, - systemUiContext, - parentView, - viewType - ) - is EnRouteContentModel -> - inflateEnRouteView( - existingView, - component::createEnRouteViewModel, - systemUiContext, - parentView, - viewType - ) - else -> TODO("Not yet implemented") - } - } - - override fun canKeepView( - contentModel: RichOngoingContentModel, - existingView: View?, - viewType: RichOngoingNotificationViewType - ): Boolean { - if (RichOngoingNotificationFlag.isUnexpectedlyInLegacyMode()) return false - return when (contentModel) { - is TimerContentModel -> canKeepTimerView(contentModel, existingView, viewType) - is EnRouteContentModel -> canKeepEnRouteView(contentModel, existingView, viewType) - else -> TODO("Not yet implemented") - } - } - - private fun inflateTimerView( - existingView: View?, - createViewModel: () -> TimerViewModel, - systemUiContext: Context, - parentView: ViewGroup, - viewType: RichOngoingNotificationViewType, - ): ContentViewInflationResult { - if (existingView is TimerView && !existingView.isReinflateNeeded()) return KeepExistingView - - return when (viewType) { - RichOngoingNotificationViewType.Contracted -> { - val newView = - LayoutInflater.from(systemUiContext) - .inflate( - R.layout.rich_ongoing_timer_notification, - parentView, - /* attachToRoot= */ false - ) as TimerView - InflatedContentViewHolder(newView) { - TimerViewBinder.bindWhileAttached(newView, createViewModel()) - } - } - RichOngoingNotificationViewType.Expanded, - RichOngoingNotificationViewType.HeadsUp -> NullContentView - } - } - - private fun canKeepTimerView( - contentModel: TimerContentModel, - existingView: View?, - viewType: RichOngoingNotificationViewType - ): Boolean = true - - private fun inflateEnRouteView( - existingView: View?, - createViewModel: () -> EnRouteViewModel, - systemUiContext: Context, - parentView: ViewGroup, - viewType: RichOngoingNotificationViewType, - ): ContentViewInflationResult { - if (existingView is EnRouteView && !existingView.isReinflateNeeded()) - return KeepExistingView - return when (viewType) { - RichOngoingNotificationViewType.Contracted -> { - val newView = - LayoutInflater.from(systemUiContext) - .inflate( - R.layout.notification_template_en_route_contracted, - parentView, - /* attachToRoot= */ false - ) as EnRouteView - InflatedContentViewHolder(newView) { - EnRouteViewBinder.bindWhileAttached(newView, createViewModel()) - } - } - RichOngoingNotificationViewType.Expanded -> { - val newView = - LayoutInflater.from(systemUiContext) - .inflate( - R.layout.notification_template_en_route_expanded, - parentView, - /* attachToRoot= */ false - ) as EnRouteView - InflatedContentViewHolder(newView) { - EnRouteViewBinder.bindWhileAttached(newView, createViewModel()) - } - } - RichOngoingNotificationViewType.HeadsUp -> NullContentView - } - } - - private fun canKeepEnRouteView( - contentModel: EnRouteContentModel, - existingView: View?, - viewType: RichOngoingNotificationViewType - ): Boolean = true -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepository.kt deleted file mode 100644 index bac887ba7f14..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepository.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.data.repository - -import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel -import kotlinx.coroutines.flow.StateFlow - -/** A repository of states relating to a specific notification row. */ -interface NotificationRowRepository { - /** - * A flow of an immutable data class with the current state of the Rich Ongoing Notification - * content, if applicable. - */ - val richOngoingContentModel: StateFlow<RichOngoingContentModel?> -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractor.kt deleted file mode 100644 index 72823a760197..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractor.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.domain.interactor - -import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository -import com.android.systemui.statusbar.notification.row.shared.EnRouteContentModel -import com.android.systemui.statusbar.notification.row.shared.TimerContentModel -import javax.inject.Inject -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.filterIsInstance - -/** Interactor specific to a particular notification row. */ -class NotificationRowInteractor @Inject constructor(repository: NotificationRowRepository) { - /** Content of a rich ongoing timer notification. */ - val timerContentModel: Flow<TimerContentModel> = - repository.richOngoingContentModel.filterIsInstance<TimerContentModel>() - - /** Content of a rich ongoing timer notification. */ - val enRouteContentModel: Flow<EnRouteContentModel> = - repository.richOngoingContentModel.filterIsInstance<EnRouteContentModel>() -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/EnRouteContentModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/EnRouteContentModel.kt deleted file mode 100644 index 7e78cca028ef..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/EnRouteContentModel.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.shared - -/** - * Represents something en route. - * - * @param smallIcon the main small icon of the EnRoute notification. - * @param title the title of the EnRoute notification. - * @param text the text of the EnRoute notification. - */ -data class EnRouteContentModel( - val smallIcon: IconModel, - val title: CharSequence?, - val text: CharSequence?, -) : RichOngoingContentModel diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/IconModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/IconModel.kt deleted file mode 100644 index e61193892d10..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/IconModel.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.shared - -import android.graphics.drawable.Drawable -import android.graphics.drawable.Icon - -// TODO: figure out how to support lazy resolution of the drawable, e.g. on unrelated text change -class IconModel(val icon: Icon) { - var drawable: Drawable? = null - - override fun equals(other: Any?): Boolean = - when (other) { - null -> false - (other === this) -> true - !is IconModel -> false - else -> other.icon.sameAs(icon) - } - - override fun toString(): String = "IconModel(icon=$icon, drawable=$drawable)" -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/NotificationContentModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/NotificationContentModel.kt index 0f9a5a30cbe5..004c66b64b9f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/NotificationContentModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/NotificationContentModel.kt @@ -22,7 +22,4 @@ data class NotificationContentModel( val headsUpStatusBarModel: HeadsUpStatusBarModel, val singleLineViewModel: SingleLineViewModel? = null, val publicSingleLineViewModel: SingleLineViewModel? = null, - val richOngoingContentModel: RichOngoingContentModel? = null, ) - -sealed interface RichOngoingContentModel diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingClock.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingClock.kt deleted file mode 100644 index 33b256456ca3..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingClock.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.shared - -import android.app.Notification -import android.app.PendingIntent -import java.time.Duration - -/** - * Represents a simple timer that counts down to a time. - * - * @param name the label for the timer - * @param state state of the timer, including time and whether it is paused or running - */ -data class TimerContentModel( - val icon: IconModel, - val name: String, - val state: TimerState, -) : RichOngoingContentModel { - /** The state (paused or running) of the timer, and relevant time */ - sealed interface TimerState { - val addMinuteAction: Notification.Action? - val resetAction: Notification.Action? - - /** - * Indicates a running timer - * - * @param finishTime the time in ms since epoch that the timer will finish - * @param pauseIntent the action for pausing the timer - */ - data class Running( - val finishTime: Long, - val pauseIntent: PendingIntent?, - override val addMinuteAction: Notification.Action?, - override val resetAction: Notification.Action?, - ) : TimerState - - /** - * Indicates a paused timer - * - * @param timeRemaining the time in ms remaining on the paused timer - * @param resumeIntent the action for resuming the timer - */ - data class Paused( - val timeRemaining: Duration, - val resumeIntent: PendingIntent?, - override val addMinuteAction: Notification.Action?, - override val resetAction: Notification.Action?, - ) : TimerState - } -} - -/** - * Represents a simple stopwatch that counts up and allows tracking laps. - * - * @param state state of the stopwatch, including time and whether it is paused or running - * @param lapDurations a list of durations of each completed lap - */ -data class StopwatchContentModel( - val icon: IconModel, - val state: StopwatchState, - val lapDurations: List<Long>, -) : RichOngoingContentModel { - /** The state (paused or running) of the stopwatch, and relevant time */ - sealed interface StopwatchState { - /** - * Indicates a running stopwatch - * - * @param startTime the time in ms since epoch that the stopwatch started, plus any - * accumulated pause time - * @param pauseIntent the action for pausing the stopwatch - */ - data class Running( - val startTime: Long, - val pauseIntent: PendingIntent, - ) : StopwatchState - - /** - * Indicates a paused stopwatch - * - * @param timeElapsed the time in ms elapsed on the stopwatch - * @param resumeIntent the action for resuming the stopwatch - */ - data class Paused( - val timeElapsed: Duration, - val resumeIntent: PendingIntent, - ) : StopwatchState - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingNotificationFlag.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingNotificationFlag.kt deleted file mode 100644 index 4a7f7cd46ad1..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/shared/RichOngoingNotificationFlag.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.shared - -import android.app.Flags -import com.android.systemui.flags.FlagToken -import com.android.systemui.flags.RefactorFlagUtils - -/** Helper for reading or using the api rich ongoing flag state. */ -@Suppress("NOTHING_TO_INLINE") -object RichOngoingNotificationFlag { - /** The aconfig flag name */ - const val FLAG_NAME = Flags.FLAG_API_RICH_ONGOING - - /** A token used for dependency declaration */ - val token: FlagToken - get() = FlagToken(FLAG_NAME, isEnabled) - - /** Is the refactor enabled */ - @JvmStatic - inline val isEnabled - get() = Flags.apiRichOngoing() - - /** - * Called to ensure code is only run when the flag is enabled. This protects users from the - * unintended behaviors caused by accidentally running new logic, while also crashing on an eng - * build to ensure that the refactor author catches issues in testing. - */ - @JvmStatic - inline fun isUnexpectedlyInLegacyMode() = - RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME) - - /** - * Called to ensure code is only run when the flag is disabled. This will throw an exception if - * the flag is enabled to ensure that the refactor author catches issues in testing. - */ - @JvmStatic - inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME) -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/ConfigurationTracker.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/ConfigurationTracker.kt deleted file mode 100644 index 95c507cb72a2..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/ConfigurationTracker.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.ui.view - -import android.content.pm.ActivityInfo.CONFIG_ASSETS_PATHS -import android.content.pm.ActivityInfo.CONFIG_DENSITY -import android.content.pm.ActivityInfo.CONFIG_FONT_SCALE -import android.content.pm.ActivityInfo.CONFIG_LAYOUT_DIRECTION -import android.content.pm.ActivityInfo.CONFIG_LOCALE -import android.content.pm.ActivityInfo.CONFIG_UI_MODE -import android.content.res.Configuration -import android.content.res.Resources - -/** - * Tracks the active configuration when constructed and returns (when queried) whether the - * configuration has unhandled changes. - */ -class ConfigurationTracker( - private val resources: Resources, - private val unhandledConfigChanges: Int -) { - private val initialConfig = Configuration(resources.configuration) - - constructor( - resources: Resources, - handlesDensityFontScale: Boolean = false, - handlesTheme: Boolean = false, - handlesLocaleAndLayout: Boolean = true, - ) : this( - resources, - unhandledConfigChanges = - (if (handlesDensityFontScale) 0 else CONFIG_DENSITY or CONFIG_FONT_SCALE) or - (if (handlesTheme) 0 else CONFIG_ASSETS_PATHS or CONFIG_UI_MODE) or - (if (handlesLocaleAndLayout) 0 else CONFIG_LOCALE or CONFIG_LAYOUT_DIRECTION) - ) - - /** - * Whether the current configuration has unhandled changes relative to the initial configuration - */ - fun hasUnhandledConfigChange(): Boolean = - initialConfig.diff(resources.configuration) and unhandledConfigChanges != 0 -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/EnRouteView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/EnRouteView.kt deleted file mode 100644 index e5c2b5fff5e9..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/EnRouteView.kt +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.ui.view - -import android.content.Context -import android.graphics.drawable.Icon -import android.util.AttributeSet -import android.widget.FrameLayout -import android.widget.ImageView -import android.widget.TextView -import com.android.internal.R -import com.android.internal.widget.NotificationExpandButton - -class EnRouteView -@JvmOverloads -constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - defStyleRes: Int = 0, -) : FrameLayout(context, attrs, defStyleAttr, defStyleRes) { - - private val configTracker = ConfigurationTracker(resources) - - private lateinit var icon: ImageView - private lateinit var title: TextView - private lateinit var text: TextView - private lateinit var expandButton: NotificationExpandButton - - override fun onFinishInflate() { - super.onFinishInflate() - icon = requireViewById(R.id.icon) - title = requireViewById(R.id.title) - text = requireViewById(R.id.text) - - expandButton = requireViewById(R.id.expand_button) - expandButton.setExpanded(false) - } - - /** the resources configuration has changed such that the view needs to be reinflated */ - fun isReinflateNeeded(): Boolean = configTracker.hasUnhandledConfigChange() - - fun setIcon(icon: Icon?) { - this.icon.setImageIcon(icon) - } - - fun setTitle(title: CharSequence?) { - this.title.text = title - } - - fun setText(text: CharSequence?) { - this.text.text = text - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerButtonView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerButtonView.kt deleted file mode 100644 index 8c951877544c..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerButtonView.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.ui.view - -import android.annotation.DrawableRes -import android.content.Context -import android.graphics.BlendMode -import android.util.AttributeSet -import com.android.internal.widget.EmphasizedNotificationButton - -class TimerButtonView -@JvmOverloads -constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - defStyleRes: Int = 0, -) : EmphasizedNotificationButton(context, attrs, defStyleAttr, defStyleRes) { - - private val Int.dp: Int - get() = (this * context.resources.displayMetrics.density).toInt() - - fun setIcon(@DrawableRes icon: Int) { - val drawable = context.getDrawable(icon) - - drawable?.mutate() - drawable?.setTintList(textColors) - drawable?.setTintBlendMode(BlendMode.SRC_IN) - drawable?.setBounds(0, 0, 24.dp, 24.dp) - - setCompoundDrawablesRelative(drawable, null, null, null) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerView.kt deleted file mode 100644 index d481b50101c1..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/view/TimerView.kt +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.ui.view - -import android.content.Context -import android.graphics.drawable.Icon -import android.os.SystemClock -import android.util.AttributeSet -import android.widget.Chronometer -import android.widget.ImageView -import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.view.isVisible -import com.android.systemui.res.R - -class TimerView -@JvmOverloads -constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - defStyleRes: Int = 0, -) : ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) { - - private val configTracker = ConfigurationTracker(resources) - - private lateinit var icon: ImageView - private lateinit var label: TextView - private lateinit var chronometer: Chronometer - private lateinit var pausedTimeRemaining: TextView - lateinit var mainButton: TimerButtonView - private set - - lateinit var altButton: TimerButtonView - private set - - lateinit var resetButton: TimerButtonView - private set - - override fun onFinishInflate() { - super.onFinishInflate() - icon = requireViewById(R.id.icon) - label = requireViewById(R.id.label) - chronometer = requireViewById(R.id.chronoRemaining) - pausedTimeRemaining = requireViewById(R.id.pausedTimeRemaining) - mainButton = requireViewById(R.id.mainButton) - altButton = requireViewById(R.id.altButton) - resetButton = requireViewById(R.id.resetButton) - } - - /** the resources configuration has changed such that the view needs to be reinflated */ - fun isReinflateNeeded(): Boolean = configTracker.hasUnhandledConfigChange() - - fun setIcon(icon: Icon?) { - this.icon.setImageIcon(icon) - } - - fun setLabel(label: String) { - this.label.text = label - } - - fun setPausedTime(pausedTime: String?) { - if (pausedTime != null) { - pausedTimeRemaining.text = pausedTime - pausedTimeRemaining.isVisible = true - } else { - pausedTimeRemaining.isVisible = false - } - } - - fun setCountdownTime(countdownTimeMs: Long?) { - if (countdownTimeMs != null) { - chronometer.base = - countdownTimeMs - System.currentTimeMillis() + SystemClock.elapsedRealtime() - chronometer.isVisible = true - chronometer.start() - } else { - chronometer.isVisible = false - chronometer.stop() - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/EnRouteViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/EnRouteViewBinder.kt deleted file mode 100644 index 3b8957c092f2..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/EnRouteViewBinder.kt +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.ui.viewbinder - -import androidx.lifecycle.lifecycleScope -import com.android.systemui.lifecycle.repeatWhenAttached -import com.android.systemui.statusbar.notification.row.ui.view.EnRouteView -import com.android.systemui.statusbar.notification.row.ui.viewmodel.EnRouteViewModel -import kotlinx.coroutines.DisposableHandle -import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch - -/** Binds a [EnRouteView] to its [view model][EnRouteViewModel]. */ -object EnRouteViewBinder { - fun bindWhileAttached( - view: EnRouteView, - viewModel: EnRouteViewModel, - ): DisposableHandle { - return view.repeatWhenAttached { lifecycleScope.launch { bind(view, viewModel) } } - } - - suspend fun bind( - view: EnRouteView, - viewModel: EnRouteViewModel, - ) = coroutineScope { - launch { viewModel.icon.collect { view.setIcon(it) } } - launch { viewModel.title.collect { view.setTitle(it) } } - launch { viewModel.text.collect { view.setText(it) } } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/TimerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/TimerViewBinder.kt deleted file mode 100644 index 042d1bcfb2ee..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/TimerViewBinder.kt +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.ui.viewbinder - -import android.content.res.ColorStateList -import android.graphics.drawable.Icon -import android.view.View -import androidx.core.view.isGone -import androidx.lifecycle.lifecycleScope -import com.android.systemui.lifecycle.repeatWhenAttached -import com.android.systemui.statusbar.notification.row.ui.view.TimerButtonView -import com.android.systemui.statusbar.notification.row.ui.view.TimerView -import com.android.systemui.statusbar.notification.row.ui.viewmodel.TimerViewModel -import kotlinx.coroutines.DisposableHandle -import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch - -/** Binds a [TimerView] to its [view model][TimerViewModel]. */ -object TimerViewBinder { - fun bindWhileAttached( - view: TimerView, - viewModel: TimerViewModel, - ): DisposableHandle { - return view.repeatWhenAttached { lifecycleScope.launch { bind(view, viewModel) } } - } - - suspend fun bind( - view: TimerView, - viewModel: TimerViewModel, - ) = coroutineScope { - launch { viewModel.icon.collect { view.setIcon(it) } } - launch { viewModel.label.collect { view.setLabel(it) } } - launch { viewModel.pausedTime.collect { view.setPausedTime(it) } } - launch { viewModel.countdownTime.collect { view.setCountdownTime(it) } } - launch { viewModel.mainButtonModel.collect { bind(view.mainButton, it) } } - launch { viewModel.altButtonModel.collect { bind(view.altButton, it) } } - launch { viewModel.resetButtonModel.collect { bind(view.resetButton, it) } } - } - - fun bind(buttonView: TimerButtonView, model: TimerViewModel.ButtonViewModel?) { - if (model != null) { - buttonView.setButtonBackground( - ColorStateList.valueOf( - buttonView.context.getColor(com.android.internal.R.color.system_accent2_100) - ) - ) - buttonView.setTextColor( - buttonView.context.getColor( - com.android.internal.R.color.notification_primary_text_color_light - ) - ) - - when (model) { - is TimerViewModel.ButtonViewModel.WithSystemAttrs -> { - buttonView.setIcon(model.iconRes) - buttonView.setText(model.labelRes) - } - is TimerViewModel.ButtonViewModel.WithCustomAttrs -> { - // TODO: b/352142761 - is there a better way to deal with TYPE_RESOURCE icons - // with empty resPackage? RemoteViews handles this by using a different - // `contextForResources` for inflation. - val icon = - if (model.icon.type == Icon.TYPE_RESOURCE && model.icon.resPackage == "") - Icon.createWithResource( - "com.google.android.deskclock", - model.icon.resId - ) - else model.icon - buttonView.setImageIcon(icon) - buttonView.text = model.label - } - } - - buttonView.setOnClickListener( - model.pendingIntent?.let { pendingIntent -> - View.OnClickListener { pendingIntent.send() } - } - ) - buttonView.isEnabled = model.pendingIntent != null - } - buttonView.isGone = model == null - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModel.kt deleted file mode 100644 index 307a9834ccc9..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModel.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.ui.viewmodel - -import android.graphics.drawable.Icon -import com.android.systemui.dump.DumpManager -import com.android.systemui.statusbar.notification.row.domain.interactor.NotificationRowInteractor -import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag -import com.android.systemui.util.kotlin.FlowDumperImpl -import javax.inject.Inject -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.mapNotNull - -/** A view model for EnRoute notifications. */ -class EnRouteViewModel -@Inject -constructor( - dumpManager: DumpManager, - rowInteractor: NotificationRowInteractor, -) : FlowDumperImpl(dumpManager) { - init { - /* check if */ RichOngoingNotificationFlag.isUnexpectedlyInLegacyMode() - } - - val icon: Flow<Icon?> = rowInteractor.enRouteContentModel.mapNotNull { it.smallIcon.icon } - - val title: Flow<CharSequence?> = rowInteractor.enRouteContentModel.map { it.title } - - val text: Flow<CharSequence?> = rowInteractor.enRouteContentModel.map { it.text } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/RichOngoingViewModelComponent.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/RichOngoingViewModelComponent.kt deleted file mode 100644 index 5552d89b6f9d..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/RichOngoingViewModelComponent.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.ui.viewmodel - -// noinspection CleanArchitectureDependencyViolation -import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository -import dagger.BindsInstance -import dagger.Subcomponent - -@Subcomponent -interface RichOngoingViewModelComponent { - - @Subcomponent.Factory - interface Factory { - /** Creates an instance of [RichOngoingViewModelComponent]. */ - fun create( - @BindsInstance repository: NotificationRowRepository - ): RichOngoingViewModelComponent - } - - fun createTimerViewModel(): TimerViewModel - - fun createEnRouteViewModel(): EnRouteViewModel -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModel.kt deleted file mode 100644 index 768a093e0b65..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModel.kt +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.ui.viewmodel - -import android.annotation.DrawableRes -import android.annotation.StringRes -import android.app.PendingIntent -import android.graphics.drawable.Icon -import com.android.systemui.dump.DumpManager -import com.android.systemui.statusbar.notification.row.domain.interactor.NotificationRowInteractor -import com.android.systemui.statusbar.notification.row.shared.RichOngoingNotificationFlag -import com.android.systemui.statusbar.notification.row.shared.TimerContentModel.TimerState -import com.android.systemui.util.kotlin.FlowDumperImpl -import java.time.Duration -import javax.inject.Inject -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.mapNotNull - -/** A view model for Timer notifications. */ -class TimerViewModel -@Inject -constructor( - dumpManager: DumpManager, - rowInteractor: NotificationRowInteractor, -) : FlowDumperImpl(dumpManager) { - init { - /* check if */ RichOngoingNotificationFlag.isUnexpectedlyInLegacyMode() - } - - private val state: Flow<TimerState> = rowInteractor.timerContentModel.mapNotNull { it.state } - - val icon: Flow<Icon?> = rowInteractor.timerContentModel.mapNotNull { it.icon.icon } - - val label: Flow<String> = rowInteractor.timerContentModel.mapNotNull { it.name } - - val countdownTime: Flow<Long?> = state.map { (it as? TimerState.Running)?.finishTime } - - val pausedTime: Flow<String?> = - state.map { (it as? TimerState.Paused)?.timeRemaining?.format() } - - val mainButtonModel: Flow<ButtonViewModel> = - state.map { - when (it) { - is TimerState.Paused -> - ButtonViewModel.WithSystemAttrs( - it.resumeIntent, - com.android.systemui.res.R.string.controls_media_resume, // "Resume", - com.android.systemui.res.R.drawable.ic_media_play - ) - is TimerState.Running -> - ButtonViewModel.WithSystemAttrs( - it.pauseIntent, - com.android.systemui.res.R.string.controls_media_button_pause, // "Pause", - com.android.systemui.res.R.drawable.ic_media_pause - ) - } - } - - val altButtonModel: Flow<ButtonViewModel?> = - state.map { - it.addMinuteAction?.let { action -> - ButtonViewModel.WithCustomAttrs( - action.actionIntent, - action.title, // "1:00", - action.getIcon() - ) - } - } - - val resetButtonModel: Flow<ButtonViewModel?> = - state.map { - it.resetAction?.let { action -> - ButtonViewModel.WithCustomAttrs( - action.actionIntent, - action.title, // "Reset", - action.getIcon() - ) - } - } - - sealed interface ButtonViewModel { - val pendingIntent: PendingIntent? - - data class WithSystemAttrs( - override val pendingIntent: PendingIntent?, - @StringRes val labelRes: Int, - @DrawableRes val iconRes: Int, - ) : ButtonViewModel - - data class WithCustomAttrs( - override val pendingIntent: PendingIntent?, - val label: CharSequence, - val icon: Icon, - ) : ButtonViewModel - } -} - -private fun Duration.format(): String { - val hours = this.toHours() - return if (hours > 0) { - String.format("%d:%02d:%02d", hours, toMinutesPart(), toSecondsPart()) - } else { - String.format("%d:%02d", toMinutes(), toSecondsPart()) - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt index a099c9dc6442..48608ebd6de0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImplTest.kt @@ -35,9 +35,6 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.res.R import com.android.systemui.statusbar.notification.ConversationNotificationProcessor import com.android.systemui.statusbar.notification.collection.NotificationEntry -import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.InflatedContentViewHolder -import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.KeepExistingView -import com.android.systemui.statusbar.notification.row.ContentViewInflationResult.NullContentView import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.BindParams import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.FLAG_CONTENT_VIEW_ALL import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.FLAG_CONTENT_VIEW_CONTRACTED @@ -51,33 +48,23 @@ import com.android.systemui.statusbar.notification.row.shared.LockscreenOtpRedac import com.android.systemui.statusbar.notification.row.shared.NewRemoteViews import com.android.systemui.statusbar.notification.row.shared.NotificationContentModel import com.android.systemui.statusbar.notification.row.shared.NotificationRowContentBinderRefactor -import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel -import com.android.systemui.statusbar.notification.row.shared.TimerContentModel import com.android.systemui.statusbar.policy.InflatedSmartReplyState import com.android.systemui.statusbar.policy.InflatedSmartReplyViewHolder import com.android.systemui.statusbar.policy.SmartReplyStateInflater -import com.google.common.truth.Truth.assertThat import java.util.concurrent.CountDownLatch import java.util.concurrent.Executor import java.util.concurrent.TimeUnit -import kotlinx.coroutines.DisposableHandle import org.junit.Assert import org.junit.Before import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.any -import org.mockito.kotlin.argThat -import org.mockito.kotlin.clearInvocations -import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq -import org.mockito.kotlin.inOrder import org.mockito.kotlin.mock -import org.mockito.kotlin.never import org.mockito.kotlin.spy import org.mockito.kotlin.times import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever @SmallTest @@ -118,45 +105,6 @@ class NotificationRowContentBinderImplTest : SysuiTestCase() { } } - private var fakeRonContentModel: RichOngoingContentModel? = null - private val fakeRonExtractor = - object : RichOngoingNotificationContentExtractor { - override fun extractContentModel( - entry: NotificationEntry, - builder: Notification.Builder, - systemUIContext: Context, - packageContext: Context - ): RichOngoingContentModel? = fakeRonContentModel - } - - private var fakeContractedRonViewHolder: ContentViewInflationResult = NullContentView - private var fakeExpandedRonViewHolder: ContentViewInflationResult = NullContentView - private var fakeHeadsUpRonViewHolder: ContentViewInflationResult = NullContentView - private var fakeRonViewInflater = - spy( - object : RichOngoingNotificationViewInflater { - override fun inflateView( - contentModel: RichOngoingContentModel, - existingView: View?, - entry: NotificationEntry, - systemUiContext: Context, - parentView: ViewGroup, - viewType: RichOngoingNotificationViewType - ): ContentViewInflationResult = - when (viewType) { - RichOngoingNotificationViewType.Contracted -> fakeContractedRonViewHolder - RichOngoingNotificationViewType.Expanded -> fakeExpandedRonViewHolder - RichOngoingNotificationViewType.HeadsUp -> fakeHeadsUpRonViewHolder - } - - override fun canKeepView( - contentModel: RichOngoingContentModel, - existingView: View?, - viewType: RichOngoingNotificationViewType - ): Boolean = false - } - ) - @Before fun setUp() { allowTestableLooperAsMainThread() @@ -167,15 +115,12 @@ class NotificationRowContentBinderImplTest : SysuiTestCase() { .setContentText("Text") .setStyle(Notification.BigTextStyle().bigText("big text")) testHelper = NotificationTestHelper(mContext, mDependency) - testHelper.setDefaultInflationFlags(FLAG_CONTENT_VIEW_ALL) row = spy(testHelper.createRow(builder.build())) notificationInflater = NotificationRowContentBinderImpl( cache, mock(), mock<ConversationNotificationProcessor>(), - fakeRonExtractor, - fakeRonViewInflater, mock(), smartReplyStateInflater, layoutInflaterFactoryProvider, @@ -405,496 +350,6 @@ class NotificationRowContentBinderImplTest : SysuiTestCase() { } @Test - fun testRonModelRequiredForRonView() { - fakeRonContentModel = null - val contractedRonView = View(context) - val expandedRonView = View(context) - val headsUpRonView = View(context) - fakeContractedRonViewHolder = - InflatedContentViewHolder(view = contractedRonView, binder = mock()) - fakeExpandedRonViewHolder = - InflatedContentViewHolder(view = expandedRonView, binder = mock()) - fakeHeadsUpRonViewHolder = InflatedContentViewHolder(view = headsUpRonView, binder = mock()) - - // WHEN inflater inflates - val contentToInflate = - FLAG_CONTENT_VIEW_CONTRACTED or FLAG_CONTENT_VIEW_EXPANDED or FLAG_CONTENT_VIEW_HEADS_UP - inflateAndWait(notificationInflater, contentToInflate, row) - verifyNoMoreInteractions(fakeRonViewInflater) - } - - @Test - fun testRonModelCleansUpRemoteViews() { - val ronView = View(context) - - val entry = row.entry - - fakeRonContentModel = mock<TimerContentModel>() - fakeContractedRonViewHolder = - InflatedContentViewHolder(view = ronView, binder = mock<DeferredContentViewBinder>()) - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row) - - // VERIFY - verify(cache).removeCachedView(eq(entry), eq(FLAG_CONTENT_VIEW_CONTRACTED)) - verify(cache).removeCachedView(eq(entry), eq(FLAG_CONTENT_VIEW_EXPANDED)) - verify(cache).removeCachedView(eq(entry), eq(FLAG_CONTENT_VIEW_HEADS_UP)) - } - - @Test - fun testRonModelCleansUpSmartReplies() { - val ronView = View(context) - - val privateLayout = spy(row.privateLayout) - - row.privateLayout = privateLayout - - fakeRonContentModel = mock<TimerContentModel>() - fakeContractedRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mock()) - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row) - - // VERIFY - verify(privateLayout).setExpandedInflatedSmartReplies(eq(null)) - verify(privateLayout).setHeadsUpInflatedSmartReplies(eq(null)) - } - - @Test - fun testRonModelTriggersInflationOfContractedRonView() { - val mockRonModel = mock<TimerContentModel>() - val ronView = View(context) - val mockBinder = mock<DeferredContentViewBinder>() - - val entry = row.entry - val privateLayout = row.privateLayout - - fakeRonContentModel = mockRonModel - fakeContractedRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder) - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row) - - // VERIFY that the inflater is invoked - verify(fakeRonViewInflater) - .inflateView( - eq(mockRonModel), - any(), - eq(entry), - any(), - eq(privateLayout), - eq(RichOngoingNotificationViewType.Contracted) - ) - assertThat(row.privateLayout.contractedChild).isSameInstanceAs(ronView) - verify(mockBinder).setupContentViewBinder() - } - - @Test - fun testRonModelTriggersInflationOfExpandedRonView() { - val mockRonModel = mock<TimerContentModel>() - val ronView = View(context) - val mockBinder = mock<DeferredContentViewBinder>() - - val entry = row.entry - val privateLayout = row.privateLayout - - fakeRonContentModel = mockRonModel - fakeExpandedRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder) - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_EXPANDED, row) - - // VERIFY that the inflater is invoked - verify(fakeRonViewInflater) - .inflateView( - eq(mockRonModel), - any(), - eq(entry), - any(), - eq(privateLayout), - eq(RichOngoingNotificationViewType.Expanded) - ) - assertThat(row.privateLayout.expandedChild).isSameInstanceAs(ronView) - verify(mockBinder).setupContentViewBinder() - } - - @Test - fun testRonModelTriggersInflationOfHeadsUpRonView() { - val mockRonModel = mock<TimerContentModel>() - val ronView = View(context) - val mockBinder = mock<DeferredContentViewBinder>() - - val entry = row.entry - val privateLayout = row.privateLayout - - fakeRonContentModel = mockRonModel - fakeHeadsUpRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder) - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_HEADS_UP, row) - - // VERIFY that the inflater is invoked - verify(fakeRonViewInflater) - .inflateView( - eq(mockRonModel), - any(), - eq(entry), - any(), - eq(privateLayout), - eq(RichOngoingNotificationViewType.HeadsUp) - ) - assertThat(row.privateLayout.headsUpChild).isSameInstanceAs(ronView) - verify(mockBinder).setupContentViewBinder() - } - - @Test - fun keepExistingViewForContractedRonNotChangingContractedChild() { - val oldHandle = mock<DisposableHandle>() - val mockRonModel = mock<TimerContentModel>() - - row.privateLayout.mContractedBinderHandle = oldHandle - val entry = spy(row.entry) - row.entry = entry - val privateLayout = spy(row.privateLayout) - row.privateLayout = privateLayout - - fakeRonContentModel = mockRonModel - fakeContractedRonViewHolder = KeepExistingView - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row) - - // THEN do not dispose old contracted binder handle and change contracted child - verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verifyNoMoreInteractions(oldHandle) - verify(privateLayout, never()).setContractedChild(any()) - } - - @Test - fun keepExistingViewForExpandedRonNotChangingExpandedChild() { - val oldHandle = mock<DisposableHandle>() - val mockRonModel = mock<TimerContentModel>() - - row.privateLayout.mExpandedBinderHandle = oldHandle - val entry = spy(row.entry) - row.entry = entry - val privateLayout = spy(row.privateLayout) - row.privateLayout = privateLayout - - fakeRonContentModel = mockRonModel - fakeExpandedRonViewHolder = KeepExistingView - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_EXPANDED, row) - - // THEN do not dispose old expanded binder handle and change expanded child - verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verifyNoMoreInteractions(oldHandle) - verify(privateLayout, never()).setExpandedChild(any()) - } - - @Test - fun keepExistingViewForHeadsUpRonNotChangingHeadsUpChild() { - val oldHandle = mock<DisposableHandle>() - val mockRonModel = mock<TimerContentModel>() - - row.privateLayout.mHeadsUpBinderHandle = oldHandle - val entry = spy(row.entry) - row.entry = entry - val privateLayout = spy(row.privateLayout) - row.privateLayout = privateLayout - - fakeRonContentModel = mockRonModel - fakeHeadsUpRonViewHolder = KeepExistingView - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_HEADS_UP, row) - - // THEN - do not dispose old heads up binder handle and change heads up child - verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verifyNoMoreInteractions(oldHandle) - verify(privateLayout, never()).setHeadsUpChild(any()) - } - - @Test - fun nullContentViewForContractedRonAppliesElementsInOrder() { - val oldHandle = mock<DisposableHandle>() - val mockRonModel = mock<TimerContentModel>() - - row.privateLayout.mContractedBinderHandle = oldHandle - val entry = spy(row.entry) - row.entry = entry - val privateLayout = spy(row.privateLayout) - row.privateLayout = privateLayout - - fakeRonContentModel = mockRonModel - fakeContractedRonViewHolder = NullContentView - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row) - - // Validate that these 4 steps happen in this precise order - inOrder(oldHandle, entry, privateLayout, cache) { - verify(oldHandle).dispose() - verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verify(privateLayout).setContractedChild(eq(null)) - } - } - - @Test - fun nullContentViewForExpandedRonAppliesElementsInOrder() { - val oldHandle = mock<DisposableHandle>() - val mockRonModel = mock<TimerContentModel>() - - row.privateLayout.mExpandedBinderHandle = oldHandle - val entry = spy(row.entry) - row.entry = entry - val privateLayout = spy(row.privateLayout) - row.privateLayout = privateLayout - - fakeRonContentModel = mockRonModel - fakeExpandedRonViewHolder = NullContentView - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_EXPANDED, row) - - // Validate that these 4 steps happen in this precise order - inOrder(oldHandle, entry, privateLayout, cache) { - verify(oldHandle).dispose() - verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verify(privateLayout).setExpandedChild(eq(null)) - } - } - - @Test - fun nullContentViewForHeadsUpRonAppliesElementsInOrder() { - val oldHandle = mock<DisposableHandle>() - val mockRonModel = mock<TimerContentModel>() - - row.privateLayout.mHeadsUpBinderHandle = oldHandle - val entry = spy(row.entry) - row.entry = entry - val privateLayout = spy(row.privateLayout) - row.privateLayout = privateLayout - - fakeRonContentModel = mockRonModel - fakeHeadsUpRonViewHolder = NullContentView - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_HEADS_UP, row) - - // Validate that these 4 steps happen in this precise order - inOrder(oldHandle, entry, privateLayout, cache) { - verify(oldHandle).dispose() - verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verify(privateLayout).setHeadsUpChild(eq(null)) - } - } - - @Test - fun contractedRonViewAppliesElementsInOrder() { - val oldHandle = mock<DisposableHandle>() - val mockRonModel = mock<TimerContentModel>() - val ronView = View(context) - val mockBinder = mock<DeferredContentViewBinder>() - - row.privateLayout.mContractedBinderHandle = oldHandle - val entry = spy(row.entry) - row.entry = entry - val privateLayout = spy(row.privateLayout) - row.privateLayout = privateLayout - - fakeRonContentModel = mockRonModel - fakeContractedRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder) - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_CONTRACTED, row) - - // Validate that these 4 steps happen in this precise order - inOrder(oldHandle, entry, privateLayout, mockBinder) { - verify(oldHandle).dispose() - verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verify(privateLayout).setContractedChild(eq(ronView)) - verify(mockBinder).setupContentViewBinder() - } - } - - @Test - fun expandedRonViewAppliesElementsInOrder() { - val oldHandle = mock<DisposableHandle>() - val mockRonModel = mock<TimerContentModel>() - val ronView = View(context) - val mockBinder = mock<DeferredContentViewBinder>() - - row.privateLayout.mExpandedBinderHandle = oldHandle - val entry = spy(row.entry) - row.entry = entry - val privateLayout = spy(row.privateLayout) - row.privateLayout = privateLayout - - fakeRonContentModel = mockRonModel - fakeExpandedRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder) - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_EXPANDED, row) - - // Validate that these 4 steps happen in this precise order - inOrder(oldHandle, entry, privateLayout, mockBinder) { - verify(oldHandle).dispose() - verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verify(privateLayout).setExpandedChild(eq(ronView)) - verify(mockBinder).setupContentViewBinder() - } - } - - @Test - fun headsUpRonViewAppliesElementsInOrder() { - val oldHandle = mock<DisposableHandle>() - val mockRonModel = mock<TimerContentModel>() - val ronView = View(context) - val mockBinder = mock<DeferredContentViewBinder>() - - row.privateLayout.mHeadsUpBinderHandle = oldHandle - val entry = spy(row.entry) - row.entry = entry - val privateLayout = spy(row.privateLayout) - row.privateLayout = privateLayout - - fakeRonContentModel = mockRonModel - fakeHeadsUpRonViewHolder = InflatedContentViewHolder(view = ronView, binder = mockBinder) - - // WHEN inflater inflates - inflateAndWait(notificationInflater, FLAG_CONTENT_VIEW_HEADS_UP, row) - - // Validate that these 4 steps happen in this precise order - inOrder(oldHandle, entry, privateLayout, mockBinder) { - verify(oldHandle).dispose() - verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel }) - verify(privateLayout).setHeadsUpChild(eq(ronView)) - verify(mockBinder).setupContentViewBinder() - } - } - - @Test - fun testRonNotReinflating() { - val oldContractedBinderHandle = mock<DisposableHandle>() - val oldExpandedBinderHandle = mock<DisposableHandle>() - val oldHeadsUpBinderHandle = mock<DisposableHandle>() - - val contractedBinderHandle = mock<DisposableHandle>() - val expandedBinderHandle = mock<DisposableHandle>() - val headsUpBinderHandle = mock<DisposableHandle>() - - val contractedRonView = View(context) - val expandedRonView = View(context) - val headsUpRonView = View(context) - - val mockRonModel1 = mock<TimerContentModel>() - val mockRonModel2 = mock<TimerContentModel>() - - val mockContractedViewBinder = mock<DeferredContentViewBinder>() - val mockExpandedViewBinder = mock<DeferredContentViewBinder>() - val mockHeadsUpViewBinder = mock<DeferredContentViewBinder>() - - doReturn(contractedBinderHandle).whenever(mockContractedViewBinder).setupContentViewBinder() - doReturn(expandedBinderHandle).whenever(mockExpandedViewBinder).setupContentViewBinder() - doReturn(headsUpBinderHandle).whenever(mockHeadsUpViewBinder).setupContentViewBinder() - - row.privateLayout.mContractedBinderHandle = oldContractedBinderHandle - row.privateLayout.mExpandedBinderHandle = oldExpandedBinderHandle - row.privateLayout.mHeadsUpBinderHandle = oldHeadsUpBinderHandle - val entry = spy(row.entry) - row.entry = entry - val privateLayout = spy(row.privateLayout) - row.privateLayout = privateLayout - - // WHEN inflater inflates both a model and a view - fakeRonContentModel = mockRonModel1 - fakeContractedRonViewHolder = - InflatedContentViewHolder(view = contractedRonView, binder = mockContractedViewBinder) - fakeExpandedRonViewHolder = - InflatedContentViewHolder(view = expandedRonView, binder = mockExpandedViewBinder) - fakeHeadsUpRonViewHolder = - InflatedContentViewHolder(view = headsUpRonView, binder = mockHeadsUpViewBinder) - - val contentToInflate = - FLAG_CONTENT_VIEW_CONTRACTED or FLAG_CONTENT_VIEW_EXPANDED or FLAG_CONTENT_VIEW_HEADS_UP - inflateAndWait(notificationInflater, contentToInflate, row) - - // Validate that these 4 steps happen in this precise order - inOrder( - oldContractedBinderHandle, - oldExpandedBinderHandle, - oldHeadsUpBinderHandle, - entry, - privateLayout, - mockContractedViewBinder, - mockExpandedViewBinder, - mockHeadsUpViewBinder, - contractedBinderHandle, - expandedBinderHandle, - headsUpBinderHandle - ) { - verify(oldContractedBinderHandle).dispose() - verify(oldExpandedBinderHandle).dispose() - verify(oldHeadsUpBinderHandle).dispose() - - verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel1 }) - - verify(privateLayout).setContractedChild(eq(contractedRonView)) - verify(mockContractedViewBinder).setupContentViewBinder() - - verify(privateLayout).setExpandedChild(eq(expandedRonView)) - verify(mockExpandedViewBinder).setupContentViewBinder() - - verify(privateLayout).setHeadsUpChild(eq(headsUpRonView)) - verify(mockHeadsUpViewBinder).setupContentViewBinder() - - verify(contractedBinderHandle, never()).dispose() - verify(expandedBinderHandle, never()).dispose() - verify(headsUpBinderHandle, never()).dispose() - } - - clearInvocations( - oldContractedBinderHandle, - oldExpandedBinderHandle, - oldHeadsUpBinderHandle, - entry, - privateLayout, - mockContractedViewBinder, - mockExpandedViewBinder, - mockHeadsUpViewBinder, - contractedBinderHandle, - expandedBinderHandle, - headsUpBinderHandle - ) - - // THEN when the inflater inflates just a model - fakeRonContentModel = mockRonModel2 - fakeContractedRonViewHolder = KeepExistingView - fakeExpandedRonViewHolder = KeepExistingView - fakeHeadsUpRonViewHolder = KeepExistingView - - inflateAndWait(notificationInflater, contentToInflate, row) - - // Validate that for reinflation, the only thing we do us update the model - verify(contractedBinderHandle, never()).dispose() - verify(expandedBinderHandle, never()).dispose() - verify(headsUpBinderHandle, never()).dispose() - verify(entry).setContentModel(argThat { richOngoingContentModel === mockRonModel2 }) - verify(privateLayout, never()).setContractedChild(any()) - verify(privateLayout, never()).setExpandedChild(any()) - verify(privateLayout, never()).setHeadsUpChild(any()) - verify(mockContractedViewBinder, never()).setupContentViewBinder() - verify(mockExpandedViewBinder, never()).setupContentViewBinder() - verify(mockHeadsUpViewBinder, never()).setupContentViewBinder() - verify(contractedBinderHandle, never()).dispose() - verify(expandedBinderHandle, never()).dispose() - verify(headsUpBinderHandle, never()).dispose() - } - - @Test fun testNotificationViewHeightTooSmallFailsValidation() { val validationError = getValidationError( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java index 75376e62f192..2340d0289db4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java @@ -200,8 +200,6 @@ public class NotificationTestHelper { mock(NotifRemoteViewCache.class), mock(NotificationRemoteInputManager.class), mock(ConversationNotificationProcessor.class), - mock(RichOngoingNotificationContentExtractor.class), - mock(RichOngoingNotificationViewInflater.class), mock(Executor.class), new MockSmartReplyInflater(), mock(NotifLayoutInflaterFactory.Provider.class), diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt index 2eb1573dc3d7..fc4f05df26ed 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt @@ -222,8 +222,6 @@ class ExpandableNotificationRowBuilder( Mockito.mock(NotifRemoteViewCache::class.java, STUB_ONLY), remoteInputManager, conversationProcessor, - Mockito.mock(RichOngoingNotificationContentExtractor::class.java, STUB_ONLY), - Mockito.mock(RichOngoingNotificationViewInflater::class.java, STUB_ONLY), Mockito.mock(Executor::class.java, STUB_ONLY), smartReplyStateInflater, notifLayoutInflaterFactoryProvider, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepositoryKosmos.kt deleted file mode 100644 index 84ef4b5c21c3..000000000000 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/data/repository/NotificationRowRepositoryKosmos.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.data.repository - -import com.android.systemui.kosmos.Kosmos -import com.android.systemui.kosmos.Kosmos.Fixture -import com.android.systemui.statusbar.notification.row.shared.RichOngoingContentModel -import kotlinx.coroutines.flow.MutableStateFlow - -val Kosmos.fakeNotificationRowRepository by Fixture { FakeNotificationRowRepository() } - -class FakeNotificationRowRepository : NotificationRowRepository { - override val richOngoingContentModel = MutableStateFlow<RichOngoingContentModel?>(null) -} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractorKosmos.kt deleted file mode 100644 index 3a7d7ba064d0..000000000000 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/domain/interactor/NotificationRowInteractorKosmos.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.domain.interactor - -import com.android.systemui.kosmos.Kosmos -import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository - -fun Kosmos.getNotificationRowInteractor(repository: NotificationRowRepository) = - NotificationRowInteractor(repository = repository) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelKosmos.kt deleted file mode 100644 index 7e511355372b..000000000000 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/EnRouteViewModelKosmos.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.ui.viewmodel - -import com.android.systemui.dump.dumpManager -import com.android.systemui.kosmos.Kosmos -import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository -import com.android.systemui.statusbar.notification.row.domain.interactor.getNotificationRowInteractor - -fun Kosmos.getEnRouteViewModel(repository: NotificationRowRepository) = - EnRouteViewModel( - dumpManager = dumpManager, - rowInteractor = getNotificationRowInteractor(repository), - ) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelKosmos.kt deleted file mode 100644 index 00f45b220654..000000000000 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/TimerViewModelKosmos.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2024 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.statusbar.notification.row.ui.viewmodel - -import com.android.systemui.dump.dumpManager -import com.android.systemui.kosmos.Kosmos -import com.android.systemui.statusbar.notification.row.data.repository.NotificationRowRepository -import com.android.systemui.statusbar.notification.row.domain.interactor.getNotificationRowInteractor - -fun Kosmos.getTimerViewModel(repository: NotificationRowRepository) = - TimerViewModel( - dumpManager = dumpManager, - rowInteractor = getNotificationRowInteractor(repository), - ) |