mirror of
				https://github.com/edubart/otclient.git
				synced 2025-11-04 04:36:23 +01:00 
			
		
		
		
	Compiling and running on android, but the window is black when run (bug)
This commit is contained in:
		@@ -228,11 +228,11 @@ message(STATUS "LuaJIT: " ${LUAJIT})
 | 
			
		||||
 | 
			
		||||
find_package(PhysFS REQUIRED)
 | 
			
		||||
find_package(OpenSSL REQUIRED)
 | 
			
		||||
find_package(ZLIB REQUIRED)
 | 
			
		||||
 | 
			
		||||
if(NOT ANDROID)
 | 
			
		||||
    find_package(ZLIB REQUIRED)
 | 
			
		||||
else()
 | 
			
		||||
    set(framework_LIBRARIES ${framework_LIBRARIES} z android log)
 | 
			
		||||
if(ANDROID)
 | 
			
		||||
    set(framework_LIBRARIES ${framework_LIBRARIES} android log)
 | 
			
		||||
    find_package(SDL2 REQUIRED)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
set(framework_LIBRARIES ${framework_LIBRARIES}
 | 
			
		||||
@@ -251,6 +251,11 @@ set(framework_INCLUDE_DIRS ${framework_INCLUDE_DIRS}
 | 
			
		||||
    ${framework_INCLUDE_DIRS}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if(ANDROID)
 | 
			
		||||
    set(framework_LIBRARIES ${framework_LIBRARIES} ${SDL2_LIBRARY})
 | 
			
		||||
    set(framework_INCLUDE_DIRS ${framework_INCLUDE_DIRS} ${SDL2_INCLUDE_DIR})
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
 | 
			
		||||
    message(STATUS "Debug information: ON")
 | 
			
		||||
else()
 | 
			
		||||
@@ -306,25 +311,17 @@ endif()
 | 
			
		||||
if(FRAMEWORK_GRAPHICS)
 | 
			
		||||
    set(OPENGLES "OFF" CACHE "Use OpenGL ES 1.0 or 2.0 (for mobiles devices)" STRING)
 | 
			
		||||
    if(OPENGLES STREQUAL "2.0" OR (ANDROID_NATIVE_API_LEVEL AND ANDROID_NATIVE_API_LEVEL VERSION_GREATER 7))
 | 
			
		||||
        if(NOT ANDROID)
 | 
			
		||||
            find_package(OpenGLES2 REQUIRED)
 | 
			
		||||
            find_package(EGL REQUIRED)
 | 
			
		||||
            set(framework_INCLUDE_DIRS ${framework_INCLUDE_DIRS} ${EGL_INCLUDE_DIR} ${OPENGLES2_INCLUDE_DIR})
 | 
			
		||||
            set(framework_LIBRARIES ${framework_LIBRARIES} ${EGL_LIBRARY} ${OPENGLES2_LIBRARY})
 | 
			
		||||
        else()
 | 
			
		||||
            set(framework_LIBRARIES ${framework_LIBRARIES} GLESv2)
 | 
			
		||||
        endif()
 | 
			
		||||
        find_package(OpenGLES2 REQUIRED)
 | 
			
		||||
        find_package(EGL REQUIRED)
 | 
			
		||||
        set(framework_DEFINITIONS ${framework_DEFINITIONS} -DOPENGL_ES=2)
 | 
			
		||||
        set(framework_INCLUDE_DIRS ${framework_INCLUDE_DIRS} ${EGL_INCLUDE_DIR} ${OPENGLES2_INCLUDE_DIR})
 | 
			
		||||
        set(framework_LIBRARIES ${framework_LIBRARIES} ${EGL_LIBRARY} ${OPENGLES2_LIBRARY})
 | 
			
		||||
    ELSEif(OPENGLES STREQUAL "1.0" OR (ANDROID_NATIVE_API_LEVEL AND ANDROID_NATIVE_API_LEVEL VERSION_LESS 8))
 | 
			
		||||
        if(NOT ANDROID)
 | 
			
		||||
            find_package(OpenGLES1 REQUIRED)
 | 
			
		||||
            find_package(EGL REQUIRED)
 | 
			
		||||
            set(framework_INCLUDE_DIRS ${framework_INCLUDE_DIRS} ${EGL_INCLUDE_DIR} ${OPENGLES1_INCLUDE_DIR})
 | 
			
		||||
            set(framework_LIBRARIES ${framework_LIBRARIES} ${EGL_LIBRARY} ${OPENGLES1_LIBRARY})
 | 
			
		||||
        else()
 | 
			
		||||
            set(framework_LIBRARIES ${framework_LIBRARIES} GLESv1_CM)
 | 
			
		||||
        endif()
 | 
			
		||||
        find_package(OpenGLES1 REQUIRED)
 | 
			
		||||
        find_package(EGL REQUIRED)
 | 
			
		||||
        set(framework_DEFINITIONS ${framework_DEFINITIONS} -DOPENGL_ES=1)
 | 
			
		||||
        set(framework_INCLUDE_DIRS ${framework_INCLUDE_DIRS} ${EGL_INCLUDE_DIR} ${OPENGLES1_INCLUDE_DIR})
 | 
			
		||||
        set(framework_LIBRARIES ${framework_LIBRARIES} ${EGL_LIBRARY} ${OPENGLES1_LIBRARY})
 | 
			
		||||
    else()
 | 
			
		||||
        ## TODO: CMake Documentation says that this is not the right
 | 
			
		||||
        # Thing for Mac OS X, but it works for now.
 | 
			
		||||
@@ -361,7 +358,7 @@ if(FRAMEWORK_GRAPHICS)
 | 
			
		||||
                ${CMAKE_CURRENT_LIST_DIR}/graphics/dx/painterdx9.h
 | 
			
		||||
            )
 | 
			
		||||
        endif()
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    elseif(NOT ANDROID)
 | 
			
		||||
        set(framework_LIBRARIES ${framework_LIBRARIES} X11)
 | 
			
		||||
    endif()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								src/framework/cmake/FindSDL2.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/framework/cmake/FindSDL2.cmake
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
# Try to find the SDL2 library
 | 
			
		||||
#  SDL2_FOUND - system has SDL2
 | 
			
		||||
#  SDL2_INCLUDE_DIR - the SDL2 include directory
 | 
			
		||||
#  SDL2_LIBRARY - the SDL2 library
 | 
			
		||||
 | 
			
		||||
FIND_PATH(SDL2_INCLUDE_DIR NAMES SDL.h PATH_SUFFIXES sdl2)
 | 
			
		||||
SET(_SDL2_STATIC_LIBS libSDL2.a)
 | 
			
		||||
SET(_SDL2_SHARED_LIBS libSDL2.so SDL2)
 | 
			
		||||
FIND_LIBRARY(SDL2_LIBRARY NAMES ${_SDL2_SHARED_LIBS} ${_SDL2_STATIC_LIBS})
 | 
			
		||||
INCLUDE(FindPackageHandleStandardArgs)
 | 
			
		||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 DEFAULT_MSG SDL2_LIBRARY SDL2_INCLUDE_DIR)
 | 
			
		||||
MARK_AS_ADVANCED(SDL2_LIBRARY SDL2_INCLUDE_DIR)
 | 
			
		||||
@@ -177,6 +177,8 @@ std::string Application::getOs()
 | 
			
		||||
    return "mac";
 | 
			
		||||
#elif __linux
 | 
			
		||||
    return "linux";
 | 
			
		||||
#elif defined ANDROID
 | 
			
		||||
    return "android";
 | 
			
		||||
#else
 | 
			
		||||
    return "unknown";
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,10 @@
 | 
			
		||||
#include <framework/luaengine/luainterface.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef ANDROID
 | 
			
		||||
#include <android/log.h>
 | 
			
		||||
#endif // ANDROID
 | 
			
		||||
 | 
			
		||||
Logger g_logger;
 | 
			
		||||
 | 
			
		||||
void Logger::log(Fw::LogLevel level, const std::string& message)
 | 
			
		||||
@@ -66,6 +70,9 @@ void Logger::log(Fw::LogLevel level, const std::string& message)
 | 
			
		||||
        outmsg = tmp.str();
 | 
			
		||||
#endif
 | 
			
		||||
    */
 | 
			
		||||
#ifdef ANDROID
 | 
			
		||||
    __android_log_print(ANDROID_LOG_INFO, "OTClientMobile", outmsg.c_str());
 | 
			
		||||
#endif // ANDROID
 | 
			
		||||
 | 
			
		||||
    std::cout << outmsg << std::endl;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,8 @@ bool ResourceManager::discoverWorkDir(const std::string& existentFile)
 | 
			
		||||
    std::string possiblePaths[] = { g_platform.getCurrentDir(),
 | 
			
		||||
                                    g_resources.getBaseDir(),
 | 
			
		||||
                                    g_resources.getBaseDir() + "../",
 | 
			
		||||
                                    g_resources.getBaseDir() + "../share/" + g_app.getCompactName() + "/" };
 | 
			
		||||
                                    g_resources.getBaseDir() + "../share/" + g_app.getCompactName() + "/",
 | 
			
		||||
                                    "/sdcard/OTClient/" };
 | 
			
		||||
 | 
			
		||||
    bool found = false;
 | 
			
		||||
    for(const std::string& dir : possiblePaths) {
 | 
			
		||||
@@ -71,12 +72,20 @@ bool ResourceManager::setupUserWriteDir(const std::string& appWriteDirName)
 | 
			
		||||
{
 | 
			
		||||
    std::string userDir = getUserDir();
 | 
			
		||||
    std::string dirName;
 | 
			
		||||
 | 
			
		||||
#ifndef WIN32
 | 
			
		||||
    dirName = stdext::format(".%s", appWriteDirName);
 | 
			
		||||
#else
 | 
			
		||||
    dirName = appWriteDirName;
 | 
			
		||||
#endif
 | 
			
		||||
    std::string writeDir = userDir + dirName;
 | 
			
		||||
 | 
			
		||||
    std::string writeDir;
 | 
			
		||||
 | 
			
		||||
#ifdef ANDROID
 | 
			
		||||
    writeDir = getWorkDir();
 | 
			
		||||
#else
 | 
			
		||||
    writeDir = userDir + dirName;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    if(!PHYSFS_setWriteDir(writeDir.c_str())) {
 | 
			
		||||
        if(!PHYSFS_setWriteDir(userDir.c_str()) || !PHYSFS_mkdir(dirName.c_str())) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,120 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2010-2014 OTClient <https://github.com/edubart/otclient>
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
 * in the Software without restriction, including without limitation the rights
 | 
			
		||||
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
 * copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
 * THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef ANDROID
 | 
			
		||||
 | 
			
		||||
#include "sdlwindow.h"
 | 
			
		||||
 | 
			
		||||
SDLWindow::SDLWindow() {
 | 
			
		||||
    m_window = 0;
 | 
			
		||||
    m_cursor = 0;
 | 
			
		||||
    m_minimumSize = Size(600,480);
 | 
			
		||||
    m_size = Size(600,480);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::init() {
 | 
			
		||||
    window = 0;
 | 
			
		||||
    gl = 0;
 | 
			
		||||
 | 
			
		||||
    initializeSDL();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::initializeSDL() {
 | 
			
		||||
    if(SDL_Init(SDL_INIT_VIDEO) != 0 ) {
 | 
			
		||||
        g_logger.fatal( stdext::format("Unable to initialize SDL: %s", SDL_GetError()) );
 | 
			
		||||
        terminate();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setSDLAttributes();
 | 
			
		||||
 | 
			
		||||
    SDL_GetDisplayMode( 0, 0, &mode );
 | 
			
		||||
    int width = mode.w;
 | 
			
		||||
    int height = mode.h;
 | 
			
		||||
 | 
			
		||||
    window = SDL_CreateWindow( NULL, 0, 0, width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN | SDL_WINDOW_RESIZABLE );
 | 
			
		||||
 | 
			
		||||
    if( window == 0 ) {
 | 
			
		||||
        g_logger.fatal("Failed to create window");
 | 
			
		||||
        terminate();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    gl = SDL_GL_CreateContext(window);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::setSDLAttributes() {
 | 
			
		||||
    SDL_LogSetAllPriority(SDL_LOG_PRIORITY_VERBOSE);
 | 
			
		||||
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 4);
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 4);
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 4);
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 4);
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, OPENGL_ES);
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
 | 
			
		||||
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::terminate() {
 | 
			
		||||
    SDL_Quit();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::hide() {
 | 
			
		||||
    // TODO?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::poll() {
 | 
			
		||||
    // TODO
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::swapBuffers() {
 | 
			
		||||
    SDL_GL_SwapWindow(window);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::setVerticalSync(bool enable) {
 | 
			
		||||
    // TODO
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string SDLWindow::getClipboardText() {
 | 
			
		||||
    return SDL_GetClipboardText();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::setClipboardText(const std::string& text) {
 | 
			
		||||
    SDL_SetClipboardText(text.c_str());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Size SDLWindow::getDisplaySize() {
 | 
			
		||||
    Size size(mode.w, mode.h);
 | 
			
		||||
    return size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string SDLWindow::getPlatformType() {
 | 
			
		||||
    return "Android";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::show() {
 | 
			
		||||
    // android doesn't need to show activity, it's open automatically
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::maximize() {
 | 
			
		||||
    // android doesn't has window
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::move(const Point& pos) {
 | 
			
		||||
@@ -21,25 +125,6 @@ void SDLWindow::resize(const Size& size) {
 | 
			
		||||
    // android doesn't resize window
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::show() {
 | 
			
		||||
    // android doesn't need to show activity, it's open automacally
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::hide() {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::maximize() {
 | 
			
		||||
    // android doesn't has window
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::poll() {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::swapBuffers() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::showMouse() {
 | 
			
		||||
    // android doesn't has mouse
 | 
			
		||||
}
 | 
			
		||||
@@ -73,26 +158,8 @@ void SDLWindow::setFullscreen(bool fullscreen) {
 | 
			
		||||
    // android doesn't has window
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::setVerticalSync(bool enable) {
 | 
			
		||||
    // TODO
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::setIcon(const std::string& iconFile) {
 | 
			
		||||
    // android doesn't has window
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDLWindow::setClipboardText(const std::string& text) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Size SDLWindow::getDisplaySize() {
 | 
			
		||||
    Size TODO;
 | 
			
		||||
    return TODO;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string SDLWindow::getClipboardText() {
 | 
			
		||||
    return "";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string SDLWindow::getPlatformType() {
 | 
			
		||||
    return "Android";
 | 
			
		||||
}
 | 
			
		||||
#endif // ANDROID
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,37 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2010-2014 OTClient <https://github.com/edubart/otclient>
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
 * in the Software without restriction, including without limitation the rights
 | 
			
		||||
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
 * copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
 * THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef SDL_PLATFORM_H
 | 
			
		||||
#define SDL_PLATFORM_H
 | 
			
		||||
 | 
			
		||||
#include "platformwindow.h"
 | 
			
		||||
 | 
			
		||||
#ifdef OPENGL_ES
 | 
			
		||||
#include <EGL/egl.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <SDL.h>
 | 
			
		||||
 | 
			
		||||
class SDLWindow : public PlatformWindow
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    SDLWindow();
 | 
			
		||||
 | 
			
		||||
    void init();
 | 
			
		||||
    void terminate();
 | 
			
		||||
 | 
			
		||||
@@ -36,8 +58,15 @@ public:
 | 
			
		||||
    Size getDisplaySize();
 | 
			
		||||
    std::string getClipboardText();
 | 
			
		||||
    std::string getPlatformType();
 | 
			
		||||
 | 
			
		||||
    void initializeSDL();
 | 
			
		||||
    void setSDLAttributes();
 | 
			
		||||
protected:
 | 
			
		||||
    int internalLoadMouseCursor(const ImagePtr& image, const Point& hotSpot);
 | 
			
		||||
private:
 | 
			
		||||
    SDL_Window* window;
 | 
			
		||||
    SDL_GLContext gl;
 | 
			
		||||
    SDL_DisplayMode mode;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user