Merge "Remove non-flag specific code from FeatureFlags."
This commit is contained in:
@@ -18,8 +18,6 @@ package com.android.systemui.flags;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.FeatureFlagUtils;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.systemui.dagger.SysUISingleton;
|
||||
|
||||
@@ -33,12 +31,10 @@ import javax.inject.Inject;
|
||||
@SysUISingleton
|
||||
public class FeatureFlags {
|
||||
private final FlagReader mFlagReader;
|
||||
private final Context mContext;
|
||||
|
||||
@Inject
|
||||
public FeatureFlags(FlagReader flagReader, Context context) {
|
||||
public FeatureFlags(FlagReader flagReader) {
|
||||
mFlagReader = flagReader;
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -49,22 +45,6 @@ public class FeatureFlags {
|
||||
return mFlagReader.isEnabled(flag);
|
||||
}
|
||||
|
||||
public void assertLegacyPipelineEnabled() {
|
||||
if (isNewNotifPipelineRenderingEnabled()) {
|
||||
throw new IllegalStateException("Old pipeline code running w/ new pipeline enabled");
|
||||
}
|
||||
}
|
||||
|
||||
public boolean checkLegacyPipelineEnabled() {
|
||||
if (!isNewNotifPipelineRenderingEnabled()) {
|
||||
return true;
|
||||
}
|
||||
Log.d("NotifPipeline", "Old pipeline code running w/ new pipeline enabled",
|
||||
new Exception());
|
||||
Toast.makeText(mContext, "Old pipeline code running!", Toast.LENGTH_SHORT).show();
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isNewNotifPipelineRenderingEnabled() {
|
||||
return isEnabled(Flags.NEW_NOTIFICATION_PIPELINE_RENDERING);
|
||||
}
|
||||
@@ -129,8 +109,8 @@ public class FeatureFlags {
|
||||
}
|
||||
|
||||
/** System setting for provider model behavior */
|
||||
public boolean isProviderModelSettingEnabled() {
|
||||
return FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL);
|
||||
public boolean isProviderModelSettingEnabled(Context context) {
|
||||
return FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -146,9 +126,4 @@ public class FeatureFlags {
|
||||
public boolean useCombinedQSHeaders() {
|
||||
return isEnabled(Flags.COMBINED_QS_HEADERS);
|
||||
}
|
||||
|
||||
/** static method for the system setting */
|
||||
public static boolean isProviderModelSettingEnabled(Context context) {
|
||||
return FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,6 +92,9 @@ public class Flags {
|
||||
|
||||
/***************************************/
|
||||
// 600- status bar
|
||||
public static final BooleanFlag STATUS_BAR_PROVIDER_MODEL =
|
||||
new BooleanFlag(600, false);
|
||||
|
||||
public static final BooleanFlag COMBINED_STATUS_BAR_SIGNAL_ICONS =
|
||||
new BooleanFlag(601, false);
|
||||
|
||||
|
||||
@@ -536,7 +536,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
|
||||
}
|
||||
}
|
||||
}
|
||||
if (featureFlags.isProviderModelSettingEnabled()) {
|
||||
if (featureFlags.isProviderModelSettingEnabled(context)) {
|
||||
if (!tiles.contains("internet")) {
|
||||
if (tiles.contains("wifi")) {
|
||||
// Replace the WiFi with Internet, and remove the Cell
|
||||
|
||||
@@ -121,7 +121,7 @@ public class TileQueryHelper {
|
||||
}
|
||||
|
||||
final ArrayList<QSTile> tilesToAdd = new ArrayList<>();
|
||||
if (mFeatureFlags.isProviderModelSettingEnabled()) {
|
||||
if (mFeatureFlags.isProviderModelSettingEnabled(mContext)) {
|
||||
possibleTiles.remove("cell");
|
||||
possibleTiles.remove("wifi");
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import com.android.systemui.statusbar.dagger.StatusBarModule;
|
||||
import com.android.systemui.statusbar.notification.AssistantFeedbackController;
|
||||
import com.android.systemui.statusbar.notification.DynamicChildBindController;
|
||||
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.notification.collection.legacy.LowPriorityInflationHelper;
|
||||
@@ -91,6 +92,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
|
||||
private final DynamicPrivacyController mDynamicPrivacyController;
|
||||
private final KeyguardBypassController mBypassController;
|
||||
private final ForegroundServiceSectionController mFgsSectionController;
|
||||
private final NotifPipelineFlags mNotifPipelineFlags;
|
||||
private AssistantFeedbackController mAssistantFeedbackController;
|
||||
private final Context mContext;
|
||||
|
||||
@@ -121,7 +123,8 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
|
||||
ForegroundServiceSectionController fgsSectionController,
|
||||
DynamicChildBindController dynamicChildBindController,
|
||||
LowPriorityInflationHelper lowPriorityInflationHelper,
|
||||
AssistantFeedbackController assistantFeedbackController) {
|
||||
AssistantFeedbackController assistantFeedbackController,
|
||||
NotifPipelineFlags notifPipelineFlags) {
|
||||
mContext = context;
|
||||
mHandler = mainHandler;
|
||||
mFeatureFlags = featureFlags;
|
||||
@@ -132,6 +135,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
|
||||
mStatusBarStateController = (SysuiStatusBarStateController) statusBarStateController;
|
||||
mEntryManager = notificationEntryManager;
|
||||
mFgsSectionController = fgsSectionController;
|
||||
mNotifPipelineFlags = notifPipelineFlags;
|
||||
Resources res = context.getResources();
|
||||
mAlwaysExpandNonGroupedNotification =
|
||||
res.getBoolean(R.bool.config_alwaysExpandNonGroupedNotifications);
|
||||
@@ -157,7 +161,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
|
||||
//TODO: Rewrite this to focus on Entries, or some other data object instead of views
|
||||
public void updateNotificationViews() {
|
||||
Assert.isMainThread();
|
||||
if (!mFeatureFlags.checkLegacyPipelineEnabled()) {
|
||||
if (!mNotifPipelineFlags.checkLegacyPipelineEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -435,7 +439,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
|
||||
*/
|
||||
public void updateRowStates() {
|
||||
Assert.isMainThread();
|
||||
if (!mFeatureFlags.checkLegacyPipelineEnabled()) {
|
||||
if (!mNotifPipelineFlags.checkLegacyPipelineEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -524,7 +528,9 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle
|
||||
|
||||
@Override
|
||||
public void onDynamicPrivacyChanged() {
|
||||
mFeatureFlags.assertLegacyPipelineEnabled();
|
||||
if (mFeatureFlags.isNewNotifPipelineRenderingEnabled()) {
|
||||
throw new IllegalStateException("Old pipeline code running w/ new pipeline enabled");
|
||||
}
|
||||
if (mPerformingUpdate) {
|
||||
Log.w(TAG, "onDynamicPrivacyChanged made a re-entrant call");
|
||||
}
|
||||
|
||||
@@ -227,7 +227,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
|
||||
mMobileStatusTracker = new MobileStatusTracker(mPhone, receiverLooper,
|
||||
info, mDefaults, mMobileCallback);
|
||||
mProviderModelBehavior = featureFlags.isCombinedStatusBarSignalIconsEnabled();
|
||||
mProviderModelSetting = featureFlags.isProviderModelSettingEnabled();
|
||||
mProviderModelSetting = featureFlags.isProviderModelSettingEnabled(mContext);
|
||||
}
|
||||
|
||||
void setConfiguration(Config config) {
|
||||
|
||||
@@ -442,7 +442,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
|
||||
mDemoModeController.addCallback(this);
|
||||
mProviderModelBehavior = mFeatureFlags.isCombinedStatusBarSignalIconsEnabled();
|
||||
mProviderModelSetting = mFeatureFlags.isProviderModelSettingEnabled();
|
||||
mProviderModelSetting = mFeatureFlags.isProviderModelSettingEnabled(mContext);
|
||||
|
||||
mDumpManager.registerDumpable(TAG, this);
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup>
|
||||
new WifiTrafficStateCallback());
|
||||
}
|
||||
mCurrentState.iconGroup = mLastState.iconGroup = mUnmergedWifiIconGroup;
|
||||
mProviderModelSetting = featureFlags.isProviderModelSettingEnabled();
|
||||
mProviderModelSetting = featureFlags.isProviderModelSettingEnabled(mContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -52,6 +52,7 @@ import com.android.systemui.statusbar.gesture.SwipeStatusBarAwayGestureHandler;
|
||||
import com.android.systemui.statusbar.notification.AssistantFeedbackController;
|
||||
import com.android.systemui.statusbar.notification.DynamicChildBindController;
|
||||
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||
import com.android.systemui.statusbar.notification.collection.NotifCollection;
|
||||
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
|
||||
@@ -211,7 +212,8 @@ public interface StatusBarDependenciesModule {
|
||||
ForegroundServiceSectionController fgsSectionController,
|
||||
DynamicChildBindController dynamicChildBindController,
|
||||
LowPriorityInflationHelper lowPriorityInflationHelper,
|
||||
AssistantFeedbackController assistantFeedbackController) {
|
||||
AssistantFeedbackController assistantFeedbackController,
|
||||
NotifPipelineFlags notifPipelineFlags) {
|
||||
return new NotificationViewHierarchyManager(
|
||||
context,
|
||||
mainHandler,
|
||||
@@ -227,7 +229,8 @@ public interface StatusBarDependenciesModule {
|
||||
fgsSectionController,
|
||||
dynamicChildBindController,
|
||||
lowPriorityInflationHelper,
|
||||
assistantFeedbackController);
|
||||
assistantFeedbackController,
|
||||
notifPipelineFlags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (C) 2021 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
|
||||
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import android.widget.Toast
|
||||
import com.android.systemui.flags.FeatureFlags
|
||||
import javax.inject.Inject
|
||||
|
||||
class NotifPipelineFlags @Inject constructor(
|
||||
val context: Context,
|
||||
val featureFlags: FeatureFlags
|
||||
) {
|
||||
fun checkLegacyPipelineEnabled(): Boolean {
|
||||
if (!featureFlags.isNewNotifPipelineRenderingEnabled) {
|
||||
return true
|
||||
}
|
||||
Log.d("NotifPipeline", "Old pipeline code running w/ new pipeline enabled", Exception())
|
||||
Toast.makeText(context, "Old pipeline code running!", Toast.LENGTH_SHORT).show()
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -25,12 +25,12 @@ import android.view.ViewGroup;
|
||||
|
||||
import com.android.internal.util.NotificationMessagingUtil;
|
||||
import com.android.systemui.dagger.SysUISingleton;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
|
||||
import com.android.systemui.statusbar.NotificationPresenter;
|
||||
import com.android.systemui.statusbar.NotificationRemoteInputManager;
|
||||
import com.android.systemui.statusbar.NotificationUiAdjustment;
|
||||
import com.android.systemui.statusbar.notification.InflationException;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationClicker;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.notification.collection.legacy.LowPriorityInflationHelper;
|
||||
@@ -55,7 +55,6 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
|
||||
private static final String TAG = "NotificationViewManager";
|
||||
|
||||
private final Context mContext;
|
||||
private final FeatureFlags mFeatureFlags;
|
||||
private final NotificationMessagingUtil mMessagingUtil;
|
||||
private final NotificationRemoteInputManager mNotificationRemoteInputManager;
|
||||
private final NotificationLockscreenUserManager mNotificationLockscreenUserManager;
|
||||
@@ -66,6 +65,7 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
|
||||
mExpandableNotificationRowComponentBuilder;
|
||||
private final IconManager mIconManager;
|
||||
private final LowPriorityInflationHelper mLowPriorityInflationHelper;
|
||||
private final NotifPipelineFlags mNotifPipelineFlags;
|
||||
|
||||
private NotificationPresenter mPresenter;
|
||||
private NotificationListContainer mListContainer;
|
||||
@@ -75,7 +75,6 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
|
||||
@Inject
|
||||
public NotificationRowBinderImpl(
|
||||
Context context,
|
||||
FeatureFlags featureFlags,
|
||||
NotificationMessagingUtil notificationMessagingUtil,
|
||||
NotificationRemoteInputManager notificationRemoteInputManager,
|
||||
NotificationLockscreenUserManager notificationLockscreenUserManager,
|
||||
@@ -84,9 +83,9 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
|
||||
Provider<RowInflaterTask> rowInflaterTaskProvider,
|
||||
ExpandableNotificationRowComponent.Builder expandableNotificationRowComponentBuilder,
|
||||
IconManager iconManager,
|
||||
LowPriorityInflationHelper lowPriorityInflationHelper) {
|
||||
LowPriorityInflationHelper lowPriorityInflationHelper,
|
||||
NotifPipelineFlags notifPipelineFlags) {
|
||||
mContext = context;
|
||||
mFeatureFlags = featureFlags;
|
||||
mNotifBindPipeline = notifBindPipeline;
|
||||
mRowContentBindStage = rowContentBindStage;
|
||||
mMessagingUtil = notificationMessagingUtil;
|
||||
@@ -96,6 +95,7 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
|
||||
mExpandableNotificationRowComponentBuilder = expandableNotificationRowComponentBuilder;
|
||||
mIconManager = iconManager;
|
||||
mLowPriorityInflationHelper = lowPriorityInflationHelper;
|
||||
mNotifPipelineFlags = notifPipelineFlags;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -126,7 +126,7 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
|
||||
throws InflationException {
|
||||
if (params == null) {
|
||||
// weak assert that the params should always be passed in the new pipeline
|
||||
mFeatureFlags.checkLegacyPipelineEnabled();
|
||||
mNotifPipelineFlags.checkLegacyPipelineEnabled();
|
||||
}
|
||||
ViewGroup parent = mListContainer.getViewParentForNotification(entry);
|
||||
|
||||
@@ -187,7 +187,7 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
|
||||
NotificationUiAdjustment oldAdjustment,
|
||||
NotificationUiAdjustment newAdjustment,
|
||||
NotificationRowContentBinder.InflationCallback callback) {
|
||||
mFeatureFlags.checkLegacyPipelineEnabled();
|
||||
mNotifPipelineFlags.checkLegacyPipelineEnabled();
|
||||
if (NotificationUiAdjustment.needReinflate(oldAdjustment, newAdjustment)) {
|
||||
if (entry.rowExists()) {
|
||||
ExpandableNotificationRow row = entry.getRow();
|
||||
@@ -238,7 +238,7 @@ public class NotificationRowBinderImpl implements NotificationRowBinder {
|
||||
isLowPriority = inflaterParams.isLowPriority();
|
||||
} else {
|
||||
// LEGACY pipeline
|
||||
mFeatureFlags.checkLegacyPipelineEnabled();
|
||||
mNotifPipelineFlags.checkLegacyPipelineEnabled();
|
||||
// If this is our first time inflating, we don't actually know the groupings for real
|
||||
// yet, so we might actually inflate a low priority content view incorrectly here and
|
||||
// have to correct it later in the pipeline. On subsequent inflations (i.e. updates),
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
package com.android.systemui.statusbar.notification.collection.legacy;
|
||||
|
||||
import com.android.systemui.dagger.SysUISingleton;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
|
||||
import com.android.systemui.statusbar.notification.row.RowContentBindParams;
|
||||
@@ -31,18 +31,18 @@ import javax.inject.Inject;
|
||||
*/
|
||||
@SysUISingleton
|
||||
public class LowPriorityInflationHelper {
|
||||
private final FeatureFlags mFeatureFlags;
|
||||
private final NotificationGroupManagerLegacy mGroupManager;
|
||||
private final RowContentBindStage mRowContentBindStage;
|
||||
private final NotifPipelineFlags mNotifPipelineFlags;
|
||||
|
||||
@Inject
|
||||
LowPriorityInflationHelper(
|
||||
FeatureFlags featureFlags,
|
||||
NotificationGroupManagerLegacy groupManager,
|
||||
RowContentBindStage rowContentBindStage) {
|
||||
mFeatureFlags = featureFlags;
|
||||
RowContentBindStage rowContentBindStage,
|
||||
NotifPipelineFlags notifPipelineFlags) {
|
||||
mGroupManager = groupManager;
|
||||
mRowContentBindStage = rowContentBindStage;
|
||||
mNotifPipelineFlags = notifPipelineFlags;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -59,7 +59,7 @@ public class LowPriorityInflationHelper {
|
||||
public void recheckLowPriorityViewAndInflate(
|
||||
NotificationEntry entry,
|
||||
ExpandableNotificationRow row) {
|
||||
mFeatureFlags.checkLegacyPipelineEnabled();
|
||||
mNotifPipelineFlags.checkLegacyPipelineEnabled();
|
||||
RowContentBindParams params = mRowContentBindStage.getStageParams(entry);
|
||||
final boolean shouldBeLowPriority = shouldUseLowPriorityView(entry);
|
||||
if (!row.isRemoved() && row.isLowPriority() != shouldBeLowPriority) {
|
||||
@@ -73,7 +73,7 @@ public class LowPriorityInflationHelper {
|
||||
* Whether the notification should inflate a low priority version of its content views.
|
||||
*/
|
||||
public boolean shouldUseLowPriorityView(NotificationEntry entry) {
|
||||
mFeatureFlags.checkLegacyPipelineEnabled();
|
||||
mNotifPipelineFlags.checkLegacyPipelineEnabled();
|
||||
return entry.isAmbient() && !mGroupManager.isChildInGroup(entry);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,10 +22,10 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import com.android.internal.annotations.VisibleForTesting
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.flags.FeatureFlags
|
||||
import com.android.systemui.media.KeyguardMediaController
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
||||
import com.android.systemui.statusbar.StatusBarState
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags
|
||||
import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager
|
||||
import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController
|
||||
import com.android.systemui.statusbar.notification.collection.render.ShadeViewManager
|
||||
@@ -54,12 +54,12 @@ import javax.inject.Inject
|
||||
* TODO: Move remaining sections logic from NSSL into this class.
|
||||
*/
|
||||
class NotificationSectionsManager @Inject internal constructor(
|
||||
private val featureFlags: FeatureFlags,
|
||||
private val statusBarStateController: StatusBarStateController,
|
||||
private val configurationController: ConfigurationController,
|
||||
private val keyguardMediaController: KeyguardMediaController,
|
||||
private val sectionsFeatureManager: NotificationSectionsFeatureManager,
|
||||
private val logger: NotificationSectionsLogger,
|
||||
private val notifPipelineFlags: NotifPipelineFlags,
|
||||
@IncomingHeader private val incomingHeaderController: SectionHeaderController,
|
||||
@PeopleHeader private val peopleHeaderController: SectionHeaderController,
|
||||
@AlertingHeader private val alertingHeaderController: SectionHeaderController,
|
||||
@@ -201,7 +201,7 @@ class NotificationSectionsManager @Inject internal constructor(
|
||||
override var targetPosition: Int? = null
|
||||
|
||||
override fun adjustViewPosition() {
|
||||
featureFlags.checkLegacyPipelineEnabled()
|
||||
notifPipelineFlags.checkLegacyPipelineEnabled()
|
||||
val target = targetPosition
|
||||
val current = currentPosition
|
||||
if (target == null) {
|
||||
@@ -228,7 +228,7 @@ class NotificationSectionsManager @Inject internal constructor(
|
||||
private fun <T : StackScrollerDecorView> decorViewHeaderState(
|
||||
header: T
|
||||
): SectionUpdateState<T> {
|
||||
featureFlags.checkLegacyPipelineEnabled()
|
||||
notifPipelineFlags.checkLegacyPipelineEnabled()
|
||||
val inner = expandableViewHeaderState(header)
|
||||
return object : SectionUpdateState<T> by inner {
|
||||
override fun adjustViewPosition() {
|
||||
@@ -245,7 +245,7 @@ class NotificationSectionsManager @Inject internal constructor(
|
||||
* bookkeeping and adds/moves/removes section headers if appropriate.
|
||||
*/
|
||||
fun updateSectionBoundaries(reason: String) {
|
||||
featureFlags.checkLegacyPipelineEnabled()
|
||||
notifPipelineFlags.checkLegacyPipelineEnabled()
|
||||
if (!isUsingMultipleSections) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -198,6 +198,7 @@ import com.android.systemui.statusbar.SysuiStatusBarStateController;
|
||||
import com.android.systemui.statusbar.connectivity.NetworkController;
|
||||
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
|
||||
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||
import com.android.systemui.statusbar.notification.NotificationLaunchAnimatorControllerProvider;
|
||||
@@ -671,6 +672,7 @@ public class StatusBar extends CoreStartable implements
|
||||
private final Optional<Bubbles> mBubblesOptional;
|
||||
private final Bubbles.BubbleExpandListener mBubbleExpandListener;
|
||||
private final Optional<StartingSurface> mStartingSurfaceOptional;
|
||||
private final NotifPipelineFlags mNotifPipelineFlags;
|
||||
|
||||
private final ActivityIntentHelper mActivityIntentHelper;
|
||||
private NotificationStackScrollLayoutController mStackScrollerController;
|
||||
@@ -786,7 +788,8 @@ public class StatusBar extends CoreStartable implements
|
||||
Optional<StartingSurface> startingSurfaceOptional,
|
||||
TunerService tunerService,
|
||||
DumpManager dumpManager,
|
||||
ActivityLaunchAnimator activityLaunchAnimator) {
|
||||
ActivityLaunchAnimator activityLaunchAnimator,
|
||||
NotifPipelineFlags notifPipelineFlags) {
|
||||
super(context);
|
||||
mNotificationsController = notificationsController;
|
||||
mLightBarController = lightBarController;
|
||||
@@ -884,6 +887,7 @@ public class StatusBar extends CoreStartable implements
|
||||
|
||||
mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
|
||||
mStartingSurfaceOptional = startingSurfaceOptional;
|
||||
mNotifPipelineFlags = notifPipelineFlags;
|
||||
lockscreenShadeTransitionController.setStatusbar(this);
|
||||
|
||||
mPanelExpansionStateManager.addExpansionListener(this::onPanelExpansionChanged);
|
||||
@@ -1473,7 +1477,8 @@ public class StatusBar extends CoreStartable implements
|
||||
mInitController,
|
||||
mNotificationInterruptStateProvider,
|
||||
mRemoteInputManager,
|
||||
mConfigurationController);
|
||||
mConfigurationController,
|
||||
mNotifPipelineFlags);
|
||||
|
||||
mNotificationShelfController.setOnActivatedListener(mPresenter);
|
||||
mRemoteInputManager.addControllerCallback(mNotificationShadeWindowController);
|
||||
|
||||
@@ -57,6 +57,7 @@ import com.android.systemui.statusbar.StatusBarState;
|
||||
import com.android.systemui.statusbar.SysuiStatusBarStateController;
|
||||
import com.android.systemui.statusbar.notification.AboveShelfObserver;
|
||||
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl;
|
||||
@@ -108,6 +109,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
|
||||
private final AccessibilityManager mAccessibilityManager;
|
||||
private final KeyguardManager mKeyguardManager;
|
||||
private final NotificationShadeWindowController mNotificationShadeWindowController;
|
||||
private final NotifPipelineFlags mNotifPipelineFlags;
|
||||
private final IStatusBarService mBarService;
|
||||
private final DynamicPrivacyController mDynamicPrivacyController;
|
||||
private boolean mReinflateNotificationsOnUserSwitched;
|
||||
@@ -144,7 +146,8 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
|
||||
InitController initController,
|
||||
NotificationInterruptStateProvider notificationInterruptStateProvider,
|
||||
NotificationRemoteInputManager remoteInputManager,
|
||||
ConfigurationController configurationController) {
|
||||
ConfigurationController configurationController,
|
||||
NotifPipelineFlags notifPipelineFlags) {
|
||||
mKeyguardStateController = keyguardStateController;
|
||||
mNotificationPanel = panel;
|
||||
mHeadsUpManager = headsUp;
|
||||
@@ -167,6 +170,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
|
||||
mLockscreenGestureLogger = lockscreenGestureLogger;
|
||||
mAboveShelfObserver = new AboveShelfObserver(stackScrollerController.getView());
|
||||
mNotificationShadeWindowController = notificationShadeWindowController;
|
||||
mNotifPipelineFlags = notifPipelineFlags;
|
||||
mAboveShelfObserver.setListener(statusBarWindow.findViewById(
|
||||
R.id.notification_container_parent));
|
||||
mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
|
||||
@@ -305,7 +309,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter,
|
||||
|
||||
@Override
|
||||
public void updateNotificationViews(final String reason) {
|
||||
if (!mFeatureFlags.checkLegacyPipelineEnabled()) {
|
||||
if (!mNotifPipelineFlags.checkLegacyPipelineEnabled()) {
|
||||
return;
|
||||
}
|
||||
// The function updateRowStates depends on both of these being non-null, so check them here.
|
||||
|
||||
@@ -64,6 +64,7 @@ import com.android.systemui.statusbar.SysuiStatusBarStateController;
|
||||
import com.android.systemui.statusbar.connectivity.NetworkController;
|
||||
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
|
||||
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
|
||||
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
|
||||
@@ -239,7 +240,8 @@ public interface StatusBarPhoneModule {
|
||||
Optional<StartingSurface> startingSurfaceOptional,
|
||||
TunerService tunerService,
|
||||
DumpManager dumpManager,
|
||||
ActivityLaunchAnimator activityLaunchAnimator) {
|
||||
ActivityLaunchAnimator activityLaunchAnimator,
|
||||
NotifPipelineFlags notifPipelineFlags) {
|
||||
return new StatusBar(
|
||||
context,
|
||||
notificationsController,
|
||||
@@ -339,7 +341,8 @@ public interface StatusBarPhoneModule {
|
||||
startingSurfaceOptional,
|
||||
tunerService,
|
||||
dumpManager,
|
||||
activityLaunchAnimator
|
||||
activityLaunchAnimator,
|
||||
notifPipelineFlags
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ public class QSTileHostTest extends SysuiTestCase {
|
||||
mSecureSettings, mCustomTileStatePersister, mTileServiceRequestControllerBuilder,
|
||||
mFeatureFlags);
|
||||
setUpTileFactory();
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(false);
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(false);
|
||||
}
|
||||
|
||||
private void setUpTileFactory() {
|
||||
@@ -200,7 +200,7 @@ public class QSTileHostTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void testRemoveWifiAndCellularWithoutInternet() {
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(true);
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
|
||||
mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "wifi, spec1, cell, spec2");
|
||||
|
||||
assertEquals("internet", mQSTileHost.mTileSpecs.get(0));
|
||||
@@ -210,7 +210,7 @@ public class QSTileHostTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void testRemoveWifiAndCellularWithInternet() {
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(true);
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
|
||||
mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "wifi, spec1, cell, spec2, internet");
|
||||
|
||||
assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
|
||||
@@ -220,7 +220,7 @@ public class QSTileHostTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void testRemoveWifiWithoutInternet() {
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(true);
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
|
||||
mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1, wifi, spec2");
|
||||
|
||||
assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
|
||||
@@ -230,7 +230,7 @@ public class QSTileHostTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void testRemoveCellWithInternet() {
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(true);
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
|
||||
mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1, spec2, cell, internet");
|
||||
|
||||
assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
|
||||
@@ -240,7 +240,7 @@ public class QSTileHostTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void testNoWifiNoCellularNoInternet() {
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(true);
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
|
||||
mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1,spec2");
|
||||
|
||||
assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
|
||||
|
||||
@@ -136,7 +136,7 @@ public class TileQueryHelperTest extends SysuiTestCase {
|
||||
}
|
||||
}
|
||||
).when(mQSTileHost).createTile(anyString());
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(false);
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(false);
|
||||
FakeSystemClock clock = new FakeSystemClock();
|
||||
mMainExecutor = new FakeExecutor(clock);
|
||||
mBgExecutor = new FakeExecutor(clock);
|
||||
|
||||
@@ -41,6 +41,7 @@ import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
|
||||
import com.android.systemui.statusbar.notification.AssistantFeedbackController;
|
||||
import com.android.systemui.statusbar.notification.DynamicChildBindController;
|
||||
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
@@ -77,6 +78,7 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase {
|
||||
|
||||
// Dependency mocks:
|
||||
@Mock private FeatureFlags mFeatureFlags;
|
||||
@Mock private NotifPipelineFlags mNotifPipelineFlags;
|
||||
@Mock private NotificationEntryManager mEntryManager;
|
||||
@Mock private NotificationLockscreenUserManager mLockscreenUserManager;
|
||||
@Mock private NotificationGroupManagerLegacy mGroupManager;
|
||||
@@ -103,7 +105,8 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase {
|
||||
when(mVisualStabilityManager.areGroupChangesAllowed()).thenReturn(true);
|
||||
when(mVisualStabilityManager.isReorderingAllowed()).thenReturn(true);
|
||||
|
||||
when(mFeatureFlags.checkLegacyPipelineEnabled()).thenReturn(true);
|
||||
when(mFeatureFlags.isNewNotifPipelineRenderingEnabled()).thenReturn(false);
|
||||
when(mNotifPipelineFlags.checkLegacyPipelineEnabled()).thenReturn(true);
|
||||
|
||||
mHelper = new NotificationTestHelper(mContext, mDependency, TestableLooper.get(this));
|
||||
|
||||
@@ -117,7 +120,8 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase {
|
||||
mock(ForegroundServiceSectionController.class),
|
||||
mock(DynamicChildBindController.class),
|
||||
mock(LowPriorityInflationHelper.class),
|
||||
mock(AssistantFeedbackController.class));
|
||||
mock(AssistantFeedbackController.class),
|
||||
mNotifPipelineFlags);
|
||||
mViewHierarchyManager.setUpWithPresenter(mPresenter, mListContainer);
|
||||
}
|
||||
|
||||
|
||||
@@ -158,11 +158,9 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
|
||||
public void setUp() throws Exception {
|
||||
mMockingSession = ExtendedMockito.mockitoSession().strictness(Strictness.LENIENT)
|
||||
.mockStatic(FeatureFlags.class).startMocking();
|
||||
ExtendedMockito.doReturn(true).when(() ->
|
||||
FeatureFlags.isProviderModelSettingEnabled(mContext));
|
||||
mFeatureFlags = mock(FeatureFlags.class);
|
||||
when(mFeatureFlags.isCombinedStatusBarSignalIconsEnabled()).thenReturn(false);
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(true);
|
||||
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
|
||||
|
||||
|
||||
mInstrumentation = InstrumentationRegistry.getInstrumentation();
|
||||
|
||||
@@ -62,6 +62,7 @@ import com.android.systemui.statusbar.SbnBuilder;
|
||||
import com.android.systemui.statusbar.SmartReplyController;
|
||||
import com.android.systemui.statusbar.notification.ConversationNotificationProcessor;
|
||||
import com.android.systemui.statusbar.notification.ForegroundServiceDismissalFeatureController;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationClicker;
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryListener;
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||
@@ -143,6 +144,7 @@ public class NotificationEntryManagerInflationTest extends SysuiTestCase {
|
||||
@Mock private NotificationGroupManagerLegacy mGroupMembershipManager;
|
||||
@Mock private NotificationGroupManagerLegacy mGroupExpansionManager;
|
||||
@Mock private FeatureFlags mFeatureFlags;
|
||||
@Mock private NotifPipelineFlags mNotifPipelineFlags;
|
||||
@Mock private LeakDetector mLeakDetector;
|
||||
|
||||
@Mock private ActivatableNotificationViewController mActivatableNotificationViewController;
|
||||
@@ -179,6 +181,7 @@ public class NotificationEntryManagerInflationTest extends SysuiTestCase {
|
||||
.setNotification(notification)
|
||||
.build();
|
||||
|
||||
when(mNotifPipelineFlags.checkLegacyPipelineEnabled()).thenReturn(true);
|
||||
when(mFeatureFlags.isNewNotifPipelineRenderingEnabled()).thenReturn(false);
|
||||
|
||||
mEntryManager = new NotificationEntryManager(
|
||||
@@ -282,7 +285,6 @@ public class NotificationEntryManagerInflationTest extends SysuiTestCase {
|
||||
|
||||
mRowBinder = new NotificationRowBinderImpl(
|
||||
mContext,
|
||||
mFeatureFlags,
|
||||
new NotificationMessagingUtil(mContext),
|
||||
mRemoteInputManager,
|
||||
mLockscreenUserManager,
|
||||
@@ -294,7 +296,8 @@ public class NotificationEntryManagerInflationTest extends SysuiTestCase {
|
||||
mEntryManager,
|
||||
mock(LauncherApps.class),
|
||||
new IconBuilder(mContext)),
|
||||
mock(LowPriorityInflationHelper.class));
|
||||
mock(LowPriorityInflationHelper.class),
|
||||
mNotifPipelineFlags);
|
||||
|
||||
mEntryManager.setUpWithPresenter(mPresenter);
|
||||
mEntryManager.addNotificationEntryListener(mEntryListener);
|
||||
|
||||
@@ -52,6 +52,7 @@ import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.media.KeyguardMediaController;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.StatusBarState;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController;
|
||||
@@ -80,11 +81,8 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
|
||||
@Rule public final MockitoRule mockitoRule = MockitoJUnit.rule();
|
||||
|
||||
@Mock private NotificationStackScrollLayout mNssl;
|
||||
@Mock private FeatureFlags mFeatureFlags;
|
||||
@Mock private ActivityStarterDelegate mActivityStarterDelegate;
|
||||
@Mock private StatusBarStateController mStatusBarStateController;
|
||||
@Mock private ConfigurationController mConfigurationController;
|
||||
@Mock private PeopleHubViewAdapter mPeopleHubAdapter;
|
||||
@Mock private KeyguardMediaController mKeyguardMediaController;
|
||||
@Mock private NotificationSectionsFeatureManager mSectionsFeatureManager;
|
||||
@Mock private NotificationRowComponent mNotificationRowComponent;
|
||||
@@ -94,6 +92,7 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
|
||||
@Mock private SectionHeaderController mPeopleHeaderController;
|
||||
@Mock private SectionHeaderController mAlertingHeaderController;
|
||||
@Mock private SectionHeaderController mSilentHeaderController;
|
||||
@Mock private NotifPipelineFlags mNotifPipelineFlags;
|
||||
|
||||
private NotificationSectionsManager mSectionsManager;
|
||||
|
||||
@@ -122,12 +121,12 @@ public class NotificationSectionsManagerTest extends SysuiTestCase {
|
||||
when(mSilentHeaderController.getHeaderView()).thenReturn(mock(SectionHeaderView.class));
|
||||
mSectionsManager =
|
||||
new NotificationSectionsManager(
|
||||
mFeatureFlags,
|
||||
mStatusBarStateController,
|
||||
mConfigurationController,
|
||||
mKeyguardMediaController,
|
||||
mSectionsFeatureManager,
|
||||
mLogger,
|
||||
mNotifPipelineFlags,
|
||||
mIncomingHeaderController,
|
||||
mPeopleHeaderController,
|
||||
mAlertingHeaderController,
|
||||
|
||||
@@ -49,6 +49,7 @@ import com.android.systemui.statusbar.NotificationShadeWindowController;
|
||||
import com.android.systemui.statusbar.NotificationViewHierarchyManager;
|
||||
import com.android.systemui.statusbar.SysuiStatusBarStateController;
|
||||
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
|
||||
@@ -128,7 +129,8 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase {
|
||||
mInitController,
|
||||
mNotificationInterruptStateProvider,
|
||||
mock(NotificationRemoteInputManager.class),
|
||||
mock(ConfigurationController.class));
|
||||
mock(ConfigurationController.class),
|
||||
mock(NotifPipelineFlags.class));
|
||||
mInitController.executePostInitTasks();
|
||||
ArgumentCaptor<NotificationInterruptSuppressor> suppressorCaptor =
|
||||
ArgumentCaptor.forClass(NotificationInterruptSuppressor.class);
|
||||
|
||||
@@ -114,6 +114,7 @@ import com.android.systemui.statusbar.StatusBarStateControllerImpl;
|
||||
import com.android.systemui.statusbar.connectivity.NetworkController;
|
||||
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
|
||||
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
|
||||
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
|
||||
import com.android.systemui.statusbar.notification.NotificationEntryManager;
|
||||
import com.android.systemui.statusbar.notification.NotificationFilter;
|
||||
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
|
||||
@@ -281,6 +282,7 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
@Mock private OperatorNameViewController.Factory mOperatorNameViewControllerFactory;
|
||||
@Mock private PhoneStatusBarViewController.Factory mPhoneStatusBarViewControllerFactory;
|
||||
@Mock private ActivityLaunchAnimator mActivityLaunchAnimator;
|
||||
@Mock private NotifPipelineFlags mNotifPipelineFlags;
|
||||
private ShadeController mShadeController;
|
||||
private final FakeSystemClock mFakeSystemClock = new FakeSystemClock();
|
||||
private FakeExecutor mMainExecutor = new FakeExecutor(mFakeSystemClock);
|
||||
@@ -471,7 +473,8 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
Optional.of(mStartingSurface),
|
||||
mTunerService,
|
||||
mDumpManager,
|
||||
mActivityLaunchAnimator);
|
||||
mActivityLaunchAnimator,
|
||||
mNotifPipelineFlags);
|
||||
when(mKeyguardViewMediator.registerStatusBar(
|
||||
any(StatusBar.class),
|
||||
any(NotificationPanelViewController.class),
|
||||
|
||||
Reference in New Issue
Block a user