diff options
17 files changed, 408 insertions, 29 deletions
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationEntryManager.java b/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationEntryManager.java index ed945e7d4e72..f7802d205a3a 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationEntryManager.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/CarNotificationEntryManager.java @@ -18,6 +18,7 @@ package com.android.systemui.car; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationRankingManager; import com.android.systemui.statusbar.notification.logging.NotifLog; @@ -40,8 +41,9 @@ public class CarNotificationEntryManager extends NotificationEntryManager { NotifLog notifLog, NotificationGroupManager groupManager, NotificationRankingManager rankingManager, - KeyguardEnvironment keyguardEnvironment) { - super(notifLog, groupManager, rankingManager, keyguardEnvironment); + KeyguardEnvironment keyguardEnvironment, + FeatureFlags featureFlags) { + super(notifLog, groupManager, rankingManager, keyguardEnvironment, featureFlags); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java index 8d10552332ba..53a23b89f943 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java @@ -20,7 +20,6 @@ import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME; import android.app.INotificationManager; import android.content.Context; -import android.content.pm.IPackageManager; import android.hardware.display.AmbientDisplayConfiguration; import android.hardware.display.NightDisplayListener; import android.os.Handler; @@ -115,13 +114,6 @@ public class DependencyProvider { /** */ @Singleton @Provides - public IPackageManager provideIPackageManager() { - return IPackageManager.Stub.asInterface(ServiceManager.getService("package")); - } - - /** */ - @Singleton - @Provides public LayoutInflater providerLayoutInflater(Context context) { return LayoutInflater.from(context); } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java index bb12b53fec4c..26337b1f24b1 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemServicesModule.java @@ -27,6 +27,7 @@ import android.app.NotificationManager; import android.app.WallpaperManager; import android.app.admin.DevicePolicyManager; import android.content.Context; +import android.content.pm.IPackageManager; import android.content.res.Resources; import android.hardware.SensorPrivacyManager; import android.os.Handler; @@ -123,6 +124,13 @@ public class SystemServicesModule { return WindowManagerGlobal.getWindowManagerService(); } + /** */ + @Singleton + @Provides + public IPackageManager provideIPackageManager() { + return IPackageManager.Stub.asInterface(ServiceManager.getService("package")); + } + @Singleton @Provides static KeyguardManager provideKeyguardManager(Context context) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java index 2005d794c9d3..ac05c53c38dd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java @@ -40,7 +40,7 @@ import javax.inject.Singleton; * You will probably need to restart systemui for the changes to be picked up: * * {@code - * $ adb shell am crash com.android.systemui + * $ adb shell am restart com.android.systemui * } */ @Singleton @@ -59,6 +59,11 @@ public class FeatureFlags { return getDeviceConfigFlag("notification.newpipeline.enabled", false); } + public boolean isNewNotifPipelineRenderingEnabled() { + return isNewNotifPipelineEnabled() + && getDeviceConfigFlag("notification.newpipeline.rendering", false); + } + private void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) { synchronized (mCachedDeviceConfigFlags) { for (String key : properties.getKeyset()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java index 33d97a150048..f5b09f901580 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java @@ -34,6 +34,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.Dependency; import com.android.systemui.Dumpable; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.NotificationLifetimeExtender; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationListener.NotificationHandler; @@ -131,6 +132,7 @@ public class NotificationEntryManager implements private final KeyguardEnvironment mKeyguardEnvironment; private final NotificationGroupManager mGroupManager; private final NotificationRankingManager mRankingManager; + private final FeatureFlags mFeatureFlags; private NotificationPresenter mPresenter; private RankingMap mLatestRankingMap; @@ -170,11 +172,13 @@ public class NotificationEntryManager implements NotifLog notifLog, NotificationGroupManager groupManager, NotificationRankingManager rankingManager, - KeyguardEnvironment keyguardEnvironment) { + KeyguardEnvironment keyguardEnvironment, + FeatureFlags featureFlags) { mNotifLog = notifLog; mGroupManager = groupManager; mRankingManager = rankingManager; mKeyguardEnvironment = keyguardEnvironment; + mFeatureFlags = featureFlags; } /** Once called, the NEM will start processing notification events from system server. */ @@ -529,9 +533,12 @@ public class NotificationEntryManager implements NotificationEntry entry = new NotificationEntry(notification, ranking); Dependency.get(LeakDetector.class).trackInstance(entry); + // Construct the expanded view. - requireBinder().inflateViews(entry, () -> performRemoveNotification(notification, - REASON_CANCEL)); + if (!mFeatureFlags.isNewNotifPipelineRenderingEnabled()) { + requireBinder().inflateViews(entry, () -> performRemoveNotification(notification, + REASON_CANCEL)); + } abortExistingInflation(key, "addNotification"); mPendingNotifications.put(key, entry); @@ -574,8 +581,11 @@ public class NotificationEntryManager implements listener.onPreEntryUpdated(entry); } - requireBinder().inflateViews(entry, () -> performRemoveNotification(notification, - REASON_CANCEL)); + if (!mFeatureFlags.isNewNotifPipelineRenderingEnabled()) { + requireBinder().inflateViews(entry, () -> performRemoveNotification(notification, + REASON_CANCEL)); + } + updateNotifications("updateNotificationInternal"); if (DEBUG) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifInflater.java new file mode 100644 index 000000000000..fc04827a9d6a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifInflater.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2020 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.collection; +import com.android.systemui.statusbar.notification.collection.coordinator.PreparationCoordinator; + +/** + * Used by the {@link PreparationCoordinator}. When notifications are added or updated, the + * NotifInflater is asked to (re)inflated and prepare their views. This inflation occurs off the + * main thread. When the inflation is finished, NotifInflater will trigger its InflationCallback. + */ +public interface NotifInflater { + + /** + * Callback used when inflation is finished. + */ + void setInflationCallback(InflationCallback callback); + + /** + * Called to rebind the entry's views. + */ + void rebindViews(NotificationEntry entry); + + /** + * Called to inflate the views of an entry. Views are not considered inflated until all of its + * views are bound. Once all views are inflated, the InflationCallback is triggered. + */ + void inflateViews(NotificationEntry entry); + + /** + * Request to stop the inflation of an entry. For example, called when a notification is + * removed and no longer needs to be inflated. + */ + void abortInflation(NotificationEntry entry); + + /** + * Callback once all the views are inflated and bound for a given NotificationEntry. + */ + interface InflationCallback { + void onInflationFinished(NotificationEntry entry); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifInflaterImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifInflaterImpl.java new file mode 100644 index 000000000000..111ff980680c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifInflaterImpl.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2020 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.collection; + +import static android.service.notification.NotificationStats.DISMISS_SENTIMENT_NEUTRAL; + +import android.os.RemoteException; +import android.service.notification.NotificationStats; +import android.service.notification.StatusBarNotification; + +import com.android.internal.statusbar.IStatusBarService; +import com.android.internal.statusbar.NotificationVisibility; +import com.android.systemui.statusbar.notification.InflationException; +import com.android.systemui.statusbar.notification.logging.NotificationLogger; +import com.android.systemui.statusbar.notification.row.NotificationContentInflater; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Handles notification inflating, rebinding, and inflation aborting. + * + * Currently a wrapper for NotificationRowBinderImpl which requires some TLC. + */ +@Singleton +public class NotifInflaterImpl implements NotifInflater { + + private final IStatusBarService mStatusBarService; + private final NotifCollection mNotifCollection; + + private NotificationRowBinderImpl mNotificationRowBinder; + private InflationCallback mExternalInflationCallback; + + @Inject + public NotifInflaterImpl( + IStatusBarService statusBarService, + NotifCollection notifCollection) { + mStatusBarService = statusBarService; + mNotifCollection = notifCollection; + } + + /** + * Attaches the row binder for inflation. + */ + public void setRowBinder(NotificationRowBinderImpl rowBinder) { + mNotificationRowBinder = rowBinder; + requireBinder().setInflationCallback(mInflationCallback); + } + + @Override + public void setInflationCallback(InflationCallback callback) { + mExternalInflationCallback = callback; + } + + @Override + public void rebindViews(NotificationEntry entry) { + inflateViews(entry); + } + + /** + * Called to inflate the views of an entry. Views are not considered inflated until all of its + * views are bound. + */ + @Override + public void inflateViews(NotificationEntry entry) { + try { + requireBinder().inflateViews(entry, getDismissCallback(entry)); + } catch (InflationException e) { + // logged in the inflation callback + } + } + + @Override + public void abortInflation(NotificationEntry entry) { + entry.abortTask(); + } + + private Runnable getDismissCallback(NotificationEntry entry) { + return new Runnable() { + @Override + public void run() { + int dismissalSurface = NotificationStats.DISMISSAL_SHADE; + /** + * TODO: determine dismissal surface (ie: shade / headsup / aod) + * see {@link NotificationLogger#logNotificationClear} + */ + mNotifCollection.dismissNotification( + entry, + 0, + new DismissedByUserStats( + dismissalSurface, + DISMISS_SENTIMENT_NEUTRAL, + NotificationVisibility.obtain(entry.getKey(), + entry.getRanking().getRank(), + mNotifCollection.getNotifs().size(), + true, + NotificationLogger.getNotificationLocation(entry)) + )); + } + }; + } + + private NotificationRowBinderImpl requireBinder() { + if (mNotificationRowBinder == null) { + throw new RuntimeException("NotificationRowBinder must be attached before using " + + "NotifInflaterImpl."); + } + return mNotificationRowBinder; + } + + private final NotificationContentInflater.InflationCallback mInflationCallback = + new NotificationContentInflater.InflationCallback() { + @Override + public void handleInflationException( + StatusBarNotification sbn, + Exception e) { + try { + // report notification inflation errors back up + // to notification delegates + mStatusBarService.onNotificationError( + sbn.getPackageName(), + sbn.getTag(), + sbn.getId(), + sbn.getUid(), + sbn.getInitialPid(), + e.getMessage(), + sbn.getUserId()); + } catch (RemoteException ex) { + } + } + + @Override + public void onAsyncInflationFinished( + NotificationEntry entry, + int inflatedFlags) { + if (mExternalInflationCallback != null) { + mExternalInflationCallback.onInflationFinished(entry); + } + } + }; +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java index 6c93618e5395..6dc647d33046 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java @@ -109,16 +109,18 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { public void setUpWithPresenter(NotificationPresenter presenter, NotificationListContainer listContainer, HeadsUpManager headsUpManager, - NotificationContentInflater.InflationCallback inflationCallback, BindRowCallback bindRowCallback) { mPresenter = presenter; mListContainer = listContainer; mHeadsUpManager = headsUpManager; - mInflationCallback = inflationCallback; mBindRowCallback = bindRowCallback; mOnAppOpsClickListener = mGutsManager::openGuts; } + public void setInflationCallback(NotificationContentInflater.InflationCallback callback) { + mInflationCallback = callback; + } + public void setNotificationClicker(NotificationClicker clicker) { mNotificationClicker = clicker; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java index 132471933bb2..eeb54abf92b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.notification.collection.coordinator; import com.android.systemui.Dumpable; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.notification.collection.NotifCollection; import com.android.systemui.statusbar.notification.collection.NotifCollectionListener; import com.android.systemui.statusbar.notification.collection.NotifLifetimeExtender; @@ -45,14 +46,19 @@ public class NotifCoordinators implements Dumpable { */ @Inject public NotifCoordinators( + FeatureFlags featureFlags, KeyguardCoordinator keyguardCoordinator, RankingCoordinator rankingCoordinator, ForegroundCoordinator foregroundCoordinator, - DeviceProvisionedCoordinator deviceProvisionedCoordinator) { + DeviceProvisionedCoordinator deviceProvisionedCoordinator, + PreparationCoordinator preparationCoordinator) { mCoordinators.add(keyguardCoordinator); mCoordinators.add(rankingCoordinator); mCoordinators.add(foregroundCoordinator); mCoordinators.add(deviceProvisionedCoordinator); + if (featureFlags.isNewNotifPipelineRenderingEnabled()) { + mCoordinators.add(preparationCoordinator); + } // TODO: add new Coordinators here! (b/145134683, b/112656837) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java new file mode 100644 index 000000000000..b52f0fe1dd2e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2020 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.collection.coordinator; + +import com.android.systemui.statusbar.notification.collection.NotifCollection; +import com.android.systemui.statusbar.notification.collection.NotifCollectionListener; +import com.android.systemui.statusbar.notification.collection.NotifInflater; +import com.android.systemui.statusbar.notification.collection.NotifInflaterImpl; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.listbuilder.NotifListBuilder; +import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; +import com.android.systemui.statusbar.notification.logging.NotifEvent; +import com.android.systemui.statusbar.notification.logging.NotifLog; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Kicks off notification inflation and view rebinding when a notification is added or updated. + * Aborts inflation when a notification is removed. + * + * If a notification is not done inflating, this coordinator will filter the notification out + * from the NotifListBuilder. + */ +@Singleton +public class PreparationCoordinator implements Coordinator { + private static final String TAG = "PreparationCoordinator"; + + private final NotifLog mNotifLog; + private final NotifInflater mNotifInflater; + private final List<NotificationEntry> mPendingNotifications = new ArrayList<>(); + + @Inject + public PreparationCoordinator(NotifLog notifLog, NotifInflaterImpl notifInflater) { + mNotifLog = notifLog; + mNotifInflater = notifInflater; + mNotifInflater.setInflationCallback(mInflationCallback); + } + + @Override + public void attach(NotifCollection notifCollection, NotifListBuilder notifListBuilder) { + notifCollection.addCollectionListener(mNotifCollectionListener); + notifListBuilder.addPreRenderFilter(mNotifFilter); + } + + private final NotifCollectionListener mNotifCollectionListener = new NotifCollectionListener() { + @Override + public void onEntryAdded(NotificationEntry entry) { + inflateEntry(entry, "entryAdded"); + } + + @Override + public void onEntryUpdated(NotificationEntry entry) { + rebind(entry, "entryUpdated"); + } + + @Override + public void onEntryRemoved(NotificationEntry entry, int reason, boolean removedByUser) { + abortInflation(entry, "entryRemoved reason=" + reason); + } + }; + + private final NotifFilter mNotifFilter = new NotifFilter(TAG) { + @Override + public boolean shouldFilterOut(NotificationEntry entry, long now) { + return mPendingNotifications.contains(entry); + } + }; + + private final NotifInflater.InflationCallback mInflationCallback = + new NotifInflater.InflationCallback() { + @Override + public void onInflationFinished(NotificationEntry entry) { + mNotifLog.log(NotifEvent.INFLATED, entry); + mPendingNotifications.remove(entry); + mNotifFilter.invalidateList(); + } + }; + + private void inflateEntry(NotificationEntry entry, String reason) { + abortInflation(entry, reason); + mPendingNotifications.add(entry); + mNotifInflater.inflateViews(entry); + } + + private void rebind(NotificationEntry entry, String reason) { + mNotifInflater.rebindViews(entry); + } + + private void abortInflation(NotificationEntry entry, String reason) { + mNotifLog.log(NotifEvent.INFLATION_ABORTED, reason); + entry.abortTask(); + mPendingNotifications.remove(entry); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/init/NewNotifPipeline.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/init/NewNotifPipeline.java index 5e0bd4fdcf23..8d3d0ff43deb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/init/NewNotifPipeline.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/init/NewNotifPipeline.java @@ -20,9 +20,12 @@ import android.util.Log; import com.android.systemui.DumpController; import com.android.systemui.Dumpable; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.notification.collection.NotifCollection; +import com.android.systemui.statusbar.notification.collection.NotifInflaterImpl; import com.android.systemui.statusbar.notification.collection.NotifListBuilderImpl; +import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl; import com.android.systemui.statusbar.notification.collection.coordinator.NotifCoordinators; import com.android.systemui.statusbar.notification.collection.notifcollection.GroupCoalescer; @@ -41,7 +44,9 @@ public class NewNotifPipeline implements Dumpable { private final NotifCollection mNotifCollection; private final NotifListBuilderImpl mNotifPipeline; private final NotifCoordinators mNotifPluggableCoordinators; + private final NotifInflaterImpl mNotifInflater; private final DumpController mDumpController; + private final FeatureFlags mFeatureFlags; private final FakePipelineConsumer mFakePipelineConsumer = new FakePipelineConsumer(); @@ -51,20 +56,30 @@ public class NewNotifPipeline implements Dumpable { NotifCollection notifCollection, NotifListBuilderImpl notifPipeline, NotifCoordinators notifCoordinators, - DumpController dumpController) { + NotifInflaterImpl notifInflater, + DumpController dumpController, + FeatureFlags featureFlags) { mGroupCoalescer = groupCoalescer; mNotifCollection = notifCollection; mNotifPipeline = notifPipeline; mNotifPluggableCoordinators = notifCoordinators; mDumpController = dumpController; + mNotifInflater = notifInflater; + mFeatureFlags = featureFlags; } /** Hooks the new pipeline up to NotificationManager */ public void initialize( - NotificationListener notificationService) { + NotificationListener notificationService, + NotificationRowBinderImpl rowBinder) { mDumpController.registerDumpable("NotifPipeline", this); + // Setup inflation + if (mFeatureFlags.isNewNotifPipelineRenderingEnabled()) { + mNotifInflater.setRowBinder(rowBinder); + } + // Wire up coordinators mFakePipelineConsumer.attach(mNotifPipeline); mNotifPluggableCoordinators.attach(mNotifCollection, mNotifPipeline); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java index 3e1b5bd0571e..89e5f5596291 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java @@ -294,6 +294,9 @@ public class NotificationLogger implements StateListener { } } + /** + * Logs Notification inflation error + */ private void logNotificationError( StatusBarNotification notification, Exception exception) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 277a7613aafb..ccc86b1f8c5f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1272,7 +1272,11 @@ public class StatusBar extends SystemUI implements DemoMode, mGutsManager.setNotificationActivityStarter(mNotificationActivityStarter); - mEntryManager.setRowBinder(rowBinder); + if (!mFeatureFlags.isNewNotifPipelineRenderingEnabled()) { + mEntryManager.setRowBinder(rowBinder); + rowBinder.setInflationCallback(mEntryManager); + } + mRemoteInputUriController.attach(mEntryManager); rowBinder.setNotificationClicker(new NotificationClicker( @@ -1282,7 +1286,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationListController.bind(); if (mFeatureFlags.isNewNotifPipelineEnabled()) { - mNewNotifPipeline.get().initialize(mNotificationListener); + mNewNotifPipeline.get().initialize(mNotificationListener, rowBinder); } mEntryManager.attach(mNotificationListener); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java index 0fd0dabbc3f2..12a65169e1df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java @@ -217,7 +217,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, mEntryManager.addNotificationLifetimeExtenders( remoteInputManager.getLifetimeExtenders()); notificationRowBinder.setUpWithPresenter(this, notifListContainer, mHeadsUpManager, - mEntryManager, this); + this); mNotificationInterruptionStateProvider.setUpWithPresenter( this, mHeadsUpManager, this::canHeadsUp); mLockscreenUserManager.setUpWithPresenter(this); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java index f55ea4ff8ef2..c559265d28c9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java @@ -65,6 +65,7 @@ import com.android.systemui.ForegroundServiceController; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.NotificationLifetimeExtender; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -143,6 +144,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase { @Mock private RowInflaterTask mAsyncInflationTask; @Mock private NotificationRowBinder mMockedRowBinder; @Mock private NotifLog mNotifLog; + @Mock private FeatureFlags mFeatureFlags; private int mId; private NotificationEntry mEntry; @@ -219,6 +221,8 @@ public class NotificationEntryManagerTest extends SysuiTestCase { mEntry.expandedIcon = mock(StatusBarIconView.class); + when(mFeatureFlags.isNewNotifPipelineEnabled()).thenReturn(false); + when(mFeatureFlags.isNewNotifPipelineRenderingEnabled()).thenReturn(false); mEntryManager = new TestableNotificationEntryManager( mNotifLog, mGroupManager, @@ -230,7 +234,8 @@ public class NotificationEntryManagerTest extends SysuiTestCase { mNotifLog, mock(NotificationSectionsFeatureManager.class), mock(PeopleNotificationIdentifier.class)), - mEnvironment + mEnvironment, + mFeatureFlags ); mEntryManager.setUpWithPresenter(mPresenter, mListContainer, mHeadsUpManager); mEntryManager.addNotificationEntryListener(mEntryListener); @@ -242,7 +247,8 @@ public class NotificationEntryManagerTest extends SysuiTestCase { mock(StatusBarStateController.class), mock(NotificationLogger.class)); notificationRowBinder.setUpWithPresenter( - mPresenter, mListContainer, mHeadsUpManager, mEntryManager, mBindCallback); + mPresenter, mListContainer, mHeadsUpManager, mBindCallback); + notificationRowBinder.setInflationCallback(mEntryManager); notificationRowBinder.setNotificationClicker(mock(NotificationClicker.class)); mEntryManager.setRowBinder(notificationRowBinder); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/TestableNotificationEntryManager.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/TestableNotificationEntryManager.kt index 34beefe9843b..1afee120e495 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/TestableNotificationEntryManager.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/TestableNotificationEntryManager.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.notification +import com.android.systemui.statusbar.FeatureFlags import com.android.systemui.statusbar.NotificationPresenter import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationRankingManager @@ -33,8 +34,9 @@ class TestableNotificationEntryManager( log: NotifLog, gm: NotificationGroupManager, rm: NotificationRankingManager, - ke: KeyguardEnvironment -) : NotificationEntryManager(log, gm, rm, ke) { + ke: KeyguardEnvironment, + ff: FeatureFlags +) : NotificationEntryManager(log, gm, rm, ke, ff) { public var countDownLatch: CountDownLatch = CountDownLatch(1) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 77a6a2602d8e..39f037cfa70d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -53,6 +53,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.statusbar.EmptyShadeView; +import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationPresenter; @@ -166,7 +167,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { mock(NotificationSectionsFeatureManager.class), mock(PeopleNotificationIdentifier.class) ), - mock(NotificationEntryManager.KeyguardEnvironment.class)); + mock(NotificationEntryManager.KeyguardEnvironment.class), + mock(FeatureFlags.class)); mDependency.injectTestDependency(NotificationEntryManager.class, mEntryManager); mEntryManager.setUpForTest(mock(NotificationPresenter.class), null, mHeadsUpManager); |