Merge "Add Kotlin-friendly SingleActivityFactory class" into udc-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
d785a3cdfa
@@ -11,9 +11,9 @@ import android.window.OnBackInvokedCallback
|
|||||||
import android.window.OnBackInvokedDispatcher
|
import android.window.OnBackInvokedDispatcher
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import androidx.test.rule.ActivityTestRule
|
import androidx.test.rule.ActivityTestRule
|
||||||
import androidx.test.runner.intercepting.SingleActivityFactory
|
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.activity.SingleActivityFactory
|
||||||
import com.android.systemui.controls.CustomIconCache
|
import com.android.systemui.controls.CustomIconCache
|
||||||
import com.android.systemui.controls.controller.ControlsControllerImpl
|
import com.android.systemui.controls.controller.ControlsControllerImpl
|
||||||
import com.android.systemui.flags.FakeFeatureFlags
|
import com.android.systemui.flags.FakeFeatureFlags
|
||||||
@@ -63,12 +63,8 @@ class ControlsEditingActivityTest : SysuiTestCase() {
|
|||||||
@JvmField
|
@JvmField
|
||||||
var activityRule =
|
var activityRule =
|
||||||
ActivityTestRule(
|
ActivityTestRule(
|
||||||
object :
|
/* activityFactory= */ SingleActivityFactory {
|
||||||
SingleActivityFactory<TestableControlsEditingActivity>(
|
TestableControlsEditingActivity(
|
||||||
TestableControlsEditingActivity::class.java
|
|
||||||
) {
|
|
||||||
override fun create(intent: Intent?): TestableControlsEditingActivity {
|
|
||||||
return TestableControlsEditingActivity(
|
|
||||||
featureFlags,
|
featureFlags,
|
||||||
uiExecutor,
|
uiExecutor,
|
||||||
controller,
|
controller,
|
||||||
@@ -77,10 +73,9 @@ class ControlsEditingActivityTest : SysuiTestCase() {
|
|||||||
mockDispatcher,
|
mockDispatcher,
|
||||||
latch
|
latch
|
||||||
)
|
)
|
||||||
}
|
|
||||||
},
|
},
|
||||||
false,
|
/* initialTouchMode= */ false,
|
||||||
false
|
/* launchActivity= */ false,
|
||||||
)
|
)
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ import android.window.OnBackInvokedDispatcher
|
|||||||
import androidx.test.filters.FlakyTest
|
import androidx.test.filters.FlakyTest
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import androidx.test.rule.ActivityTestRule
|
import androidx.test.rule.ActivityTestRule
|
||||||
import androidx.test.runner.intercepting.SingleActivityFactory
|
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.activity.SingleActivityFactory
|
||||||
import com.android.systemui.controls.ControlStatus
|
import com.android.systemui.controls.ControlStatus
|
||||||
import com.android.systemui.controls.ControlsServiceInfo
|
import com.android.systemui.controls.ControlsServiceInfo
|
||||||
import com.android.systemui.controls.controller.ControlsController
|
import com.android.systemui.controls.controller.ControlsController
|
||||||
@@ -91,12 +91,8 @@ class ControlsFavoritingActivityTest : SysuiTestCase() {
|
|||||||
@JvmField
|
@JvmField
|
||||||
var activityRule =
|
var activityRule =
|
||||||
ActivityTestRule(
|
ActivityTestRule(
|
||||||
object :
|
/* activityFactory= */ SingleActivityFactory {
|
||||||
SingleActivityFactory<TestableControlsFavoritingActivity>(
|
TestableControlsFavoritingActivity(
|
||||||
TestableControlsFavoritingActivity::class.java
|
|
||||||
) {
|
|
||||||
override fun create(intent: Intent?): TestableControlsFavoritingActivity {
|
|
||||||
return TestableControlsFavoritingActivity(
|
|
||||||
featureFlags,
|
featureFlags,
|
||||||
executor,
|
executor,
|
||||||
controller,
|
controller,
|
||||||
@@ -105,10 +101,9 @@ class ControlsFavoritingActivityTest : SysuiTestCase() {
|
|||||||
mockDispatcher,
|
mockDispatcher,
|
||||||
latch
|
latch
|
||||||
)
|
)
|
||||||
}
|
|
||||||
},
|
},
|
||||||
false,
|
/* initialTouchMode= */ false,
|
||||||
false
|
/* launchActivity= */ false,
|
||||||
)
|
)
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ import android.window.OnBackInvokedCallback
|
|||||||
import android.window.OnBackInvokedDispatcher
|
import android.window.OnBackInvokedDispatcher
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import androidx.test.rule.ActivityTestRule
|
import androidx.test.rule.ActivityTestRule
|
||||||
import androidx.test.runner.intercepting.SingleActivityFactory
|
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.activity.SingleActivityFactory
|
||||||
import com.android.systemui.controls.ControlsServiceInfo
|
import com.android.systemui.controls.ControlsServiceInfo
|
||||||
import com.android.systemui.controls.controller.ControlsController
|
import com.android.systemui.controls.controller.ControlsController
|
||||||
import com.android.systemui.controls.panels.AuthorizedPanelsRepository
|
import com.android.systemui.controls.panels.AuthorizedPanelsRepository
|
||||||
@@ -91,12 +91,8 @@ class ControlsProviderSelectorActivityTest : SysuiTestCase() {
|
|||||||
@JvmField
|
@JvmField
|
||||||
var activityRule =
|
var activityRule =
|
||||||
ActivityTestRule(
|
ActivityTestRule(
|
||||||
object :
|
/* activityFactory= */ SingleActivityFactory {
|
||||||
SingleActivityFactory<TestableControlsProviderSelectorActivity>(
|
TestableControlsProviderSelectorActivity(
|
||||||
TestableControlsProviderSelectorActivity::class.java
|
|
||||||
) {
|
|
||||||
override fun create(intent: Intent?): TestableControlsProviderSelectorActivity {
|
|
||||||
return TestableControlsProviderSelectorActivity(
|
|
||||||
executor,
|
executor,
|
||||||
backExecutor,
|
backExecutor,
|
||||||
listingController,
|
listingController,
|
||||||
@@ -107,10 +103,9 @@ class ControlsProviderSelectorActivityTest : SysuiTestCase() {
|
|||||||
mockDispatcher,
|
mockDispatcher,
|
||||||
latch
|
latch
|
||||||
)
|
)
|
||||||
}
|
|
||||||
},
|
},
|
||||||
false,
|
/* initialTouchMode= */ false,
|
||||||
false
|
/* launchActivity= */ false,
|
||||||
)
|
)
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ import android.testing.TestableLooper
|
|||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
import androidx.test.filters.MediumTest
|
import androidx.test.filters.MediumTest
|
||||||
import androidx.test.rule.ActivityTestRule
|
import androidx.test.rule.ActivityTestRule
|
||||||
import androidx.test.runner.intercepting.SingleActivityFactory
|
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.activity.SingleActivityFactory
|
||||||
import com.android.systemui.controls.controller.ControlInfo
|
import com.android.systemui.controls.controller.ControlInfo
|
||||||
import com.android.systemui.controls.controller.ControlsController
|
import com.android.systemui.controls.controller.ControlsController
|
||||||
import com.android.systemui.settings.UserTracker
|
import com.android.systemui.settings.UserTracker
|
||||||
@@ -81,19 +81,18 @@ class ControlsRequestDialogTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
@JvmField
|
@JvmField
|
||||||
var activityRule = ActivityTestRule<TestControlsRequestDialog>(
|
var activityRule = ActivityTestRule(
|
||||||
object : SingleActivityFactory<TestControlsRequestDialog>(
|
/* activityFactory= */ SingleActivityFactory {
|
||||||
TestControlsRequestDialog::class.java
|
TestControlsRequestDialog(
|
||||||
) {
|
|
||||||
override fun create(intent: Intent?): TestControlsRequestDialog {
|
|
||||||
return TestControlsRequestDialog(
|
|
||||||
mainExecutor,
|
mainExecutor,
|
||||||
controller,
|
controller,
|
||||||
userTracker,
|
userTracker,
|
||||||
listingController
|
listingController
|
||||||
)
|
)
|
||||||
}
|
},
|
||||||
}, false, false)
|
/* initialTouchMode= */ false,
|
||||||
|
/* launchActivity= */ false,
|
||||||
|
)
|
||||||
|
|
||||||
private lateinit var control: Control
|
private lateinit var control: Control
|
||||||
|
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ import android.testing.AndroidTestingRunner
|
|||||||
import android.testing.TestableLooper
|
import android.testing.TestableLooper
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import androidx.test.rule.ActivityTestRule
|
import androidx.test.rule.ActivityTestRule
|
||||||
import androidx.test.runner.intercepting.SingleActivityFactory
|
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.activity.SingleActivityFactory
|
||||||
import com.android.systemui.broadcast.BroadcastDispatcher
|
import com.android.systemui.broadcast.BroadcastDispatcher
|
||||||
import com.android.systemui.controls.settings.ControlsSettingsDialogManager
|
import com.android.systemui.controls.settings.ControlsSettingsDialogManager
|
||||||
import com.android.systemui.flags.FeatureFlags
|
import com.android.systemui.flags.FeatureFlags
|
||||||
@@ -53,12 +53,8 @@ class ControlsActivityTest : SysuiTestCase() {
|
|||||||
@JvmField
|
@JvmField
|
||||||
var activityRule =
|
var activityRule =
|
||||||
ActivityTestRule(
|
ActivityTestRule(
|
||||||
object :
|
/* activityFactory= */ SingleActivityFactory {
|
||||||
SingleActivityFactory<TestableControlsActivity>(
|
TestableControlsActivity(
|
||||||
TestableControlsActivity::class.java
|
|
||||||
) {
|
|
||||||
override fun create(intent: Intent?): TestableControlsActivity {
|
|
||||||
return TestableControlsActivity(
|
|
||||||
uiController,
|
uiController,
|
||||||
broadcastDispatcher,
|
broadcastDispatcher,
|
||||||
dreamManager,
|
dreamManager,
|
||||||
@@ -66,10 +62,9 @@ class ControlsActivityTest : SysuiTestCase() {
|
|||||||
controlsSettingsDialogManager,
|
controlsSettingsDialogManager,
|
||||||
keyguardStateController,
|
keyguardStateController,
|
||||||
)
|
)
|
||||||
}
|
|
||||||
},
|
},
|
||||||
false,
|
/* initialTouchMode= */ false,
|
||||||
false
|
/* launchActivity= */ false,
|
||||||
)
|
)
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
|||||||
@@ -22,9 +22,9 @@ import android.testing.AndroidTestingRunner
|
|||||||
import android.testing.TestableLooper
|
import android.testing.TestableLooper
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import androidx.test.rule.ActivityTestRule
|
import androidx.test.rule.ActivityTestRule
|
||||||
import androidx.test.runner.intercepting.SingleActivityFactory
|
|
||||||
import com.android.dx.mockito.inline.extended.ExtendedMockito.verify
|
import com.android.dx.mockito.inline.extended.ExtendedMockito.verify
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.activity.SingleActivityFactory
|
||||||
import com.android.systemui.notetask.LaunchNotesRoleSettingsTrampolineActivity.Companion.ACTION_MANAGE_NOTES_ROLE_FROM_QUICK_AFFORDANCE
|
import com.android.systemui.notetask.LaunchNotesRoleSettingsTrampolineActivity.Companion.ACTION_MANAGE_NOTES_ROLE_FROM_QUICK_AFFORDANCE
|
||||||
import com.android.systemui.notetask.NoteTaskEntryPoint.QUICK_AFFORDANCE
|
import com.android.systemui.notetask.NoteTaskEntryPoint.QUICK_AFFORDANCE
|
||||||
import com.android.systemui.util.mockito.any
|
import com.android.systemui.util.mockito.any
|
||||||
@@ -47,12 +47,8 @@ class LaunchNotesRoleSettingsTrampolineActivityTest : SysuiTestCase() {
|
|||||||
@Rule
|
@Rule
|
||||||
@JvmField
|
@JvmField
|
||||||
val activityRule =
|
val activityRule =
|
||||||
ActivityTestRule<LaunchNotesRoleSettingsTrampolineActivity>(
|
ActivityTestRule(
|
||||||
/* activityFactory= */ object :
|
/* activityFactory= */ SingleActivityFactory {
|
||||||
SingleActivityFactory<LaunchNotesRoleSettingsTrampolineActivity>(
|
|
||||||
LaunchNotesRoleSettingsTrampolineActivity::class.java
|
|
||||||
) {
|
|
||||||
override fun create(intent: Intent?) =
|
|
||||||
LaunchNotesRoleSettingsTrampolineActivity(noteTaskController)
|
LaunchNotesRoleSettingsTrampolineActivity(noteTaskController)
|
||||||
},
|
},
|
||||||
/* initialTouchMode= */ false,
|
/* initialTouchMode= */ false,
|
||||||
|
|||||||
@@ -16,14 +16,13 @@
|
|||||||
|
|
||||||
package com.android.systemui.notetask.shortcut
|
package com.android.systemui.notetask.shortcut
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import android.testing.AndroidTestingRunner
|
import android.testing.AndroidTestingRunner
|
||||||
import android.testing.TestableLooper
|
import android.testing.TestableLooper
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import androidx.test.rule.ActivityTestRule
|
import androidx.test.rule.ActivityTestRule
|
||||||
import androidx.test.runner.intercepting.SingleActivityFactory
|
|
||||||
import com.android.dx.mockito.inline.extended.ExtendedMockito.verify
|
import com.android.dx.mockito.inline.extended.ExtendedMockito.verify
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.activity.SingleActivityFactory
|
||||||
import com.android.systemui.notetask.NoteTaskController
|
import com.android.systemui.notetask.NoteTaskController
|
||||||
import com.android.systemui.notetask.NoteTaskEntryPoint
|
import com.android.systemui.notetask.NoteTaskEntryPoint
|
||||||
import com.android.systemui.util.mockito.any
|
import com.android.systemui.util.mockito.any
|
||||||
@@ -47,12 +46,8 @@ class LaunchNoteTaskActivityTest : SysuiTestCase() {
|
|||||||
@JvmField
|
@JvmField
|
||||||
val activityRule =
|
val activityRule =
|
||||||
ActivityTestRule<LaunchNoteTaskActivity>(
|
ActivityTestRule<LaunchNoteTaskActivity>(
|
||||||
/* activityFactory= */ object :
|
/* activityFactory= */ SingleActivityFactory {
|
||||||
SingleActivityFactory<LaunchNoteTaskActivity>(LaunchNoteTaskActivity::class.java) {
|
LaunchNoteTaskActivity(controller = noteTaskController)
|
||||||
override fun create(intent: Intent?) =
|
|
||||||
LaunchNoteTaskActivity(
|
|
||||||
controller = noteTaskController,
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
/* initialTouchMode= */ false,
|
/* initialTouchMode= */ false,
|
||||||
/* launchActivity= */ false,
|
/* launchActivity= */ false,
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package com.android.systemui.settings.brightness
|
package com.android.systemui.settings.brightness
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.testing.AndroidTestingRunner
|
import android.testing.AndroidTestingRunner
|
||||||
@@ -25,9 +24,9 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import androidx.test.rule.ActivityTestRule
|
import androidx.test.rule.ActivityTestRule
|
||||||
import androidx.test.runner.intercepting.SingleActivityFactory
|
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.activity.SingleActivityFactory
|
||||||
import com.android.systemui.settings.FakeDisplayTracker
|
import com.android.systemui.settings.FakeDisplayTracker
|
||||||
import com.android.systemui.settings.UserTracker
|
import com.android.systemui.settings.UserTracker
|
||||||
import com.android.systemui.util.mockito.any
|
import com.android.systemui.util.mockito.any
|
||||||
@@ -59,19 +58,17 @@ class BrightnessDialogTest : SysuiTestCase() {
|
|||||||
@JvmField
|
@JvmField
|
||||||
var activityRule =
|
var activityRule =
|
||||||
ActivityTestRule(
|
ActivityTestRule(
|
||||||
object : SingleActivityFactory<TestDialog>(TestDialog::class.java) {
|
/* activityFactory= */ SingleActivityFactory {
|
||||||
override fun create(intent: Intent?): TestDialog {
|
TestDialog(
|
||||||
return TestDialog(
|
|
||||||
userTracker,
|
userTracker,
|
||||||
displayTracker,
|
displayTracker,
|
||||||
brightnessSliderControllerFactory,
|
brightnessSliderControllerFactory,
|
||||||
mainExecutor,
|
mainExecutor,
|
||||||
backgroundHandler
|
backgroundHandler
|
||||||
)
|
)
|
||||||
}
|
|
||||||
},
|
},
|
||||||
false,
|
/* initialTouchMode= */ false,
|
||||||
false
|
/* launchActivity= */ false,
|
||||||
)
|
)
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ import android.testing.TestableLooper
|
|||||||
import android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
|
import android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import androidx.test.rule.ActivityTestRule
|
import androidx.test.rule.ActivityTestRule
|
||||||
import androidx.test.runner.intercepting.SingleActivityFactory
|
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.activity.SingleActivityFactory
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@@ -49,19 +49,17 @@ class UsbPermissionActivityTest : SysuiTestCase() {
|
|||||||
|
|
||||||
open class UsbPermissionActivityTestable @Inject constructor (
|
open class UsbPermissionActivityTestable @Inject constructor (
|
||||||
val message: UsbAudioWarningDialogMessage
|
val message: UsbAudioWarningDialogMessage
|
||||||
)
|
) : UsbPermissionActivity(UsbAudioWarningDialogMessage())
|
||||||
: UsbPermissionActivity(UsbAudioWarningDialogMessage())
|
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
@JvmField
|
@JvmField
|
||||||
var activityRule = ActivityTestRule<UsbPermissionActivityTestable>(
|
var activityRule = ActivityTestRule(
|
||||||
object : SingleActivityFactory<UsbPermissionActivityTestable>(
|
/* activityFactory= */ SingleActivityFactory {
|
||||||
UsbPermissionActivityTestable::class.java
|
UsbPermissionActivityTestable(mMessage)
|
||||||
) {
|
},
|
||||||
override fun create(intent: Intent?): UsbPermissionActivityTestable {
|
/* initialTouchMode= */ false,
|
||||||
return UsbPermissionActivityTestable(mMessage)
|
/* launchActivity= */ false,
|
||||||
}
|
)
|
||||||
}, false, false)
|
|
||||||
|
|
||||||
private val activityIntent = Intent(mContext, UsbPermissionActivityTestable::class.java)
|
private val activityIntent = Intent(mContext, UsbPermissionActivityTestable::class.java)
|
||||||
.apply {
|
.apply {
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 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.activity
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Intent
|
||||||
|
import androidx.test.runner.intercepting.SingleActivityFactory
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a new [SingleActivityFactory] which delegating any call of [SingleActivityFactory.create]
|
||||||
|
* to the [instantiate] parameter.
|
||||||
|
*
|
||||||
|
* For more details, see [SingleActivityFactory].
|
||||||
|
*/
|
||||||
|
inline fun <reified T : Activity> SingleActivityFactory(
|
||||||
|
crossinline instantiate: (intent: Intent?) -> T,
|
||||||
|
): SingleActivityFactory<T> {
|
||||||
|
return object : SingleActivityFactory<T>(T::class.java) {
|
||||||
|
override fun create(intent: Intent?): T = instantiate(intent)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user