$
This commit is contained in:
parent
eb826b077a
commit
5e948c9041
@ -26,14 +26,12 @@ android {
|
|||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
buildToolsVersion '33.0.0'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
implementation 'androidx.appcompat:appcompat:1.6.1'
|
implementation 'androidx.appcompat:appcompat:1.6.1'
|
||||||
implementation 'com.google.android.material:material:1.8.0'
|
implementation 'com.google.android.material:material:1.8.0'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
||||||
|
@ -1,30 +1,34 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:dataExtractionRules="@xml/data_extraction_rules"
|
android:dataExtractionRules="@xml/data_extraction_rules"
|
||||||
android:fullBackupContent="@xml/backup_rules"
|
android:fullBackupContent="@xml/backup_rules"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@drawable/logo"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Theme.JMastermind"
|
android:theme="@style/Theme.JMastermind"
|
||||||
tools:targetApi="31">
|
tools:targetApi="31">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".Prologue"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".Game.SoloGame"
|
android:name=".Game.SoloGame"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
</activity>
|
</activity>
|
||||||
</application>
|
|
||||||
|
<activity
|
||||||
|
android:name=".Menu.Menu"
|
||||||
|
android:exported="true">
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
</manifest>
|
</manifest>
|
@ -92,7 +92,7 @@ public class ColorSelectorEvent extends View implements View.OnClickListener {
|
|||||||
Popup popup = new Popup(this.context, opts, (10 - this.tentative));
|
Popup popup = new Popup(this.context, opts, (10 - this.tentative));
|
||||||
popup.show();
|
popup.show();
|
||||||
} else if(this.tentative == 0) {
|
} else if(this.tentative == 0) {
|
||||||
Popup popup = new Popup(this.context, opts);
|
Popup popup = new Popup(this.context, opts, -1);
|
||||||
popup.show();
|
popup.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,25 +1,31 @@
|
|||||||
package com.example.jmastermind.Events;
|
package com.example.jmastermind.Events;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.media.MediaPlayer;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
public class MenuEvent implements View.OnClickListener {
|
public class MenuEvent implements View.OnClickListener {
|
||||||
private Class option;
|
private Class option;
|
||||||
private AppCompatActivity ac;
|
private AppCompatActivity ac;
|
||||||
|
private MediaPlayer mp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event lié au menu de depart
|
* Event lié au menu de depart
|
||||||
* @param ac Le contexte
|
* @param ac Le contexte
|
||||||
* @param option La class de l'activité a demarrer
|
* @param option La class de l'activité a demarrer
|
||||||
|
* @param mp Couper le son d'une activite
|
||||||
* */
|
* */
|
||||||
public MenuEvent(AppCompatActivity ac, Class option) {
|
public MenuEvent(AppCompatActivity ac, Class option, MediaPlayer mp) {
|
||||||
this.ac = ac;
|
this.ac = ac;
|
||||||
this.option = option;
|
this.option = option;
|
||||||
|
this.mp = mp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
|
this.mp.stop();
|
||||||
|
|
||||||
Intent i = new Intent(this.ac, this.option);
|
Intent i = new Intent(this.ac, this.option);
|
||||||
this.ac.startActivity(i);
|
this.ac.startActivity(i);
|
||||||
}
|
}
|
||||||
|
@ -2,18 +2,20 @@ package com.example.jmastermind.Events;
|
|||||||
|
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.media.MediaPlayer;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.PopupMenu;
|
|
||||||
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
import com.example.jmastermind.Game.Popup;
|
import com.example.jmastermind.Game.Popup;
|
||||||
import com.example.jmastermind.Game.SoloGame;
|
import com.example.jmastermind.Game.SoloGame;
|
||||||
import com.example.jmastermind.MainActivity;
|
import com.example.jmastermind.Menu.Menu;
|
||||||
|
import com.example.jmastermind.Prologue;
|
||||||
import com.example.jmastermind.R;
|
import com.example.jmastermind.R;
|
||||||
|
|
||||||
public class PopupEvent implements DialogInterface.OnClickListener, View.OnClickListener {
|
public class PopupEvent implements DialogInterface.OnClickListener, View.OnClickListener {
|
||||||
|
private MediaPlayer mp;
|
||||||
private int tentative;
|
private int tentative;
|
||||||
private AppCompatActivity context;
|
private AppCompatActivity context;
|
||||||
|
|
||||||
@ -22,15 +24,17 @@ public class PopupEvent implements DialogInterface.OnClickListener, View.OnClick
|
|||||||
* @param context Le context
|
* @param context Le context
|
||||||
* @param tentative Le nombre de tentative
|
* @param tentative Le nombre de tentative
|
||||||
* */
|
* */
|
||||||
public PopupEvent(AppCompatActivity context, int tentative) {
|
public PopupEvent(AppCompatActivity context, int tentative, MediaPlayer mp) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.tentative = tentative;
|
this.tentative = tentative;
|
||||||
|
this.mp = mp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
switch(i) {
|
switch(i) {
|
||||||
case 0: {
|
case 0: {
|
||||||
|
this.mp.stop();
|
||||||
Intent a = new Intent(this.context, SoloGame.class);
|
Intent a = new Intent(this.context, SoloGame.class);
|
||||||
this.context.startActivity(a);
|
this.context.startActivity(a);
|
||||||
break;
|
break;
|
||||||
@ -46,7 +50,8 @@ public class PopupEvent implements DialogInterface.OnClickListener, View.OnClick
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 2: {
|
case 2: {
|
||||||
Intent c = new Intent(this.context, MainActivity.class);
|
this.mp.stop();
|
||||||
|
Intent c = new Intent(this.context, Menu.class);
|
||||||
this.context.startActivity(c);
|
this.context.startActivity(c);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
package com.example.jmastermind.Events;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.media.MediaPlayer;
|
||||||
|
import android.view.animation.Animation;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import com.example.jmastermind.Menu.Menu;
|
||||||
|
import com.example.jmastermind.R;
|
||||||
|
|
||||||
|
public class PrologueAnimation implements Animation.AnimationListener {
|
||||||
|
private AppCompatActivity context;
|
||||||
|
private MediaPlayer mp;
|
||||||
|
|
||||||
|
public PrologueAnimation(AppCompatActivity context) {
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationStart(Animation animation) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationEnd(Animation animation) {
|
||||||
|
Intent i = new Intent(this.context, Menu.class);
|
||||||
|
this.context.startActivity(i);
|
||||||
|
this.mp.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAnimationRepeat(Animation animation) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package com.example.jmastermind.Game;
|
package com.example.jmastermind.Game;
|
||||||
|
|
||||||
|
import android.media.MediaPlayer;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
@ -8,6 +9,7 @@ import com.example.jmastermind.Events.PopupEvent;
|
|||||||
import com.example.jmastermind.R;
|
import com.example.jmastermind.R;
|
||||||
|
|
||||||
public class Popup extends AlertDialog.Builder {
|
public class Popup extends AlertDialog.Builder {
|
||||||
|
private MediaPlayer mp;
|
||||||
private AppCompatActivity context;
|
private AppCompatActivity context;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -20,12 +22,20 @@ public class Popup extends AlertDialog.Builder {
|
|||||||
super(context);
|
super(context);
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
|
||||||
if(tentative.length > 0) {
|
if(tentative[0] > 0) {
|
||||||
|
this.mp = MediaPlayer.create(this.context, R.raw.winningsong);
|
||||||
|
this.mp.setLooping(true);
|
||||||
|
this.mp.start();
|
||||||
|
|
||||||
this.setTitle("Félicitation ! Vous avez gagner en : " + tentative[0] + " coup(s).");
|
this.setTitle("Félicitation ! Vous avez gagner en : " + tentative[0] + " coup(s).");
|
||||||
} else {
|
} else {
|
||||||
|
this.mp = MediaPlayer.create(this.context, R.raw.loosegamesong);
|
||||||
|
this.mp.setLooping(true);
|
||||||
|
this.mp.start();
|
||||||
|
|
||||||
this.setTitle("Perdu !");
|
this.setTitle("Perdu !");
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setItems(options, new PopupEvent(this.context, tentative[0]));
|
this.setItems(options, new PopupEvent(this.context, tentative[0], this.mp));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,9 +47,10 @@ public class Circle extends View {
|
|||||||
|
|
||||||
canvas.drawCircle(centerX, centerY, radius-2, this.picasso);
|
canvas.drawCircle(centerX, centerY, radius-2, this.picasso);
|
||||||
|
|
||||||
this.picasso.setColor(Color.GRAY);
|
int corail = Color.rgb(255, 127, 80);
|
||||||
|
this.picasso.setColor(corail);
|
||||||
this.picasso.setStyle(Paint.Style.STROKE);
|
this.picasso.setStyle(Paint.Style.STROKE);
|
||||||
this.picasso.setStrokeWidth(5f);
|
this.picasso.setStrokeWidth(2f);
|
||||||
|
|
||||||
canvas.drawCircle(centerX, centerY, radius-3, this.picasso);
|
canvas.drawCircle(centerX, centerY, radius-3, this.picasso);
|
||||||
}
|
}
|
||||||
|
36
app/src/main/java/com/example/jmastermind/Menu/Menu.java
Normal file
36
app/src/main/java/com/example/jmastermind/Menu/Menu.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package com.example.jmastermind.Menu;
|
||||||
|
|
||||||
|
import android.media.MediaPlayer;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.widget.Button;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import com.example.jmastermind.Events.MenuEvent;
|
||||||
|
import com.example.jmastermind.Game.MultiGame;
|
||||||
|
import com.example.jmastermind.Game.SoloGame;
|
||||||
|
import com.example.jmastermind.R;
|
||||||
|
|
||||||
|
public class Menu extends AppCompatActivity {
|
||||||
|
private MediaPlayer mp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Le jeu mode SOLO
|
||||||
|
* */
|
||||||
|
@Override
|
||||||
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.menu);
|
||||||
|
|
||||||
|
this.mp = MediaPlayer.create(this, R.raw.menusong);
|
||||||
|
this.mp.setLooping(true);
|
||||||
|
this.mp.start();
|
||||||
|
|
||||||
|
Button btnSoloGame = (Button) findViewById(R.id.robotselect);
|
||||||
|
btnSoloGame.setOnClickListener(new MenuEvent(this, SoloGame.class, this.mp));
|
||||||
|
|
||||||
|
Button btnMultiGame = (Button) findViewById(R.id.jcjselect);
|
||||||
|
btnMultiGame.setOnClickListener(new MenuEvent(this, MultiGame.class, this.mp));
|
||||||
|
}
|
||||||
|
}
|
62
app/src/main/java/com/example/jmastermind/Prologue.java
Normal file
62
app/src/main/java/com/example/jmastermind/Prologue.java
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
package com.example.jmastermind;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import android.media.MediaPlayer;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.animation.Animation;
|
||||||
|
import android.view.animation.AnimationSet;
|
||||||
|
import android.view.animation.LinearInterpolator;
|
||||||
|
import android.view.animation.TranslateAnimation;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.example.jmastermind.Events.MenuEvent;
|
||||||
|
import com.example.jmastermind.Events.PrologueAnimation;
|
||||||
|
import com.example.jmastermind.Menu.Menu;
|
||||||
|
|
||||||
|
public class Prologue extends AppCompatActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.prologue);
|
||||||
|
|
||||||
|
MediaPlayer mp = MediaPlayer.create(this, R.raw.prologuesong);
|
||||||
|
mp.setLooping(true);
|
||||||
|
mp.start();
|
||||||
|
|
||||||
|
LinearLayout prologue = (LinearLayout) findViewById(R.id.prologue);
|
||||||
|
prologue.setOnClickListener(new MenuEvent(this, Menu.class, mp));
|
||||||
|
|
||||||
|
TextView tx = (TextView) findViewById(R.id.prologuetext);
|
||||||
|
|
||||||
|
AnimationSet animationSet = new AnimationSet(true);
|
||||||
|
animationSet.setInterpolator(new LinearInterpolator());
|
||||||
|
|
||||||
|
TranslateAnimation animationUp = new TranslateAnimation(
|
||||||
|
Animation.RELATIVE_TO_SELF, 0f,
|
||||||
|
Animation.RELATIVE_TO_SELF, 0f,
|
||||||
|
Animation.RELATIVE_TO_SELF, 0f,
|
||||||
|
Animation.RELATIVE_TO_SELF, -1f
|
||||||
|
);
|
||||||
|
animationUp.setDuration(20000);
|
||||||
|
animationUp.setFillAfter(true);
|
||||||
|
animationSet.addAnimation(animationUp);
|
||||||
|
|
||||||
|
TranslateAnimation animationDown = new TranslateAnimation(
|
||||||
|
Animation.RELATIVE_TO_SELF, 0f,
|
||||||
|
Animation.RELATIVE_TO_SELF, 0f,
|
||||||
|
Animation.RELATIVE_TO_SELF, 1f,
|
||||||
|
Animation.RELATIVE_TO_SELF, 0f
|
||||||
|
);
|
||||||
|
animationDown.setDuration(20000);
|
||||||
|
animationDown.setFillAfter(true);
|
||||||
|
animationSet.addAnimation(animationDown);
|
||||||
|
|
||||||
|
PrologueAnimation pa = new PrologueAnimation(this);
|
||||||
|
animationSet.setAnimationListener(pa);
|
||||||
|
|
||||||
|
tx.startAnimation(animationSet);
|
||||||
|
}
|
||||||
|
}
|
BIN
app/src/main/res/drawable/game.PNG
Normal file
BIN
app/src/main/res/drawable/game.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.7 MiB |
BIN
app/src/main/res/drawable/logo.png
Normal file
BIN
app/src/main/res/drawable/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 55 KiB |
BIN
app/src/main/res/font/text.ttf
Normal file
BIN
app/src/main/res/font/text.ttf
Normal file
Binary file not shown.
BIN
app/src/main/res/font/title.ttf
Normal file
BIN
app/src/main/res/font/title.ttf
Normal file
Binary file not shown.
@ -6,8 +6,8 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
tools:context=".MainActivity"
|
tools:context=".Prologue"
|
||||||
android:background="@drawable/space"
|
android:background="@drawable/game"
|
||||||
>
|
>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".MainActivity"
|
tools:context=".Prologue"
|
||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
android:background="@drawable/space"
|
android:background="@drawable/space"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
|
86
app/src/main/res/layout/prologue.xml
Normal file
86
app/src/main/res/layout/prologue.xml
Normal file
File diff suppressed because one or more lines are too long
BIN
app/src/main/res/raw/loosegamesong.mp3
Normal file
BIN
app/src/main/res/raw/loosegamesong.mp3
Normal file
Binary file not shown.
BIN
app/src/main/res/raw/menusong.mp3
Normal file
BIN
app/src/main/res/raw/menusong.mp3
Normal file
Binary file not shown.
BIN
app/src/main/res/raw/prologuesong.mp3
Normal file
BIN
app/src/main/res/raw/prologuesong.mp3
Normal file
Binary file not shown.
BIN
app/src/main/res/raw/winningsong.mp3
Normal file
BIN
app/src/main/res/raw/winningsong.mp3
Normal file
Binary file not shown.
@ -1,8 +1,8 @@
|
|||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="Theme.JMastermind" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
<style name="Theme.JMastermind" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
<!-- Primary brand color. -->
|
<!-- Primary brand color. -->
|
||||||
<item name="colorPrimary">@color/purple_200</item>
|
<item name="colorPrimary">@color/black</item>
|
||||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
<item name="colorOnPrimary">@color/black</item>
|
<item name="colorOnPrimary">@color/black</item>
|
||||||
<!-- Secondary brand color. -->
|
<!-- Secondary brand color. -->
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="Theme.JMastermind" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
<style name="Theme.JMastermind" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
<!-- Primary brand color. -->
|
<!-- Primary brand color. -->
|
||||||
<item name="colorPrimary">@color/purple_500</item>
|
<item name="colorPrimary">@color/black</item>
|
||||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||||
<item name="colorOnPrimary">@color/white</item>
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
<!-- Secondary brand color. -->
|
<!-- Secondary brand color. -->
|
||||||
|
Loading…
Reference in New Issue
Block a user