Sauvegarde dans la base de données

This commit is contained in:
Yohann D'ANELLO 2019-12-02 16:22:31 +01:00
parent 5336bbc109
commit 130de1177d
4 changed files with 541 additions and 39 deletions

View File

@ -4,24 +4,30 @@ import android.preference.PreferenceManager;
import android.util.SparseArray;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Executors;
public class Game {
private static final Gson GSON;
private static final SparseArray<Game> GAMES = new SparseArray<>();
public int id;
public GameType type;
public Set<Player> players;
public GameType gameType;
public List<Player> players;
public Bet bet;
public Player attacker;
public Player follower;
@ -29,19 +35,60 @@ public class Game {
// public boolean little, twenty_one, excuse;
public int ends;
public int handle;
public Map<Player, Boolean> miseries;
public List<Boolean> miseries;
public boolean littleForAttacker, littleForDefenser;
public boolean chelemAnnounced, chelemRealized;
public List<Integer> points;
static {
GSON = new GsonBuilder().registerTypeAdapter(Player.class, new TypeAdapter<Player>() {
@Override
public void write(JsonWriter out, Player value) throws IOException {
if (value == null)
out.nullValue();
else
out.value(value.getId());
}
@Override
public Player read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
}
return Player.getPlayerById(in.nextInt());
}
}).registerTypeAdapter(Game.GameType.class, new TypeAdapter<Game.GameType>() {
@Override
public void write(JsonWriter out, GameType value) throws IOException {
if (value == null)
out.nullValue();
else
out.value(value.getNbPlayers());
}
@Override
public GameType read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
}
return Game.GameType.values()[3 + in.nextInt()];
}
}).create();
}
public int getId() {
return id;
}
public GameType getType() {
return type;
public GameType getGameType() {
return gameType;
}
public Set<Player> getPlayers() {
public List<Player> getPlayers() {
return players;
}
@ -69,7 +116,7 @@ public class Game {
return handle;
}
public Map<Player, Boolean> getMiseries() {
public List<Boolean> getMiseries() {
return miseries;
}
@ -89,7 +136,7 @@ public class Game {
return chelemRealized;
}
public int calculateScore() {
public void calculateScores() {
// int ends = (little ? 1 : 0) + (twenty_one ? 1 : 0) + (excuse ? 1 : 0);
int bound = ends == 0 ? 56 : ends == 1 ? 51 : ends == 2 ? 41 : 36;
boolean win = attackScore >= bound;
@ -119,11 +166,68 @@ public class Game {
else if (chelemRealized)
score += 200;
return score;
attackScore = score;
Map<Player, Integer> scores = new HashMap<>();
for (int i = 0; i < getGameType().getNbPlayers(); ++i) {
Player p = players.get(i);
int playerScore = 0;
if (p != attacker && p != follower)
playerScore = -score;
else {
if (p == attacker)
playerScore += getGameType().getAttackMultiplier() * score;
if (p == follower)
playerScore += getGameType().getFollowMultiplier() * score;
}
scores.put(p, playerScore);
}
for (int i = 0; i < getGameType().getNbPlayers(); ++i) {
System.err.println(getMiseries());
if (getMiseries().get(i)) {
//noinspection ConstantConditions
scores.put(players.get(i), scores.get(players.get(i)) + 10 * (getGameType().getNbPlayers() - 1));
for (int j = 0; j < getGameType().getNbPlayers(); ++j) {
if (i == j)
continue;
//noinspection ConstantConditions
scores.put(players.get(j), scores.get(players.get(j)) - 10);
}
}
}
points = new ArrayList<>();
for (int i = 0; i < getGameType().getNbPlayers(); ++i) {
points.add(scores.get(players.get(i)));
}
}
public String toJson() {
return GSON.toJson(this);
}
public enum GameType {
THREE_PLAYERS, FOUR_PLAYERS, FIVE_PLAYERS, SIX_PLAYERS;
THREE_PLAYERS(2, 0), FOUR_PLAYERS(3, 0), FIVE_PLAYERS(2, 1), SIX_PLAYERS(3, 1);
private final int attackMultiplier;
private final int followMultiplier;
GameType(int attack, int follow) {
this.attackMultiplier = attack;
this.followMultiplier = follow;
}
public int getAttackMultiplier() {
return attackMultiplier;
}
public int getFollowMultiplier() {
return followMultiplier;
}
public int getNbPlayers() {
return ordinal() + 3;
@ -170,7 +274,7 @@ public class Game {
co.setRequestProperty("token", PreferenceManager.getDefaultSharedPreferences(MainActivity.INSTANCE).getString("token", null));
co.connect();
final List<Game> games = new Gson().fromJson(new InputStreamReader(co.getInputStream()), new TypeToken<ArrayList<Game>>(){}.getType());
final List<Game> games = GSON.fromJson(new InputStreamReader(co.getInputStream()), new TypeToken<ArrayList<Game>>(){}.getType());
GAMES.clear();
for (Game g : games) {
GAMES.put(g.getId(), g);

View File

@ -31,7 +31,7 @@ public class Player {
private int score3, score4, score5, score6;
private int getId() {
public int getId() {
return id;
}
@ -97,6 +97,10 @@ public class Player {
return PLAYERS.values();
}
public static Player getPlayerById(int id) {
return PLAYERS.get(id);
}
@NonNull
@Override
public String toString() {

View File

@ -5,23 +5,30 @@ import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Locale;
import java.util.List;
import java.util.concurrent.Executors;
import fr.ynerant.tarot.Game;
import fr.ynerant.tarot.MainActivity;
@ -59,17 +66,28 @@ public class NewGameFragment extends Fragment {
final LinearLayout player5_layout = root.findViewById(R.id.player5_layout);
final LinearLayout player6_layout = root.findViewById(R.id.player6_layout);
final List<Player> players = new ArrayList<>();
//noinspection ConstantConditions
ArrayAdapter<Player> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, new ArrayList<>(Player.getAllPlayers()));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
player1.setAdapter(adapter);
player2.setAdapter(adapter);
player2.setSelection(1);
player3.setAdapter(adapter);
player3.setSelection(2);
player4.setAdapter(adapter);
player4.setSelection(3);
player5.setAdapter(adapter);
player5.setSelection(4);
player6.setAdapter(adapter);
player6.setSelection(5);
final Spinner[] spinners = new Spinner[]{player1, player2, player3, player4, player5, player6};
final Spinner attacker = root.findViewById(R.id.attacker);
final Spinner follower = root.findViewById(R.id.follower);
final LinearLayout follower_layout = root.findViewById(R.id.follower_layout);
final Spinner dealer = root.findViewById(R.id.dealer);
final SeekBar attack_points = root.findViewById(R.id.attack_score);
final SeekBar bet = root.findViewById(R.id.bet);
final SeekBar nb_ends = root.findViewById(R.id.nb_ends);
@ -77,32 +95,143 @@ public class NewGameFragment extends Fragment {
final Switch chelem_realized = root.findViewById(R.id.chelem_realized);
final SeekBar little_end = root.findViewById(R.id.little_end);
final SeekBar handle = root.findViewById(R.id.handle);
final ToggleButton misery1 = root.findViewById(R.id.player1_misery);
final ToggleButton misery2 = root.findViewById(R.id.player2_misery);
final ToggleButton misery3 = root.findViewById(R.id.player3_misery);
final ToggleButton misery4 = root.findViewById(R.id.player4_misery);
final ToggleButton misery5 = root.findViewById(R.id.player5_misery);
final ToggleButton misery6 = root.findViewById(R.id.player6_misery);
final ToggleButton[] miseries = new ToggleButton[]{misery1, misery2, misery3, misery4, misery5, misery6};
final TextView misery1Text = root.findViewById(R.id.player1_misery_text);
final TextView misery2Text = root.findViewById(R.id.player2_misery_text);
final TextView misery3Text = root.findViewById(R.id.player3_misery_text);
final TextView misery4Text = root.findViewById(R.id.player4_misery_text);
final TextView misery5Text = root.findViewById(R.id.player5_misery_text);
final TextView misery6Text = root.findViewById(R.id.player6_misery_text);
final TextView points1 = root.findViewById(R.id.player1_points);
final TextView points2 = root.findViewById(R.id.player2_points);
final TextView points3 = root.findViewById(R.id.player3_points);
final TextView points4 = root.findViewById(R.id.player4_points);
final TextView points5 = root.findViewById(R.id.player5_points);
final TextView points6 = root.findViewById(R.id.player6_points);
final TextView[] points = new TextView[]{points1, points2, points3, points4, points5, points6};
final TextView points1Text = root.findViewById(R.id.player1_points_text);
final TextView points2Text = root.findViewById(R.id.player2_points_text);
final TextView points3Text = root.findViewById(R.id.player3_points_text);
final TextView points4Text = root.findViewById(R.id.player4_points_text);
final TextView points5Text = root.findViewById(R.id.player5_points_text);
final TextView points6Text = root.findViewById(R.id.player6_points_text);
final Runnable updateScore = new Runnable() {
@Override
public void run() {
TextView textView = root.findViewById(R.id.nb_points);
Game game = new Game();
game.attackScore = attack_points.getProgress();
game.type = Game.GameType.getGameType(nb_players.getProgress() + 3);
game.players = new HashSet<>();
for (int i = 0; i < 3 + nb_players.getProgress(); ++i) {
game.players.add((Player) spinners[i].getSelectedItem());
Game game = getGame();
for (int i = 0; i < game.getGameType().getNbPlayers(); ++i) {
points[i].setText(String.valueOf(game.points.get(i)));
}
}
public Game getGame() {
Game game = new Game();
game.gameType = Game.GameType.getGameType(nb_players.getProgress() + 3);
game.attacker = (Player) attacker.getSelectedItem();
if (game.getGameType().getNbPlayers() >= 5)
game.follower = (Player) follower.getSelectedItem();
game.attackScore = attack_points.getProgress();
game.players = players;
game.bet = Game.Bet.values()[bet.getProgress()];
game.ends = nb_ends.getProgress();
game.handle = handle.getProgress();
game.chelemAnnounced = chelem_announced.isChecked();
game.chelemRealized = chelem_realized.isChecked();
game.littleForAttacker = little_end.getProgress() == 1;
game.littleForDefenser = little_end.getProgress() == 2;
game.handle = handle.getProgress();
List<Boolean> miseriesList = new ArrayList<>();
for (int i = 0; i < game.getGameType().getNbPlayers(); ++i)
miseriesList.add(miseries[i].isChecked());
game.miseries = miseriesList;
game.calculateScores();
textView.setText(String.format(Locale.getDefault(), "%d points (hors misères)", game.calculateScore()));
return game;
}
};
updateScore.run();
final Spinner.OnItemSelectedListener updatePlayers = new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
players.clear();
players.add((Player) player1.getSelectedItem());
players.add((Player) player2.getSelectedItem());
players.add((Player) player3.getSelectedItem());
if (nb_players.getProgress() >= 1)
players.add((Player) player4.getSelectedItem());
if (nb_players.getProgress() >= 2)
players.add((Player) player5.getSelectedItem());
if (nb_players.getProgress() == 3)
players.add((Player) player6.getSelectedItem());
//noinspection ConstantConditions
ArrayAdapter<Player> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, new ArrayList<>(players));
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
attacker.setAdapter(adapter);
dealer.setAdapter(adapter);
follower.setAdapter(adapter);
misery1Text.setText(((Player) player1.getSelectedItem()).getName());
misery2Text.setText(((Player) player2.getSelectedItem()).getName());
misery3Text.setText(((Player) player3.getSelectedItem()).getName());
misery4Text.setText(((Player) player4.getSelectedItem()).getName());
misery5Text.setText(((Player) player5.getSelectedItem()).getName());
misery6Text.setText(((Player) player6.getSelectedItem()).getName());
points1Text.setText(((Player) player1.getSelectedItem()).getName());
points2Text.setText(((Player) player2.getSelectedItem()).getName());
points3Text.setText(((Player) player3.getSelectedItem()).getName());
points4Text.setText(((Player) player4.getSelectedItem()).getName());
points5Text.setText(((Player) player5.getSelectedItem()).getName());
points6Text.setText(((Player) player6.getSelectedItem()).getName());
updateScore.run();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
};
Spinner.OnItemSelectedListener justUpdate = new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
updateScore.run();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
};
ToggleButton.OnCheckedChangeListener justUpdate2 = new ToggleButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
updateScore.run();
}
};
updatePlayers.onItemSelected(null, null, 0, 0);
player1.setOnItemSelectedListener(updatePlayers);
player2.setOnItemSelectedListener(updatePlayers);
player3.setOnItemSelectedListener(updatePlayers);
player4.setOnItemSelectedListener(updatePlayers);
player5.setOnItemSelectedListener(updatePlayers);
player6.setOnItemSelectedListener(updatePlayers);
attacker.setOnItemSelectedListener(justUpdate);
follower.setOnItemSelectedListener(justUpdate);
dealer.setOnItemSelectedListener(justUpdate);
misery1.setOnCheckedChangeListener(justUpdate2);
misery2.setOnCheckedChangeListener(justUpdate2);
misery3.setOnCheckedChangeListener(justUpdate2);
misery4.setOnCheckedChangeListener(justUpdate2);
misery5.setOnCheckedChangeListener(justUpdate2);
misery6.setOnCheckedChangeListener(justUpdate2);
nb_players.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
@ -126,17 +255,47 @@ public class NewGameFragment extends Fragment {
nb_players_info.setText(resource);
player4_layout.setVisibility(View.GONE);
misery4Text.setVisibility(View.GONE);
misery4.setVisibility(View.GONE);
points4Text.setVisibility(View.GONE);
points4.setVisibility(View.GONE);
player5_layout.setVisibility(View.GONE);
misery5Text.setVisibility(View.GONE);
misery5.setVisibility(View.GONE);
points5Text.setVisibility(View.GONE);
points5.setVisibility(View.GONE);
player6_layout.setVisibility(View.GONE);
misery6Text.setVisibility(View.GONE);
misery6.setVisibility(View.GONE);
points6Text.setVisibility(View.GONE);
points6.setVisibility(View.GONE);
follower_layout.setVisibility(View.GONE);
switch (progress + 3) {
case 6:
player6_layout.setVisibility(View.VISIBLE);
misery6Text.setVisibility(View.VISIBLE);
misery6.setVisibility(View.VISIBLE);
points6Text.setVisibility(View.VISIBLE);
points6.setVisibility(View.VISIBLE);
case 5:
player5_layout.setVisibility(View.VISIBLE);
misery5Text.setVisibility(View.VISIBLE);
misery5.setVisibility(View.VISIBLE);
points5Text.setVisibility(View.VISIBLE);
points5.setVisibility(View.VISIBLE);
follower_layout.setVisibility(View.VISIBLE);
case 4:
player4_layout.setVisibility(View.VISIBLE);
misery4Text.setVisibility(View.VISIBLE);
misery4.setVisibility(View.VISIBLE);
points4Text.setVisibility(View.VISIBLE);
points4.setVisibility(View.VISIBLE);
}
updatePlayers.onItemSelected(null, null, 0, 0);
updateScore.run();
}
@Override
@ -314,7 +473,52 @@ public class NewGameFragment extends Fragment {
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "La partie sera sauvegardée ultérieurement.", Toast.LENGTH_SHORT).show();
Toast.makeText(getContext(), "La partie est enregistrée !", Toast.LENGTH_SHORT).show();
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
Game g = getGame();
try {
URL url = new URL("https://galaxyoyo.com/tarot/game.php?add_game");
HttpURLConnection co = (HttpURLConnection) url.openConnection();
co.setRequestMethod("POST");
co.setRequestProperty("token", PreferenceManager.getDefaultSharedPreferences(MainActivity.INSTANCE).getString("token", null));
co.setRequestProperty("json", g.toJson());
co.connect();
System.out.println(g.toJson());
System.err.println(IOUtils.readLines(co.getInputStream()));
co.disconnect();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
public Game getGame() {
Game game = new Game();
game.gameType = Game.GameType.getGameType(nb_players.getProgress() + 3);
game.attacker = (Player) attacker.getSelectedItem();
if (game.getGameType().getNbPlayers() >= 5)
game.follower = (Player) follower.getSelectedItem();
game.attackScore = attack_points.getProgress();
game.players = players;
game.bet = Game.Bet.values()[bet.getProgress()];
game.ends = nb_ends.getProgress();
game.handle = handle.getProgress();
game.chelemAnnounced = chelem_announced.isChecked();
game.chelemRealized = chelem_realized.isChecked();
game.littleForAttacker = little_end.getProgress() == 1;
game.littleForDefenser = little_end.getProgress() == 2;
List<Boolean> miseriesList = new ArrayList<>();
for (int i = 0; i < game.getGameType().getNbPlayers(); ++i)
miseriesList.add(miseries[i].isChecked());
game.miseries = miseriesList;
game.calculateScores();
return game;
}
});

View File

@ -167,6 +167,23 @@
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Preneur :" />
<Spinner
android:id="@+id/attacker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/follower_layout"
android:layout_width="match_parent"
@ -189,7 +206,6 @@
<LinearLayout
android:id="@+id/dealer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
@ -426,18 +442,192 @@
</LinearLayout>
<TextView
android:id="@+id/nb_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Misères" />
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:textAlignment="center">
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/player1_misery_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/player2_misery_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/player3_misery_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/player4_misery_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/player5_misery_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
<TextView
android:id="@+id/player6_misery_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<ToggleButton
android:id="@+id/player1_misery"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ToggleButton
android:id="@+id/player2_misery"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ToggleButton
android:id="@+id/player3_misery"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ToggleButton
android:id="@+id/player4_misery"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ToggleButton
android:id="@+id/player5_misery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
<ToggleButton
android:id="@+id/player6_misery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</TableRow>
</TableLayout>
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:textAlignment="center">
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/player1_points_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
<TextView
android:id="@+id/player2_points_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
<TextView
android:id="@+id/player3_points_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
<TextView
android:id="@+id/player4_points_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
<TextView
android:id="@+id/player5_points_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:textSize="24sp" />
<TextView
android:id="@+id/player6_points_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:textSize="24sp" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/player1_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
<TextView
android:id="@+id/player2_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
<TextView
android:id="@+id/player3_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
<TextView
android:id="@+id/player4_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
<TextView
android:id="@+id/player5_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:textSize="24sp" />
<TextView
android:id="@+id/player6_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:textSize="24sp" />
</TableRow>
</TableLayout>
<Button
android:id="@+id/add_game_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAlignment="center"
android:textSize="30sp" />
android:text="Enregistrer la partie" />
</LinearLayout>
<Button
android:id="@+id/add_game_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Enregistrer la partie" />
</LinearLayout>