Use subcomponent to add Controller to ActivtableNotificationView

Right now, the controller does nothing. Follow up CL's will add
functionality to it. This CL is meant as a MVP starting point.

Bug: 147245740
Test: atest SystemUITests
Change-Id: I7772449ad7a27dbca079cb6a0100c5776a7261f9
This commit is contained in:
Dave Mankoff
2020-01-08 15:42:06 -05:00
parent 25e6dd3ed1
commit 56fe9e4290
12 changed files with 238 additions and 51 deletions

View File

@@ -33,6 +33,7 @@ import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder;
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl;
import com.android.systemui.statusbar.notification.people.PeopleHubModule;
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
import com.android.systemui.statusbar.phone.KeyguardLiftController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
@@ -56,7 +57,7 @@ import dagger.Provides;
@Module(includes = {AssistModule.class,
ConcurrencyModule.class,
PeopleHubModule.class},
subcomponents = {StatusBarComponent.class})
subcomponents = {StatusBarComponent.class, NotificationRowComponent.class})
public abstract class SystemUIModule {
@Binds

View File

@@ -21,6 +21,7 @@ import android.view.LayoutInflater;
import android.view.ViewGroup;
import com.android.systemui.R;
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
import com.android.systemui.statusbar.phone.LockIcon;
import com.android.systemui.statusbar.phone.NotificationPanelView;
import com.android.systemui.statusbar.phone.StatusBarWindowView;
@@ -38,15 +39,18 @@ public class SuperStatusBarViewFactory {
private final Context mContext;
private final InjectionInflationController mInjectionInflationController;
private final NotificationRowComponent.Builder mNotificationRowComponentBuilder;
private StatusBarWindowView mStatusBarWindowView;
private NotificationShelf mNotificationShelf;
@Inject
public SuperStatusBarViewFactory(Context context,
InjectionInflationController injectionInflationController) {
InjectionInflationController injectionInflationController,
NotificationRowComponent.Builder notificationRowComponentBuilder) {
mContext = context;
mInjectionInflationController = injectionInflationController;
mNotificationRowComponentBuilder = notificationRowComponentBuilder;
}
/**
@@ -90,6 +94,12 @@ public class SuperStatusBarViewFactory {
mNotificationShelf = (NotificationShelf) mInjectionInflationController.injectable(
LayoutInflater.from(mContext)).inflate(R.layout.status_bar_notification_shelf,
container, /* attachToRoot= */ false);
NotificationRowComponent component = mNotificationRowComponentBuilder
.activatableNotificationView(mNotificationShelf)
.build();
component.getActivatableNotificationViewController().init();
if (mNotificationShelf == null) {
throw new IllegalStateException(
"R.layout.status_bar_notification_shelf could not be properly inflated");

View File

@@ -41,9 +41,6 @@ import com.android.systemui.statusbar.notification.NotificationClicker;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.people.NotificationPersonExtractorPluginBoundary;
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier;
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifierImpl;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder;
@@ -52,13 +49,13 @@ import com.android.systemui.statusbar.notification.stack.NotificationListContain
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.ExtensionControllerImpl;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import java.util.Objects;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
/** Handles inflating and updating views for notifications. */
@@ -88,6 +85,7 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
private ExpandableNotificationRow.OnAppOpsClickListener mOnAppOpsClickListener;
private BindRowCallback mBindRowCallback;
private NotificationClicker mNotificationClicker;
private final Provider<RowInflaterTask> mRowInflaterTaskProvider;
private final NotificationLogger mNotificationLogger;
@Inject
@@ -102,6 +100,7 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
NotificationGroupManager notificationGroupManager,
NotificationGutsManager notificationGutsManager,
NotificationInterruptionStateProvider notificationInterruptionStateProvider,
Provider<RowInflaterTask> rowInflaterTaskProvider,
NotificationLogger logger) {
mContext = context;
mRowContentBinder = rowContentBinder;
@@ -114,6 +113,7 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
mGroupManager = notificationGroupManager;
mGutsManager = notificationGutsManager;
mNotificationInterruptionStateProvider = notificationInterruptionStateProvider;
mRowInflaterTaskProvider = rowInflaterTaskProvider;
mNotificationLogger = logger;
}
@@ -159,7 +159,7 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
entry.getRow().setOnDismissRunnable(onDismissRunnable);
} else {
entry.createIcons(mContext, sbn);
new RowInflaterTask().inflate(mContext, parent, entry,
mRowInflaterTaskProvider.get().inflate(mContext, parent, entry,
row -> {
bindRow(entry, pmUser, sbn, row, onDismissRunnable);
updateNotification(entry, pmUser, sbn, row);

View File

@@ -0,0 +1,47 @@
/*
* 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.row;
import android.view.accessibility.AccessibilityManager;
import com.android.systemui.plugins.FalsingManager;
import javax.inject.Inject;
/**
* Controller for {@link ActivatableNotificationView}
*/
public class ActivatableNotificationViewController {
private final ActivatableNotificationView mView;
private final AccessibilityManager mAccessibilityManager;
private final FalsingManager mFalsingManager;
@Inject
public ActivatableNotificationViewController(ActivatableNotificationView view,
AccessibilityManager accessibilityManager, FalsingManager falsingManager) {
mView = view;
mAccessibilityManager = accessibilityManager;
mFalsingManager = falsingManager;
}
/**
* Initialize the controller, setting up handlers and other behavior.
*/
public void init() {
}
}

View File

@@ -26,6 +26,9 @@ import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
import com.android.systemui.R;
import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
import javax.inject.Inject;
/**
* An inflater task that asynchronously inflates a ExpandableNotificationRow
@@ -34,12 +37,20 @@ public class RowInflaterTask implements InflationTask, AsyncLayoutInflater.OnInf
private static final String TAG = "RowInflaterTask";
private static final boolean TRACE_ORIGIN = true;
private final NotificationRowComponent.Builder mNotificationRowComponentBuilder;
private RowInflationFinishedListener mListener;
private NotificationEntry mEntry;
private boolean mCancelled;
private Throwable mInflateOrigin;
@Inject
public RowInflaterTask(
NotificationRowComponent.Builder notificationRowComponentBuilder) {
super();
mNotificationRowComponentBuilder = notificationRowComponentBuilder;
}
/**
* Inflates a new notificationView. This should not be called twice on this object
*/
@@ -64,6 +75,12 @@ public class RowInflaterTask implements InflationTask, AsyncLayoutInflater.OnInf
public void onInflateFinished(View view, int resid, ViewGroup parent) {
if (!mCancelled) {
try {
// Setup the controller for the view.
NotificationRowComponent component = mNotificationRowComponentBuilder
.activatableNotificationView((ActivatableNotificationView) view)
.build();
component.getActivatableNotificationViewController().init();
mEntry.onInflationTaskFinished();
mListener.onInflationFinished((ExpandableNotificationRow) view);
} catch (Throwable t) {

View File

@@ -0,0 +1,61 @@
/*
* 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.row.dagger;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationViewController;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import javax.inject.Scope;
import dagger.BindsInstance;
import dagger.Subcomponent;
/**
* Dagger subcomponent for Notification related views.
*/
@Subcomponent(modules = {})
@NotificationRowComponent.NotificationRowScope
public interface NotificationRowComponent {
/**
* Builder for {@link NotificationRowComponent}.
*/
@Subcomponent.Builder
interface Builder {
@BindsInstance
Builder activatableNotificationView(ActivatableNotificationView view);
NotificationRowComponent build();
}
/**
* Scope annotation for singleton items within the StatusBarComponent.
*/
@Documented
@Retention(RUNTIME)
@Scope
@interface NotificationRowScope {}
/**
* Creates a ActivatableNotificationViewController.
*/
@NotificationRowScope
ActivatableNotificationViewController getActivatableNotificationViewController();
}

View File

@@ -33,12 +33,14 @@ import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager;
import com.android.systemui.statusbar.notification.people.DataListener;
import com.android.systemui.statusbar.notification.people.PeopleHubSectionFooterViewAdapter;
import com.android.systemui.statusbar.notification.people.PeopleHubSectionFooterViewBoundary;
import com.android.systemui.statusbar.notification.people.PersonViewModel;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
@@ -46,6 +48,8 @@ import java.lang.annotation.Retention;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import kotlin.sequences.Sequence;
/**
@@ -59,11 +63,13 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section
private static final String TAG = "NotifSectionsManager";
private static final boolean DEBUG = false;
private final NotificationStackScrollLayout mParent;
private NotificationStackScrollLayout mParent;
private final ActivityStarter mActivityStarter;
private final StatusBarStateController mStatusBarStateController;
private final ConfigurationController mConfigurationController;
private final int mNumberOfSections;
private final NotificationSectionsFeatureManager mSectionsFeatureManager;
private final NotificationRowComponent.Builder mNotificationRowComponentBuilder;
private boolean mInitialized = false;
private SectionHeaderView mGentleHeader;
@@ -99,22 +105,25 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section
@Nullable private View.OnClickListener mOnClearGentleNotifsClickListener;
@Inject
NotificationSectionsManager(
NotificationStackScrollLayout parent,
ActivityStarter activityStarter,
StatusBarStateController statusBarStateController,
ConfigurationController configurationController,
PeopleHubSectionFooterViewAdapter peopleHubViewAdapter,
int numberOfSections) {
mParent = parent;
NotificationSectionsFeatureManager sectionsFeatureManager,
NotificationRowComponent.Builder notificationRowComponentBuilder) {
mActivityStarter = activityStarter;
mStatusBarStateController = statusBarStateController;
mConfigurationController = configurationController;
mPeopleHubViewAdapter = peopleHubViewAdapter;
mNumberOfSections = numberOfSections;
mSectionsFeatureManager = sectionsFeatureManager;
mNumberOfSections = mSectionsFeatureManager.getNumberOfBuckets();
mNotificationRowComponentBuilder = notificationRowComponentBuilder;
}
NotificationSection[] createSectionsForBuckets(int[] buckets) {
NotificationSection[] createSectionsForBuckets() {
int[] buckets = mSectionsFeatureManager.getNotificationBuckets();
NotificationSection[] sections = new NotificationSection[buckets.length];
for (int i = 0; i < buckets.length; i++) {
sections[i] = new NotificationSection(mParent, buckets[i] /* bucket */);
@@ -124,11 +133,13 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section
}
/** Must be called before use. */
void initialize(LayoutInflater layoutInflater) {
void initialize(
NotificationStackScrollLayout parent, LayoutInflater layoutInflater) {
if (mInitialized) {
throw new IllegalStateException("NotificationSectionsManager already initialized");
}
mInitialized = true;
mParent = parent;
reinflateViews(layoutInflater);
mPeopleHubViewAdapter.bindView(mPeopleHubViewBoundary);
mConfigurationController.addCallback(mConfigurationListener);
@@ -159,6 +170,11 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section
mGentleHeader = (SectionHeaderView) layoutInflater.inflate(
R.layout.status_bar_notification_section_header, mParent, false);
NotificationRowComponent sectionHeaderComponent = mNotificationRowComponentBuilder
.activatableNotificationView(mGentleHeader)
.build();
sectionHeaderComponent.getActivatableNotificationViewController().init();
mGentleHeader.setOnHeaderClickListener(this::onGentleHeaderClick);
mGentleHeader.setOnClearAllClickListener(this::onClearGentleNotifsClick);
@@ -169,6 +185,11 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section
mPeopleHubView = (PeopleHubView) layoutInflater.inflate(
R.layout.people_strip, mParent, false);
NotificationRowComponent notificationRowComponent = mNotificationRowComponentBuilder
.activatableNotificationView(mPeopleHubView)
.build();
notificationRowComponent.getActivatableNotificationViewController().init();
if (oldPeopleHubPos != -1) {
mParent.addView(mPeopleHubView, oldPeopleHubPos);
}

View File

@@ -88,7 +88,6 @@ import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.SwipeHelper;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem;
@@ -109,14 +108,12 @@ import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.FakeShadowView;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager;
import com.android.systemui.statusbar.notification.NotificationUtils;
import com.android.systemui.statusbar.notification.ShadeViewRefactor;
import com.android.systemui.statusbar.notification.ShadeViewRefactor.RefactorComponent;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.people.PeopleHubSectionFooterViewAdapter;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
@@ -512,17 +509,14 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
@Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress,
NotificationRoundnessManager notificationRoundnessManager,
DynamicPrivacyController dynamicPrivacyController,
ConfigurationController configurationController,
ActivityStarter activityStarter,
StatusBarStateController statusBarStateController,
SysuiStatusBarStateController statusBarStateController,
HeadsUpManagerPhone headsUpManager,
KeyguardBypassController keyguardBypassController,
FalsingManager falsingManager,
NotificationLockscreenUserManager notificationLockscreenUserManager,
NotificationGutsManager notificationGutsManager,
NotificationSectionsFeatureManager sectionsFeatureManager,
PeopleHubSectionFooterViewAdapter peopleHubViewAdapter,
ZenModeController zenController) {
ZenModeController zenController,
NotificationSectionsManager notificationSectionsManager) {
super(context, attrs, 0, 0);
Resources res = getResources();
@@ -539,22 +533,14 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
mFalsingManager = falsingManager;
mZenController = zenController;
int[] buckets = sectionsFeatureManager.getNotificationBuckets();
mSectionsManager =
new NotificationSectionsManager(
this,
activityStarter,
statusBarStateController,
configurationController,
peopleHubViewAdapter,
buckets.length);
mSectionsManager.initialize(LayoutInflater.from(context));
mSectionsManager = notificationSectionsManager;
mSectionsManager.initialize(this, LayoutInflater.from(context));
mSectionsManager.setOnClearGentleNotifsClickListener(v -> {
// Leave the shade open if there will be other notifs left over to clear
final boolean closeShade = !hasActiveClearableNotifications(ROWS_HIGH_PRIORITY);
clearNotifications(ROWS_GENTLE, closeShade);
});
mSections = mSectionsManager.createSectionsForBuckets(buckets);
mSections = mSectionsManager.createSectionsForBuckets();
mAmbientState = new AmbientState(context, mSectionsManager, mHeadsUpManager);
mBgColor = context.getColor(R.color.notification_shade_background_color);
@@ -617,7 +603,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
});
dynamicPrivacyController.addListener(this);
mDynamicPrivacyController = dynamicPrivacyController;
mStatusbarStateController = (SysuiStatusBarStateController) statusBarStateController;
mStatusbarStateController = statusBarStateController;
}
private void updateDismissRtlSetting(boolean dismissRtl) {

View File

@@ -70,7 +70,9 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationFilter;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
@@ -151,6 +153,8 @@ public class BubbleControllerTest extends SysuiTestCase {
private ShadeController mShadeController;
@Mock
private RemoteInputUriController mRemoteInputUriController;
@Mock
private NotificationRowComponent mNotificationRowComponent;
private SuperStatusBarViewFactory mSuperStatusBarViewFactory;
private BubbleData mBubbleData;
@@ -167,7 +171,19 @@ public class BubbleControllerTest extends SysuiTestCase {
when(mColorExtractor.getNeutralColors()).thenReturn(mGradientColors);
mSuperStatusBarViewFactory = new SuperStatusBarViewFactory(mContext,
new InjectionInflationController(SystemUIFactory.getInstance().getRootComponent()));
new InjectionInflationController(SystemUIFactory.getInstance().getRootComponent()),
new NotificationRowComponent.Builder() {
@Override
public NotificationRowComponent.Builder activatableNotificationView(
ActivatableNotificationView view) {
return this;
}
@Override
public NotificationRowComponent build() {
return mNotificationRowComponent;
}
});
// Bubbles get added to status bar window view
mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager,

View File

@@ -83,12 +83,14 @@ import com.android.systemui.statusbar.notification.collection.provider.HighPrior
import com.android.systemui.statusbar.notification.logging.NotifLog;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationViewController;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotifRemoteViewCache;
import com.android.systemui.statusbar.notification.row.NotificationContentInflater;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder;
import com.android.systemui.statusbar.notification.row.RowInflaterTask;
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
@@ -139,6 +141,8 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
@Mock private NotifLog mNotifLog;
@Mock private FeatureFlags mFeatureFlags;
@Mock private LeakDetector mLeakDetector;
@Mock private ActivatableNotificationViewController mActivatableNotificationViewController;
@Mock private NotificationRowComponent.Builder mNotificationRowComponentBuilder;
private int mId;
private NotificationEntry mEntry;
@@ -207,6 +211,10 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
mock(NotifRemoteViewCache.class),
mRemoteInputManager);
when(mNotificationRowComponentBuilder.activatableNotificationView(any()))
.thenReturn(mNotificationRowComponentBuilder);
when(mNotificationRowComponentBuilder.build()).thenReturn(
() -> mActivatableNotificationViewController);
NotificationRowBinderImpl notificationRowBinder =
new NotificationRowBinderImpl(mContext,
mRemoteInputManager,
@@ -218,6 +226,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase {
mGroupManager,
mGutsManager,
mNotificationInterruptionStateProvider,
() -> new RowInflaterTask(mNotificationRowComponentBuilder),
mock(NotificationLogger.class));
when(mFeatureFlags.isNewNotifPipelineEnabled()).thenReturn(false);

View File

@@ -44,8 +44,12 @@ import com.android.systemui.ActivityStarterDelegate;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager;
import com.android.systemui.statusbar.notification.people.PeopleHubSectionFooterViewAdapter;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationViewController;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
import com.android.systemui.statusbar.policy.ConfigurationController;
import org.junit.Before;
@@ -58,7 +62,7 @@ import org.mockito.junit.MockitoRule;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@TestableLooper.RunWithLooper(setAsMainLooper = true)
public class NotificationSectionsManagerTest extends SysuiTestCase {
@Rule public final MockitoRule mockitoRule = MockitoJUnit.rule();
@@ -68,30 +72,47 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
@Mock private StatusBarStateController mStatusBarStateController;
@Mock private ConfigurationController mConfigurationController;
@Mock private PeopleHubSectionFooterViewAdapter mPeopleHubAdapter;
@Mock private NotificationSectionsFeatureManager mSectionsFeatureManager;
@Mock private NotificationRowComponent mNotificationRowComponent;
@Mock private ActivatableNotificationViewController mActivatableNotificationViewController;
private NotificationSectionsManager mSectionsManager;
@Before
public void setUp() {
when(mSectionsFeatureManager.getNumberOfBuckets()).thenReturn(2);
when(mNotificationRowComponent.getActivatableNotificationViewController()).thenReturn(
mActivatableNotificationViewController
);
mSectionsManager =
new NotificationSectionsManager(
mNssl,
mActivityStarterDelegate,
mStatusBarStateController,
mConfigurationController,
mPeopleHubAdapter,
2);
mSectionsFeatureManager,
new NotificationRowComponent.Builder() {
@Override
public NotificationRowComponent.Builder activatableNotificationView(
ActivatableNotificationView view) {
return this;
}
@Override
public NotificationRowComponent build() {
return mNotificationRowComponent;
}});
// Required in order for the header inflation to work properly
when(mNssl.generateLayoutParams(any(AttributeSet.class)))
.thenReturn(new ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
mSectionsManager.initialize(LayoutInflater.from(mContext));
mSectionsManager.initialize(mNssl, LayoutInflater.from(mContext));
when(mNssl.indexOfChild(any(View.class))).thenReturn(-1);
when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
}
@Test(expected = IllegalStateException.class)
public void testDuplicateInitializeThrows() {
mSectionsManager.initialize(LayoutInflater.from(mContext));
mSectionsManager.initialize(mNssl, LayoutInflater.from(mContext));
}
@Test

View File

@@ -46,7 +46,6 @@ import androidx.test.filters.SmallTest;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.systemui.ActivityStarterDelegate;
import com.android.systemui.ExpandHelper;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
@@ -74,7 +73,6 @@ import com.android.systemui.statusbar.notification.collection.NotificationRankin
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder;
import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
import com.android.systemui.statusbar.notification.logging.NotifLog;
import com.android.systemui.statusbar.notification.people.PeopleHubSectionFooterViewAdapter;
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.FooterView;
@@ -87,9 +85,7 @@ import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.util.DeviceConfigProxyFake;
import com.android.systemui.util.leak.LeakDetector;
import org.junit.After;
@@ -132,6 +128,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
@Mock private NotificationRoundnessManager mNotificationRoundnessManager;
@Mock private KeyguardBypassController mKeyguardBypassController;
@Mock private ZenModeController mZenModeController;
@Mock private NotificationSectionsManager mNotificationSectionsManager;
@Mock private NotificationSection mNotificationSection;
private TestableNotificationEntryManager mEntryManager;
private int mOriginalInterruptionModelSetting;
@@ -181,7 +179,10 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
NotificationShelf notificationShelf = mock(NotificationShelf.class);
when(mNotificationSectionsManager.createSectionsForBuckets()).thenReturn(
new NotificationSection[]{
mNotificationSection
});
// The actual class under test. You may need to work with this class directly when
// testing anonymous class members of mStackScroller, like mMenuEventListener,
// which refer to members of NotificationStackScrollLayout. The spy
@@ -190,17 +191,14 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
mStackScrollerInternal = new NotificationStackScrollLayout(getContext(), null,
true /* allowLongPress */, mNotificationRoundnessManager,
mock(DynamicPrivacyController.class),
mock(ConfigurationController.class),
mock(ActivityStarterDelegate.class),
mock(SysuiStatusBarStateController.class),
mHeadsUpManager,
mKeyguardBypassController,
new FalsingManagerFake(),
mock(NotificationLockscreenUserManager.class),
mock(NotificationGutsManager.class),
new NotificationSectionsFeatureManager(new DeviceConfigProxyFake(), mContext),
mock(PeopleHubSectionFooterViewAdapter.class),
mZenModeController);
mZenModeController,
mNotificationSectionsManager);
mStackScroller = spy(mStackScrollerInternal);
mStackScroller.setShelf(notificationShelf);
mStackScroller.setStatusBar(mBar);