From 4f97e7aa48435e59e4b75738fe6fd452894f59d9 Mon Sep 17 00:00:00 2001 From: Steve Elliott Date: Tue, 11 Aug 2020 11:31:39 -0400 Subject: Remove Dependency#get from SmartReplyView Test: manual, atest Change-Id: I79e3e35090d570f853a86e16c99d56dc08ed1821 --- .../android/systemui/dagger/SystemUIModule.java | 18 +- .../row/ExpandableNotificationRowController.java | 16 +- .../row/NotificationContentInflater.java | 82 ++-- .../notification/row/NotificationContentView.java | 22 +- .../statusbar/policy/InflatedSmartReplies.java | 223 +--------- .../policy/SmartRepliesAndActionsInflater.kt | 462 +++++++++++++++++++++ .../systemui/statusbar/policy/SmartReplyView.java | 316 +++----------- .../policy/dagger/SmartRepliesInflationModule.kt | 34 ++ .../row/NotificationContentInflaterTest.java | 30 +- .../row/NotificationEntryManagerInflationTest.java | 9 +- .../notification/row/NotificationTestHelper.java | 9 +- .../statusbar/policy/InflatedSmartRepliesTest.java | 63 +-- .../statusbar/policy/SmartReplyViewTest.java | 202 ++++++--- 13 files changed, 841 insertions(+), 645 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartRepliesAndActionsInflater.kt create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/SmartRepliesInflationModule.kt diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index 90dc213ce6e6..63d9a831b33f 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -41,6 +41,7 @@ import com.android.systemui.statusbar.notification.row.dagger.NotificationShelfC import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.policy.dagger.SmartRepliesInflationModule; import com.android.systemui.statusbar.policy.dagger.StatusBarPolicyModule; import com.android.systemui.tuner.dagger.TunerModule; import com.android.systemui.user.UserModule; @@ -74,6 +75,7 @@ import dagger.Provides; SensorModule.class, SettingsModule.class, SettingsUtilModule.class, + SmartRepliesInflationModule.class, StatusBarPolicyModule.class, SysUIConcurrencyModule.class, TunerModule.class, @@ -81,13 +83,15 @@ import dagger.Provides; UtilModule.class, VolumeModule.class }, - subcomponents = {StatusBarComponent.class, - NotificationRowComponent.class, - DozeComponent.class, - ExpandableNotificationRowComponent.class, - KeyguardBouncerComponent.class, - NotificationShelfComponent.class, - FragmentService.FragmentCreator.class}) + subcomponents = { + StatusBarComponent.class, + NotificationRowComponent.class, + DozeComponent.class, + ExpandableNotificationRowComponent.class, + KeyguardBouncerComponent.class, + NotificationShelfComponent.class, + FragmentService.FragmentCreator.class + }) public abstract class SystemUIModule { @Binds diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java index 1d72557c6a89..c995e324ecfe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java @@ -81,21 +81,27 @@ public class ExpandableNotificationRowController implements NodeController { private final PeopleNotificationIdentifier mPeopleNotificationIdentifier; @Inject - public ExpandableNotificationRowController(ExpandableNotificationRow view, + public ExpandableNotificationRowController( + ExpandableNotificationRow view, NotificationListContainer listContainer, ActivatableNotificationViewController activatableNotificationViewController, - NotificationMediaManager mediaManager, PluginManager pluginManager, - SystemClock clock, @AppName String appName, @NotificationKey String notificationKey, + NotificationMediaManager mediaManager, + PluginManager pluginManager, + SystemClock clock, + @AppName String appName, + @NotificationKey String notificationKey, KeyguardBypassController keyguardBypassController, GroupMembershipManager groupMembershipManager, GroupExpansionManager groupExpansionManager, RowContentBindStage rowContentBindStage, - NotificationLogger notificationLogger, HeadsUpManager headsUpManager, + NotificationLogger notificationLogger, + HeadsUpManager headsUpManager, ExpandableNotificationRow.OnExpandClickListener onExpandClickListener, StatusBarStateController statusBarStateController, NotificationGutsManager notificationGutsManager, @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress, - OnUserInteractionCallback onUserInteractionCallback, FalsingManager falsingManager, + OnUserInteractionCallback onUserInteractionCallback, + FalsingManager falsingManager, PeopleNotificationIdentifier peopleNotificationIdentifier) { mView = view; mListContainer = listContainer; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java index 9bcac1163acc..c2c4590fa6cb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java @@ -42,17 +42,15 @@ import com.android.systemui.media.MediaDataManagerKt; import com.android.systemui.media.MediaFeatureFlag; import com.android.systemui.statusbar.InflationTask; import com.android.systemui.statusbar.NotificationRemoteInputManager; -import com.android.systemui.statusbar.SmartReplyController; import com.android.systemui.statusbar.notification.ConversationNotificationProcessor; import com.android.systemui.statusbar.notification.InflationException; import com.android.systemui.statusbar.notification.MediaNotificationProcessor; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper; import com.android.systemui.statusbar.phone.StatusBar; -import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.InflatedSmartReplies; import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions; -import com.android.systemui.statusbar.policy.SmartReplyConstants; +import com.android.systemui.statusbar.policy.SmartRepliesAndActionsInflater; import com.android.systemui.util.Assert; import java.util.HashMap; @@ -60,8 +58,6 @@ import java.util.concurrent.Executor; import javax.inject.Inject; -import dagger.Lazy; - /** * {@link NotificationContentInflater} binds content to a {@link ExpandableNotificationRow} by * asynchronously building the content's {@link RemoteViews} and applying it to the row. @@ -76,27 +72,24 @@ public class NotificationContentInflater implements NotificationRowContentBinder private final boolean mIsMediaInQS; private final NotificationRemoteInputManager mRemoteInputManager; private final NotifRemoteViewCache mRemoteViewCache; - private final Lazy mSmartReplyConstants; - private final Lazy mSmartReplyController; private final ConversationNotificationProcessor mConversationProcessor; private final Executor mBgExecutor; + private final SmartRepliesAndActionsInflater mSmartRepliesAndActionsInflater; @Inject NotificationContentInflater( NotifRemoteViewCache remoteViewCache, NotificationRemoteInputManager remoteInputManager, - Lazy smartReplyConstants, - Lazy smartReplyController, ConversationNotificationProcessor conversationProcessor, MediaFeatureFlag mediaFeatureFlag, - @Background Executor bgExecutor) { + @Background Executor bgExecutor, + SmartRepliesAndActionsInflater smartRepliesInflater) { mRemoteViewCache = remoteViewCache; mRemoteInputManager = remoteInputManager; - mSmartReplyConstants = smartReplyConstants; - mSmartReplyController = smartReplyController; mConversationProcessor = conversationProcessor; mIsMediaInQS = mediaFeatureFlag.getEnabled(); mBgExecutor = bgExecutor; + mSmartRepliesAndActionsInflater = smartRepliesInflater; } @Override @@ -132,8 +125,6 @@ public class NotificationContentInflater implements NotificationRowContentBinder contentToBind, mRemoteViewCache, entry, - mSmartReplyConstants.get(), - mSmartReplyController.get(), mConversationProcessor, row, bindParams.isLowPriority, @@ -141,7 +132,8 @@ public class NotificationContentInflater implements NotificationRowContentBinder bindParams.usesIncreasedHeadsUpHeight, callback, mRemoteInputManager.getRemoteViewsOnClickHandler(), - mIsMediaInQS); + mIsMediaInQS, + mSmartRepliesAndActionsInflater); if (mInflateSynchronously) { task.onPostExecute(task.doInBackground()); } else { @@ -157,17 +149,19 @@ public class NotificationContentInflater implements NotificationRowContentBinder boolean inflateSynchronously, @InflationFlag int reInflateFlags, Notification.Builder builder, - Context packageContext) { + Context packageContext, + SmartRepliesAndActionsInflater smartRepliesInflater) { InflationProgress result = createRemoteViews(reInflateFlags, builder, bindParams.isLowPriority, bindParams.usesIncreasedHeight, bindParams.usesIncreasedHeadsUpHeight, packageContext); + result = inflateSmartReplyViews(result, reInflateFlags, entry, - row.getContext(), packageContext, row.getHeadsUpManager(), - mSmartReplyConstants.get(), mSmartReplyController.get(), - row.getExistingSmartRepliesAndActions()); + row.getContext(), packageContext, + row.getExistingSmartRepliesAndActions(), + smartRepliesInflater); apply( mBgExecutor, @@ -268,22 +262,21 @@ public class NotificationContentInflater implements NotificationRowContentBinder } } - private static InflationProgress inflateSmartReplyViews(InflationProgress result, - @InflationFlag int reInflateFlags, NotificationEntry entry, Context context, - Context packageContext, HeadsUpManager headsUpManager, - SmartReplyConstants smartReplyConstants, SmartReplyController smartReplyController, - SmartRepliesAndActions previousSmartRepliesAndActions) { + private static InflationProgress inflateSmartReplyViews( + InflationProgress result, + @InflationFlag int reInflateFlags, + NotificationEntry entry, + Context context, + Context packageContext, + SmartRepliesAndActions previousSmartRepliesAndActions, + SmartRepliesAndActionsInflater inflater) { if ((reInflateFlags & FLAG_CONTENT_VIEW_EXPANDED) != 0 && result.newExpandedView != null) { - result.expandedInflatedSmartReplies = - InflatedSmartReplies.inflate( - context, packageContext, entry, smartReplyConstants, - smartReplyController, headsUpManager, previousSmartRepliesAndActions); + result.expandedInflatedSmartReplies = inflater.inflateSmartReplies( + context, packageContext, entry, previousSmartRepliesAndActions); } if ((reInflateFlags & FLAG_CONTENT_VIEW_HEADS_UP) != 0 && result.newHeadsUpView != null) { - result.headsUpInflatedSmartReplies = - InflatedSmartReplies.inflate( - context, packageContext, entry, smartReplyConstants, - smartReplyController, headsUpManager, previousSmartRepliesAndActions); + result.headsUpInflatedSmartReplies = inflater.inflateSmartReplies( + context, packageContext, entry, previousSmartRepliesAndActions); } return result; } @@ -709,8 +702,6 @@ public class NotificationContentInflater implements NotificationRowContentBinder private final boolean mUsesIncreasedHeadsUpHeight; private final @InflationFlag int mReInflateFlags; private final NotifRemoteViewCache mRemoteViewCache; - private final SmartReplyConstants mSmartReplyConstants; - private final SmartReplyController mSmartReplyController; private final Executor mBgExecutor; private ExpandableNotificationRow mRow; private Exception mError; @@ -718,6 +709,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder private CancellationSignal mCancellationSignal; private final ConversationNotificationProcessor mConversationProcessor; private final boolean mIsMediaInQS; + private final SmartRepliesAndActionsInflater mSmartRepliesInflater; private AsyncInflationTask( Executor bgExecutor, @@ -725,8 +717,6 @@ public class NotificationContentInflater implements NotificationRowContentBinder @InflationFlag int reInflateFlags, NotifRemoteViewCache cache, NotificationEntry entry, - SmartReplyConstants smartReplyConstants, - SmartReplyController smartReplyController, ConversationNotificationProcessor conversationProcessor, ExpandableNotificationRow row, boolean isLowPriority, @@ -734,15 +724,15 @@ public class NotificationContentInflater implements NotificationRowContentBinder boolean usesIncreasedHeadsUpHeight, InflationCallback callback, RemoteViews.OnClickHandler remoteViewClickHandler, - boolean isMediaFlagEnabled) { + boolean isMediaFlagEnabled, + SmartRepliesAndActionsInflater smartRepliesInflater) { mEntry = entry; mRow = row; - mSmartReplyConstants = smartReplyConstants; - mSmartReplyController = smartReplyController; mBgExecutor = bgExecutor; mInflateSynchronously = inflateSynchronously; mReInflateFlags = reInflateFlags; mRemoteViewCache = cache; + mSmartRepliesInflater = smartRepliesInflater; mContext = mRow.getContext(); mIsLowPriority = isLowPriority; mUsesIncreasedHeight = usesIncreasedHeight; @@ -786,10 +776,16 @@ public class NotificationContentInflater implements NotificationRowContentBinder InflationProgress inflationProgress = createRemoteViews(mReInflateFlags, recoveredBuilder, mIsLowPriority, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, packageContext); - return inflateSmartReplyViews(inflationProgress, mReInflateFlags, mEntry, - mRow.getContext(), packageContext, mRow.getHeadsUpManager(), - mSmartReplyConstants, mSmartReplyController, - mRow.getExistingSmartRepliesAndActions()); + SmartRepliesAndActions repliesAndActions = + mRow.getExistingSmartRepliesAndActions(); + return inflateSmartReplyViews( + inflationProgress, + mReInflateFlags, + mEntry, + mContext, + packageContext, + repliesAndActions, + mSmartRepliesInflater); } catch (Exception e) { mError = e; return null; 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 1de9308a40b1..8a644ed4d3ff 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 @@ -57,6 +57,7 @@ import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewW import com.android.systemui.statusbar.policy.InflatedSmartReplies; import com.android.systemui.statusbar.policy.InflatedSmartReplies.SmartRepliesAndActions; import com.android.systemui.statusbar.policy.RemoteInputView; +import com.android.systemui.statusbar.policy.SmartRepliesAndActionsInflaterKt; import com.android.systemui.statusbar.policy.SmartReplyConstants; import com.android.systemui.statusbar.policy.SmartReplyView; @@ -1191,23 +1192,31 @@ public class NotificationContentView extends FrameLayout { View bigContentView = mExpandedChild; if (bigContentView != null && (bigContentView instanceof ViewGroup)) { - mMediaTransferManager.applyMediaTransferView((ViewGroup) bigContentView, - entry); + mMediaTransferManager.applyMediaTransferView((ViewGroup) bigContentView, entry); } View smallContentView = mContractedChild; if (smallContentView != null && (smallContentView instanceof ViewGroup)) { - mMediaTransferManager.applyMediaTransferView((ViewGroup) smallContentView, - entry); + mMediaTransferManager.applyMediaTransferView((ViewGroup) smallContentView, entry); } } + /** + * Returns whether the {@link Notification} represented by entry has a free-form remote input. + * Such an input can be used e.g. to implement smart reply buttons - by passing the replies + * through the remote input. + */ + public static boolean hasFreeformRemoteInput(NotificationEntry entry) { + Notification notification = entry.getSbn().getNotification(); + return null != notification.findRemoteInputActionPair(true /* freeform */); + } + private void applyRemoteInputAndSmartReply(final NotificationEntry entry) { if (mRemoteInputController == null) { return; } - applyRemoteInput(entry, InflatedSmartReplies.hasFreeformRemoteInput(entry)); + applyRemoteInput(entry, hasFreeformRemoteInput(entry)); if (mExpandedInflatedSmartReplies == null && mHeadsUpInflatedSmartReplies == null) { if (DEBUG) { @@ -1438,7 +1447,8 @@ public class NotificationContentView extends FrameLayout { } LinearLayout smartReplyContainer = (LinearLayout) smartReplyContainerCandidate; - if (!InflatedSmartReplies.shouldShowSmartReplyView(entry, smartRepliesAndActions)) { + if (!SmartRepliesAndActionsInflaterKt + .shouldShowSmartReplyView(entry, smartRepliesAndActions)) { smartReplyContainer.setVisibility(View.GONE); return null; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java index c6ae669d5d08..cbc8405cc057 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplies.java @@ -19,27 +19,8 @@ package com.android.systemui.statusbar.policy; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Notification; -import android.app.RemoteInput; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ResolveInfo; -import android.os.Build; -import android.util.Log; -import android.util.Pair; import android.widget.Button; -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.ArrayUtils; -import com.android.systemui.Dependency; -import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.shared.system.DevicePolicyManagerWrapper; -import com.android.systemui.shared.system.PackageManagerWrapper; -import com.android.systemui.statusbar.NotificationUiAdjustment; -import com.android.systemui.statusbar.SmartReplyController; -import com.android.systemui.statusbar.notification.collection.NotificationEntry; - -import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -48,13 +29,11 @@ import java.util.List; * thread, to later be accessed and modified on the (performance critical) UI thread. */ public class InflatedSmartReplies { - private static final String TAG = "InflatedSmartReplies"; - private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); @Nullable private final SmartReplyView mSmartReplyView; @Nullable private final List