mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-27 07:16:54 +00:00
clean-up migrated back to collect to list for lower v
This commit is contained in:
@@ -143,10 +143,12 @@ public class WidgetPickerActivity extends BaseActivity {
|
||||
if (uiSurfaceParam != null && UI_SURFACE_PATTERN.matcher(uiSurfaceParam).matches()) {
|
||||
mUiSurface = uiSurfaceParam;
|
||||
}
|
||||
ArrayList<AppWidgetProviderInfo> addedWidgets = getIntent().getParcelableArrayListExtra(
|
||||
EXTRA_ADDED_APP_WIDGETS, AppWidgetProviderInfo.class);
|
||||
if (addedWidgets != null) {
|
||||
mAddedWidgets = addedWidgets;
|
||||
if (Utilities.ATLEAST_T) {
|
||||
ArrayList<AppWidgetProviderInfo> addedWidgets = getIntent().getParcelableArrayListExtra(
|
||||
EXTRA_ADDED_APP_WIDGETS, AppWidgetProviderInfo.class);
|
||||
if (addedWidgets != null) {
|
||||
mAddedWidgets = addedWidgets;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -43,6 +43,8 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_N
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING;
|
||||
import static com.android.wm.shell.Flags.enableTinyTaskbar;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.app.ActivityOptions;
|
||||
@@ -1258,7 +1260,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
|
||||
boolean isLaunchingAppPair = itemInfos.size() == 2;
|
||||
// Convert the list of ItemInfo instances to a list of ComponentKeys
|
||||
List<ComponentKey> componentKeys = itemInfos.stream().map(ItemInfo::getComponentKey).toList();
|
||||
List<ComponentKey> componentKeys = itemInfos.stream().map(ItemInfo::getComponentKey).collect(toList());
|
||||
recents.getSplitSelectController().findLastActiveTasksAndRunCallback(
|
||||
componentKeys,
|
||||
isLaunchingAppPair,
|
||||
|
||||
@@ -31,6 +31,8 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_Q
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import android.annotation.BinderThread;
|
||||
import android.annotation.Nullable;
|
||||
import android.app.Notification;
|
||||
@@ -398,7 +400,7 @@ public class BubbleBarController extends IBubblesListener.Stub {
|
||||
if (update.bubbleKeysInOrder != null && !update.bubbleKeysInOrder.isEmpty()) {
|
||||
// Create the new list
|
||||
List<BubbleBarBubble> newOrder = update.bubbleKeysInOrder.stream()
|
||||
.map(mBubbles::get).filter(Objects::nonNull).toList();
|
||||
.map(mBubbles::get).filter(Objects::nonNull).collect(toList());
|
||||
if (!newOrder.isEmpty()) {
|
||||
mBubbleBarViewController.reorderBubbles(newOrder);
|
||||
}
|
||||
|
||||
@@ -18,6 +18,8 @@ package com.android.launcher3.taskbar.bubbles;
|
||||
import static android.view.View.INVISIBLE;
|
||||
import static android.view.View.VISIBLE;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.PointF;
|
||||
@@ -463,7 +465,7 @@ public class BubbleBarViewController {
|
||||
*/
|
||||
public void reorderBubbles(List<BubbleBarBubble> newOrder) {
|
||||
List<BubbleView> viewList = newOrder.stream().filter(Objects::nonNull)
|
||||
.map(BubbleBarBubble::getView).toList();
|
||||
.map(BubbleBarBubble::getView).collect(toList());
|
||||
mBarView.reorder(viewList);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import android.app.backup.BackupRestoreEventLogger.BackupRestoreError
|
||||
import android.content.Context
|
||||
import com.android.launcher3.Flags.enableLauncherBrMetricsFixed
|
||||
import com.android.launcher3.LauncherSettings.Favorites
|
||||
import com.android.launcher3.Utilities
|
||||
import com.android.launcher3.backuprestore.LauncherRestoreEventLogger
|
||||
|
||||
/**
|
||||
@@ -29,8 +30,11 @@ class LauncherRestoreEventLoggerImpl(val context: Context) : LauncherRestoreEven
|
||||
@BackupRestoreDataType private const val DATA_TYPE_APP_PAIR = "app_pair"
|
||||
}
|
||||
|
||||
private val restoreEventLogger: BackupRestoreEventLogger =
|
||||
private val restoreEventLogger: BackupRestoreEventLogger? = if (Utilities.ATLEAST_S) {
|
||||
BackupManager(context).delayedRestoreLogger
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
/**
|
||||
* For logging when multiple items of a given data type failed to restore.
|
||||
@@ -45,7 +49,7 @@ class LauncherRestoreEventLoggerImpl(val context: Context) : LauncherRestoreEven
|
||||
@BackupRestoreError error: String?
|
||||
) {
|
||||
if (enableLauncherBrMetricsFixed()) {
|
||||
restoreEventLogger.logItemsRestoreFailed(dataType, count, error)
|
||||
restoreEventLogger?.logItemsRestoreFailed(dataType, count, error)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +61,7 @@ class LauncherRestoreEventLoggerImpl(val context: Context) : LauncherRestoreEven
|
||||
*/
|
||||
override fun logLauncherItemsRestored(@BackupRestoreDataType dataType: String, count: Int) {
|
||||
if (enableLauncherBrMetricsFixed()) {
|
||||
restoreEventLogger.logItemsRestored(dataType, count)
|
||||
restoreEventLogger?.logItemsRestored(dataType, count)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +72,7 @@ class LauncherRestoreEventLoggerImpl(val context: Context) : LauncherRestoreEven
|
||||
*/
|
||||
override fun logSingleFavoritesItemRestored(favoritesId: Int) {
|
||||
if (enableLauncherBrMetricsFixed()) {
|
||||
restoreEventLogger.logItemsRestored(favoritesIdToDataType(favoritesId), 1)
|
||||
restoreEventLogger?.logItemsRestored(favoritesIdToDataType(favoritesId), 1)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +84,7 @@ class LauncherRestoreEventLoggerImpl(val context: Context) : LauncherRestoreEven
|
||||
*/
|
||||
override fun logFavoritesItemsRestored(favoritesId: Int, count: Int) {
|
||||
if (enableLauncherBrMetricsFixed()) {
|
||||
restoreEventLogger.logItemsRestored(favoritesIdToDataType(favoritesId), count)
|
||||
restoreEventLogger?.logItemsRestored(favoritesIdToDataType(favoritesId), count)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,7 +99,7 @@ class LauncherRestoreEventLoggerImpl(val context: Context) : LauncherRestoreEven
|
||||
@BackupRestoreError error: String?
|
||||
) {
|
||||
if (enableLauncherBrMetricsFixed()) {
|
||||
restoreEventLogger.logItemsRestoreFailed(favoritesIdToDataType(favoritesId), 1, error)
|
||||
restoreEventLogger?.logItemsRestoreFailed(favoritesIdToDataType(favoritesId), 1, error)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,7 +116,7 @@ class LauncherRestoreEventLoggerImpl(val context: Context) : LauncherRestoreEven
|
||||
@BackupRestoreError error: String?
|
||||
) {
|
||||
if (enableLauncherBrMetricsFixed()) {
|
||||
restoreEventLogger.logItemsRestoreFailed(
|
||||
restoreEventLogger?.logItemsRestoreFailed(
|
||||
favoritesIdToDataType(favoritesId),
|
||||
count,
|
||||
error
|
||||
@@ -125,7 +129,7 @@ class LauncherRestoreEventLoggerImpl(val context: Context) : LauncherRestoreEven
|
||||
* done restoring items for Launcher.
|
||||
*/
|
||||
override fun reportLauncherRestoreResults() {
|
||||
if (enableLauncherBrMetricsFixed()) {
|
||||
if (enableLauncherBrMetricsFixed() && restoreEventLogger != null) {
|
||||
BackupManager(context).reportDelayedRestoreResult(restoreEventLogger)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,8 @@ package com.android.quickstep;
|
||||
import static com.android.quickstep.util.SplitScreenUtils.convertShellSplitBoundsToLauncher;
|
||||
import static com.android.wm.shell.util.SplitBounds.KEY_EXTRA_SPLIT_BOUNDS;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import android.app.WindowConfiguration;
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
@@ -175,7 +177,7 @@ public class RemoteTargetGluer {
|
||||
mSplitBounds.rightBottomTaskId);
|
||||
List<RemoteAnimationTarget> overlayTargets = Arrays.stream(targets.apps).filter(
|
||||
target -> target.windowConfiguration.getWindowingMode()
|
||||
!= WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW).toList();
|
||||
!= WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW).collect(toList());
|
||||
|
||||
// remoteTargetHandle[0] denotes topLeft task, so we pass in the bottomRight to exclude,
|
||||
// vice versa
|
||||
@@ -223,7 +225,7 @@ public class RemoteTargetGluer {
|
||||
for (int i = 0; i < mRemoteTargetHandles.length; i++) {
|
||||
RemoteAnimationTarget primaryTaskTarget = targets.apps[i];
|
||||
List<RemoteAnimationTarget> excludeTargets = Arrays.stream(targets.apps)
|
||||
.filter(target -> target.taskId != primaryTaskTarget.taskId).toList();
|
||||
.filter(target -> target.taskId != primaryTaskTarget.taskId).collect(toList());
|
||||
mRemoteTargetHandles[i].mTransformParams.setTargetSet(
|
||||
createRemoteAnimationTargetsForTarget(targets, excludeTargets));
|
||||
mRemoteTargetHandles[i].mTaskViewSimulator.setPreview(primaryTaskTarget, null);
|
||||
|
||||
@@ -33,6 +33,8 @@ import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSIT
|
||||
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT;
|
||||
import static com.android.wm.shell.common.split.SplitScreenConstants.isPersistentSnapPosition;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.LauncherApps;
|
||||
@@ -336,7 +338,7 @@ public class AppPairsController {
|
||||
List<? extends ItemInfo> itemInfos) {
|
||||
TaskbarActivityContext context = (TaskbarActivityContext) launchingIconView.getContext();
|
||||
List<ComponentKey> componentKeys =
|
||||
itemInfos.stream().map(ItemInfo::getComponentKey).toList();
|
||||
itemInfos.stream().map(ItemInfo::getComponentKey).collect(toList());
|
||||
|
||||
// Use TopTaskTracker to find the currently running app (or apps)
|
||||
TopTaskTracker topTaskTracker = getTopTaskTracker();
|
||||
@@ -362,7 +364,7 @@ public class AppPairsController {
|
||||
} else {
|
||||
return INVALID_TASK_ID;
|
||||
}
|
||||
}).toList();
|
||||
}).collect(toList());
|
||||
|
||||
if (lastActiveTasksOfAppPair.contains(runningTaskId1)
|
||||
&& lastActiveTasksOfAppPair.contains(runningTaskId2)) {
|
||||
|
||||
@@ -150,18 +150,11 @@ public class ReorderAlgorithm {
|
||||
).thenComparing(
|
||||
view -> ((CellLayoutLayoutParams) ((View) view).getLayoutParams()).getCellY()
|
||||
);
|
||||
List<View> views = new ArrayList<>();
|
||||
if (Utilities.ATLEAST_U) {
|
||||
views = solution.map.keySet().stream().sorted(comparator).toList();
|
||||
} else {
|
||||
List<Object> keys = new ArrayList<>(solution.map.keySet());
|
||||
for (Object key : keys) {
|
||||
if (key instanceof View) {
|
||||
views.add((View) key);
|
||||
}
|
||||
}
|
||||
views.sort(comparator);
|
||||
}
|
||||
List<View> views = solution.map.keySet().stream()
|
||||
.filter(View.class::isInstance)
|
||||
.map(View.class::cast)
|
||||
.collect(Collectors.toList());
|
||||
views.sort(comparator);
|
||||
for (View child : views) {
|
||||
if (child == ignoreView) continue;
|
||||
CellAndSpan c = solution.map.get(child);
|
||||
|
||||
@@ -104,12 +104,10 @@ public class ShortcutCachingLogic implements CachingLogic<ShortcutInfo> {
|
||||
* Launcher specific checks
|
||||
*/
|
||||
public static Drawable getIcon(Context context, ShortcutInfo shortcutInfo, int density) {
|
||||
if (!WIDGETS_ENABLED) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return context.getSystemService(LauncherApps.class)
|
||||
Drawable icon = context.getSystemService(LauncherApps.class)
|
||||
.getShortcutIconDrawable(shortcutInfo, density);
|
||||
return CustomAdaptiveIconDrawable.wrap(icon);
|
||||
} catch (SecurityException | IllegalStateException | NullPointerException e) {
|
||||
Log.e(TAG, "Failed to get shortcut icon", e);
|
||||
return null;
|
||||
|
||||
@@ -417,15 +417,8 @@ public class BaseLauncherBinder {
|
||||
|
||||
ModelWriter writer = mApp.getModel()
|
||||
.getWriter(false /* verifyChanges */, CellPosMapper.DEFAULT, null);
|
||||
List<Pair<ItemInfo, View>> bindItems = null;
|
||||
if (Utilities.ATLEAST_U) {
|
||||
bindItems = items.stream().map(i ->
|
||||
Pair.create(i, inflater.inflateItem(i, writer, null))).toList();
|
||||
} else {
|
||||
bindItems = items.stream().map(i ->
|
||||
List<Pair<ItemInfo, View>> finalBindItems = items.stream().map(i ->
|
||||
Pair.create(i, inflater.inflateItem(i, writer, null))).collect(Collectors.toList());
|
||||
}
|
||||
List<Pair<ItemInfo, View>> finalBindItems = bindItems;
|
||||
executeCallbacksTask(c -> c.bindInflatedItems(finalBindItems), executor);
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@ package com.android.launcher3.model
|
||||
import com.android.launcher3.LauncherAppState
|
||||
import com.android.launcher3.LauncherModel
|
||||
import com.android.launcher3.LauncherModel.CallbackTask
|
||||
import com.android.launcher3.Utilities
|
||||
import com.android.launcher3.celllayout.CellPosMapper
|
||||
import com.android.launcher3.model.BgDataModel.FixedContainerItems
|
||||
import com.android.launcher3.model.data.ItemInfo
|
||||
@@ -54,12 +53,7 @@ class ModelTaskController(
|
||||
|
||||
fun bindUpdatedWorkspaceItems(allUpdates: List<WorkspaceItemInfo>) {
|
||||
// Bind workspace items
|
||||
val workspaceUpdates: MutableList<WorkspaceItemInfo>
|
||||
if (Utilities.ATLEAST_U) {
|
||||
workspaceUpdates = allUpdates.stream().filter { info -> info.id != ItemInfo.NO_ID }.toList()
|
||||
} else {
|
||||
workspaceUpdates = allUpdates.stream().filter { info -> info.id != ItemInfo.NO_ID }.collect(Collectors.toList())
|
||||
}
|
||||
val workspaceUpdates: MutableList<WorkspaceItemInfo> = allUpdates.stream().filter { info -> info.id != ItemInfo.NO_ID }.collect(Collectors.toList())
|
||||
if (workspaceUpdates.isNotEmpty()) {
|
||||
scheduleCallbackTask { it.bindWorkspaceItemsChanged(workspaceUpdates) }
|
||||
}
|
||||
|
||||
@@ -94,12 +94,7 @@ public class WidgetsModel {
|
||||
Stream<WidgetItem> widgetItems = entry.getValue()
|
||||
.stream()
|
||||
.filter(widgetItemFilter);
|
||||
List<WidgetItem> widgetItemsList;
|
||||
if (Utilities.ATLEAST_U) {
|
||||
widgetItemsList = widgetItems.toList();
|
||||
} else {
|
||||
widgetItemsList = widgetItems.collect(toList());
|
||||
};
|
||||
List<WidgetItem> widgetItemsList = widgetItems.collect(toList());
|
||||
if (!widgetItemsList.isEmpty()) {
|
||||
String sectionName = (pkgItem.title == null) ? "" :
|
||||
indexer.computeSectionName(pkgItem.title);
|
||||
|
||||
@@ -31,6 +31,8 @@ import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPWIDG
|
||||
import static com.android.launcher3.provider.LauncherDbUtils.dropTable;
|
||||
import static com.android.launcher3.widget.LauncherWidgetHolder.APPWIDGET_HOST_ID;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import android.app.backup.BackupManager;
|
||||
import android.appwidget.AppWidgetHost;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
@@ -178,7 +180,7 @@ public class RestoreDbTask {
|
||||
// phone
|
||||
return LauncherFiles.GRID_DB_FILES.stream()
|
||||
.filter(dbName -> new File(dbName).exists())
|
||||
.toList();
|
||||
.collect(toList());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -18,6 +18,8 @@ package com.android.launcher3.widget.picker;
|
||||
|
||||
import static com.android.launcher3.widget.util.WidgetsTableUtils.groupWidgetItemsUsingRowPxWithoutReordering;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
@@ -318,7 +320,7 @@ public final class WidgetRecommendationsView extends PagedView<PageIndicatorDots
|
||||
// Show only those widgets that were displayed when user first opened the picker.
|
||||
if (!mDisplayedWidgets.isEmpty()) {
|
||||
filteredRecommendedWidgets = recommendedWidgets.stream().filter(
|
||||
w -> mDisplayedWidgets.contains(w.componentName)).toList();
|
||||
w -> mDisplayedWidgets.contains(w.componentName)).collect(toList());
|
||||
}
|
||||
Context context = getContext();
|
||||
LayoutInflater inflater = LayoutInflater.from(context);
|
||||
|
||||
@@ -21,6 +21,7 @@ import static com.android.launcher3.widget.util.WidgetSizes.getWidgetSizePx;
|
||||
import static com.android.launcher3.widget.util.WidgetsTableUtils.WIDGETS_TABLE_ROW_SIZE_COMPARATOR;
|
||||
|
||||
import static java.lang.Math.max;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
@@ -186,6 +187,6 @@ public final class WidgetsRecommendationTableLayout extends TableLayout {
|
||||
}
|
||||
|
||||
// Perform re-ordering once we have filtered out recommendations that fit.
|
||||
return filteredRows.stream().sorted(WIDGETS_TABLE_ROW_SIZE_COMPARATOR).toList();
|
||||
return filteredRows.stream().sorted(WIDGETS_TABLE_ROW_SIZE_COMPARATOR).collect(toList());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,11 +83,7 @@ public final class WidgetsTableUtils {
|
||||
sortedWidgetItems, context, dp, rowPx,
|
||||
cellPadding);
|
||||
Stream<ArrayList<WidgetItem>> sortedRows = rows.stream().sorted(WIDGETS_TABLE_ROW_SIZE_COMPARATOR);
|
||||
if (Utilities.ATLEAST_U) {
|
||||
return sortedRows.toList();
|
||||
} else {
|
||||
return sortedRows.collect(Collectors.toList());
|
||||
}
|
||||
return sortedRows.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -19,6 +19,8 @@ package com.android.app.viewcapture;
|
||||
import static com.android.app.viewcapture.data.ExportedData.MagicNumber.MAGIC_NUMBER_H;
|
||||
import static com.android.app.viewcapture.data.ExportedData.MagicNumber.MAGIC_NUMBER_L;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import android.content.ComponentCallbacks2;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
@@ -206,7 +208,7 @@ public abstract class ViewCapture {
|
||||
}
|
||||
|
||||
private static List<String> toStringList(List<Class> classList) {
|
||||
return classList.stream().map(Class::getName).toList();
|
||||
return classList.stream().map(Class::getName).collect(toList());
|
||||
}
|
||||
|
||||
public CompletableFuture<Optional<MotionWindowData>> getDumpTask(View view) {
|
||||
@@ -224,8 +226,8 @@ public abstract class ViewCapture {
|
||||
ArrayList<Class> outClassList, Predicate<WindowListener> filter) {
|
||||
ViewIdProvider idProvider = new ViewIdProvider(context.getResources());
|
||||
return CompletableFuture.supplyAsync(() ->
|
||||
mListeners.stream().filter(filter).toList(), MAIN_EXECUTOR).thenApplyAsync(it ->
|
||||
it.stream().map(l -> l.dumpToProto(idProvider, outClassList)).toList(),
|
||||
mListeners.stream().filter(filter).collect(toList()), MAIN_EXECUTOR).thenApplyAsync(it ->
|
||||
it.stream().map(l -> l.dumpToProto(idProvider, outClassList)).collect(toList()),
|
||||
mBgExecutor);
|
||||
}
|
||||
|
||||
|
||||
@@ -1516,7 +1516,7 @@ public class BubbleController implements ConfigurationChangeListener,
|
||||
}
|
||||
mOverflowDataLoadNeeded = false;
|
||||
List<UserInfo> users = mUserManager.getAliveUsers();
|
||||
List<Integer> userIds = users.stream().map(userInfo -> userInfo.id).toList();
|
||||
List<Integer> userIds = users.stream().map(userInfo -> userInfo.id).collect(Collectors.toList());
|
||||
mDataRepository.loadBubbles(mCurrentUserId, userIds, (bubbles) -> {
|
||||
bubbles.forEach(bubble -> {
|
||||
if (mBubbleData.hasAnyBubbleWithKey(bubble.getKey())) {
|
||||
|
||||
Reference in New Issue
Block a user