Correctly expand list of nearby people to the entire height of the screen.
If the device is small, then the "Conenct and trade apps with people near you" header takes up too much space and we end up not being able to see any nearby people at all, even if they are in the list. As such, this also removes that header for "small" and "ldpi" devices. During testing I found that "small" was not enough, because a 240x400 screen is considered "medium" and there is not enough space. ldpi seems to be a reasonable metric for "that header is going to be taking valuable space and should not be shown then". All larger devices retain the header and seem to look nice. This also pushes the "Can't find what you're looking for?" message and associated buttons right to the bottom of the screen. This is more in line with the original design. Fixes #604.
This commit is contained in:
parent
571dfa8e1d
commit
8d742b7e30
@ -26,7 +26,7 @@ import android.widget.CompoundButton;
|
|||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.ScrollView;
|
import android.widget.RelativeLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.fdroid.fdroid.FDroidApp;
|
import org.fdroid.fdroid.FDroidApp;
|
||||||
@ -42,7 +42,7 @@ import cc.mvdan.accesspoint.WifiApControl;
|
|||||||
import rx.Subscriber;
|
import rx.Subscriber;
|
||||||
import rx.Subscription;
|
import rx.Subscription;
|
||||||
|
|
||||||
public class StartSwapView extends ScrollView implements SwapWorkflowActivity.InnerView {
|
public class StartSwapView extends RelativeLayout implements SwapWorkflowActivity.InnerView {
|
||||||
|
|
||||||
private static final String TAG = "StartSwapView";
|
private static final String TAG = "StartSwapView";
|
||||||
|
|
||||||
|
7
app/src/main/res/layout-ldpi/start_swap_header.xml
Normal file
7
app/src/main/res/layout-ldpi/start_swap_header.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/header"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentTop="true">
|
||||||
|
</RelativeLayout>
|
7
app/src/main/res/layout-small/start_swap_header.xml
Normal file
7
app/src/main/res/layout-small/start_swap_header.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/header"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentTop="true">
|
||||||
|
</RelativeLayout>
|
32
app/src/main/res/layout/start_swap_header.xml
Normal file
32
app/src/main/res/layout/start_swap_header.xml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/header"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="130dp"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
tools:showIn="@layout/swap_blank">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:scaleType="centerCrop"
|
||||||
|
android:src="@drawable/swap_start_header" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:padding="20dp"
|
||||||
|
android:paddingLeft="30dp"
|
||||||
|
android:paddingRight="30dp"
|
||||||
|
android:paddingEnd="30dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:textAlignment="center"
|
||||||
|
android:text="@string/swap_intro"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="18sp"
|
||||||
|
tools:ignore="UnusedAttribute" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
@ -9,232 +9,202 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".views.swap.SwapWorkflowActivity">
|
||||||
|
|
||||||
|
<!-- Misc header -->
|
||||||
|
<include layout="@layout/start_swap_header" />
|
||||||
|
|
||||||
|
<!-- Bluetooth swap status + toggle -->
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
android:id="@+id/bluetooth_info"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical">
|
android:layout_below="@id/header"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<RelativeLayout
|
<ImageView
|
||||||
android:id="@+id/header"
|
android:layout_width="24dp"
|
||||||
android:layout_width="match_parent"
|
android:layout_height="24dp"
|
||||||
android:layout_height="130dp">
|
android:tint="@color/swap_grey_icon"
|
||||||
|
android:src="@drawable/ic_bluetooth_white" />
|
||||||
|
|
||||||
<ImageView
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="0dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="wrap_content"
|
||||||
android:scaleType="centerCrop"
|
android:orientation="vertical"
|
||||||
android:src="@drawable/swap_start_header"/>
|
android:paddingLeft="15dp"
|
||||||
|
android:paddingStart="15dp"
|
||||||
<!--
|
android:layout_weight="1.00"
|
||||||
Removed for now, because there is no UI to hook this up to.
|
tools:ignore="RtlSymmetry">
|
||||||
However, the general principle of having a help screen made accessible from the
|
|
||||||
start swap screen is still desirable, and so should be revisited in the future.
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="24dp"
|
|
||||||
android:layout_height="24dp"
|
|
||||||
android:src="@drawable/ic_info_white"
|
|
||||||
android:layout_alignParentRight="true"
|
|
||||||
android:layout_alignParentEnd="true"
|
|
||||||
android:layout_alignParentTop="true"
|
|
||||||
android:layout_marginRight="10dp"
|
|
||||||
android:layout_marginEnd="10dp"
|
|
||||||
android:layout_marginTop="10dp"
|
|
||||||
/>-->
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
android:id="@+id/bluetooth_visible"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_centerHorizontal="true"
|
tools:text="@string/swap_visible_bluetooth"
|
||||||
android:layout_alignParentBottom="true"
|
android:textSize="18sp" />
|
||||||
android:padding="20dp"
|
|
||||||
android:paddingLeft="30dp"
|
|
||||||
android:paddingRight="30dp"
|
|
||||||
android:paddingEnd="30dp"
|
|
||||||
android:gravity="center"
|
|
||||||
android:textAlignment="center"
|
|
||||||
android:text="@string/swap_intro"
|
|
||||||
android:textColor="@android:color/white"
|
|
||||||
android:textSize="18sp"
|
|
||||||
tools:ignore="UnusedAttribute" />
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/bluetooth_info"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:padding="10dp"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="24dp"
|
|
||||||
android:layout_height="24dp"
|
|
||||||
android:tint="@color/swap_grey_icon"
|
|
||||||
android:src="@drawable/ic_bluetooth_white" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:paddingLeft="15dp"
|
|
||||||
android:paddingStart="15dp"
|
|
||||||
android:layout_weight="1.00"
|
|
||||||
tools:ignore="RtlSymmetry">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/bluetooth_visible"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
tools:text="@string/swap_visible_bluetooth"
|
|
||||||
android:textSize="18sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/device_id_bluetooth"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
tools:text="SP-120"
|
|
||||||
android:textColor="@color/swap_light_text" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<android.support.v7.widget.SwitchCompat
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
tools:checked="true"
|
|
||||||
android:id="@+id/switch_bluetooth" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:padding="10dp"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="24dp"
|
|
||||||
android:layout_height="24dp"
|
|
||||||
android:tint="@color/swap_grey_icon"
|
|
||||||
android:src="@drawable/ic_network_wifi_white" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:paddingLeft="15dp"
|
|
||||||
android:paddingStart="15dp"
|
|
||||||
android:layout_weight="1.00"
|
|
||||||
tools:ignore="RtlSymmetry">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/wifi_visible"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
tools:text="@string/swap_not_visible_wifi"
|
|
||||||
android:textSize="18sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/device_id_wifi"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/swap_wifi_device_name"
|
|
||||||
android:textColor="@color/swap_light_text" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/wifi_network"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
tools:text="wifi network name"
|
|
||||||
android:textColor="@color/swap_bright_blue"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<android.support.v7.widget.SwitchCompat
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
tools:checked="false"
|
|
||||||
android:id="@+id/switch_wifi" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingStart="20dp"
|
|
||||||
android:paddingEnd="20dp"
|
|
||||||
android:paddingBottom="5dp"
|
|
||||||
android:paddingTop="20dp">
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/text_people_nearby"
|
android:id="@+id/device_id_bluetooth"
|
||||||
android:layout_width="0dp"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/swap_people_nearby"
|
tools:text="SP-120"
|
||||||
android:textColor="@color/swap_light_text"
|
android:textColor="@color/swap_light_text" />
|
||||||
android:layout_weight="1.00"/>
|
|
||||||
|
|
||||||
<ProgressBar
|
|
||||||
android:id="@+id/searching_people_nearby"
|
|
||||||
android:layout_width="24dp"
|
|
||||||
android:layout_height="24dp"
|
|
||||||
android:indeterminate="true" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<ListView
|
<android.support.v7.widget.SwitchCompat
|
||||||
android:id="@+id/list_people_nearby"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
</ListView>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/swap_cant_find_peers"
|
tools:checked="true"
|
||||||
android:paddingLeft="20dp"
|
android:id="@+id/switch_bluetooth" />
|
||||||
android:paddingStart="20dp"
|
|
||||||
android:paddingRight="20dp"
|
|
||||||
android:paddingEnd="20dp"
|
|
||||||
android:paddingTop="20dp"
|
|
||||||
android:textColor="@color/swap_light_text" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/btn_send_fdroid"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:drawableLeft="@drawable/ic_fdroid_grey"
|
|
||||||
android:drawableStart="@drawable/ic_fdroid_grey"
|
|
||||||
android:text="@string/swap_send_fdroid"
|
|
||||||
android:drawablePadding="10dp"
|
|
||||||
android:paddingLeft="25dp"
|
|
||||||
android:paddingRight="25dp"
|
|
||||||
android:paddingEnd="25dp"
|
|
||||||
android:background="@android:color/transparent" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/btn_qr_scanner"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:drawableLeft="@drawable/ic_qr_grey"
|
|
||||||
android:drawableStart="@drawable/ic_qr_grey"
|
|
||||||
android:text="@string/swap_scan_qr"
|
|
||||||
android:drawablePadding="10dp"
|
|
||||||
android:paddingLeft="25dp"
|
|
||||||
android:paddingRight="25dp"
|
|
||||||
android:paddingEnd="25dp"
|
|
||||||
android:background="@android:color/transparent" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- WiFi swap status + toggle -->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/wifi_info"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/bluetooth_info"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:tint="@color/swap_grey_icon"
|
||||||
|
android:src="@drawable/ic_network_wifi_white" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingLeft="15dp"
|
||||||
|
android:paddingStart="15dp"
|
||||||
|
android:layout_weight="1.00"
|
||||||
|
tools:ignore="RtlSymmetry">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/wifi_visible"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
tools:text="@string/swap_not_visible_wifi"
|
||||||
|
android:textSize="18sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/device_id_wifi"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/swap_wifi_device_name"
|
||||||
|
android:textColor="@color/swap_light_text" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/wifi_network"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
tools:text="wifi network name"
|
||||||
|
android:textColor="@color/swap_bright_blue"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<android.support.v7.widget.SwitchCompat
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
tools:checked="false"
|
||||||
|
android:id="@+id/switch_wifi" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- Feedback for "searching for nearby people..." -->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/feedback_searching"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@+id/wifi_info"
|
||||||
|
android:paddingStart="20dp"
|
||||||
|
android:paddingEnd="20dp"
|
||||||
|
android:paddingBottom="5dp"
|
||||||
|
android:paddingTop="20dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_people_nearby"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/swap_people_nearby"
|
||||||
|
android:textColor="@color/swap_light_text"
|
||||||
|
android:layout_weight="1.00"/>
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/searching_people_nearby"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:indeterminate="true" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Buttons to help the user when they can't find any peers. Shown at bottom of relative layout -->
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/cant_find_peers"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentBottom="true">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_send_fdroid"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_fdroid_grey"
|
||||||
|
android:drawableStart="@drawable/ic_fdroid_grey"
|
||||||
|
android:text="@string/swap_send_fdroid"
|
||||||
|
android:drawablePadding="10dp"
|
||||||
|
android:paddingLeft="25dp"
|
||||||
|
android:paddingRight="25dp"
|
||||||
|
android:paddingEnd="25dp"
|
||||||
|
android:background="@android:color/transparent" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_qr_scanner"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:drawableLeft="@drawable/ic_qr_grey"
|
||||||
|
android:drawableStart="@drawable/ic_qr_grey"
|
||||||
|
android:text="@string/swap_scan_qr"
|
||||||
|
android:drawablePadding="10dp"
|
||||||
|
android:paddingLeft="25dp"
|
||||||
|
android:paddingRight="25dp"
|
||||||
|
android:paddingEnd="25dp"
|
||||||
|
android:background="@android:color/transparent" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- Heading for "can't find peers" -->
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/header_cant_find_peers"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_above="@id/cant_find_peers"
|
||||||
|
android:text="@string/swap_cant_find_peers"
|
||||||
|
android:paddingLeft="20dp"
|
||||||
|
android:paddingStart="20dp"
|
||||||
|
android:paddingRight="20dp"
|
||||||
|
android:paddingEnd="20dp"
|
||||||
|
android:paddingTop="20dp"
|
||||||
|
android:textColor="@color/swap_light_text" />
|
||||||
|
|
||||||
|
<!-- List of all currently known peers (i.e. bluetooth and wifi devices that have been identified -->
|
||||||
|
<ListView
|
||||||
|
android:id="@+id/list_people_nearby"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/feedback_searching"
|
||||||
|
android:layout_above="@id/header_cant_find_peers">
|
||||||
|
|
||||||
|
</ListView>
|
||||||
|
|
||||||
</org.fdroid.fdroid.views.swap.StartSwapView>
|
</org.fdroid.fdroid.views.swap.StartSwapView>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user