From 9388b57447fdb2ec9ef9704305e3aff4e45bc918 Mon Sep 17 00:00:00 2001 From: ynerant Date: Fri, 6 Dec 2019 01:15:59 +0100 Subject: [PATCH] =?UTF-8?q?Affichage=20des=20parties=20d=C3=A9j=C3=A0=20jo?= =?UTF-8?q?u=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- app/src/main/java/fr/ynerant/tarot/Game.java | 153 ++++++--- .../java/fr/ynerant/tarot/MainActivity.java | 2 +- .../tarot/ui/games/GameInfoFragment.java | 111 +++++++ .../ynerant/tarot/ui/games/GameInfoModel.java | 6 + .../tarot/ui/games/GamesMenuFragment.java | 57 ++++ .../tarot/ui/games/GamesMenuModel.java | 6 + .../tarot/ui/newgame/NewGameFragment.java | 11 +- .../ui/stats/PersonalStatsMenuFragment.java | 2 +- .../main/res/layout/fragment_game_info.xml | 302 ++++++++++++++++++ .../main/res/layout/fragment_games_menu.xml | 12 + app/src/main/res/layout/fragment_new_game.xml | 54 ++-- .../res/layout/fragment_personal_stats.xml | 16 +- .../main/res/menu/activity_main_drawer.xml | 5 + .../main/res/navigation/mobile_navigation.xml | 6 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 17 files changed, 645 insertions(+), 104 deletions(-) create mode 100644 app/src/main/java/fr/ynerant/tarot/ui/games/GameInfoFragment.java create mode 100644 app/src/main/java/fr/ynerant/tarot/ui/games/GameInfoModel.java create mode 100644 app/src/main/java/fr/ynerant/tarot/ui/games/GamesMenuFragment.java create mode 100644 app/src/main/java/fr/ynerant/tarot/ui/games/GamesMenuModel.java create mode 100644 app/src/main/res/layout/fragment_game_info.xml create mode 100644 app/src/main/res/layout/fragment_games_menu.xml diff --git a/app/build.gradle b/app/build.gradle index 81afac8..3698d88 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "fr.ynerant.tarot" minSdkVersion 24 targetSdkVersion 29 - versionCode 3 - versionName "0.1.0" + versionCode 4 + versionName "0.2.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/main/java/fr/ynerant/tarot/Game.java b/app/src/main/java/fr/ynerant/tarot/Game.java index 1b1c2aa..0c410cc 100644 --- a/app/src/main/java/fr/ynerant/tarot/Game.java +++ b/app/src/main/java/fr/ynerant/tarot/Game.java @@ -2,7 +2,8 @@ package fr.ynerant.tarot; import android.annotation.SuppressLint; import android.preference.PreferenceManager; -import android.util.SparseArray; + +import androidx.annotation.NonNull; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -20,6 +21,7 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -28,9 +30,12 @@ import java.util.concurrent.Executors; public class Game { private static final Gson GSON; - private static final SparseArray GAMES = new SparseArray<>(); + @SuppressLint("UseSparseArrays") + private static final Map GAMES = new HashMap<>(); + @SuppressWarnings("unused") private int id; + @SuppressWarnings("unused") private Date date; private GameType gameType; @SuppressWarnings("unused") @@ -100,7 +105,7 @@ public class Game { } }).registerTypeAdapter(Date.class, new TypeAdapter() { @SuppressLint("SimpleDateFormat") - final DateFormat FORMAT = new SimpleDateFormat("yyyy-mm-dd HH:MM:ss"); + final DateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public void write(JsonWriter out, Date value) throws IOException { @@ -271,8 +276,6 @@ public class Game { else if (chelem_realized) score += 200; - attack_score = score; - Map scores = new HashMap<>(); for (int i = 0; i < getGameType().getNbPlayers(); ++i) { @@ -314,57 +317,31 @@ public class Game { return GSON.toJson(this); } - public enum GameType { - 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; - } - - public static GameType getGameType(int players) { - switch (players) { - case 3: - return THREE_PLAYERS; - case 4: - return FOUR_PLAYERS; - case 5: - return FIVE_PLAYERS; - case 6: - return SIX_PLAYERS; - default: - throw new IllegalArgumentException("A game must have between 3 and 6 players"); - } - } + @NonNull + @Override + public String toString() { + SimpleDateFormat format = new SimpleDateFormat("dd MMMM yyyy HH:mm:ss"); + String str = "Partie à " + getGameType().getNbPlayers() + " joueurs : "; + for (Player player : getPlayers()) + str += player.getName() + ", "; + str += getBet().toString() + " de " + getAttacker().getName() + " " + (getAttackScore() >= (ends == 0 ? 56 : ends == 1 ? 51 : ends == 2 ? 41 : 36) ? "gagnée" : "chutée") + ", "; + str += format.format(getDate()); + return str; } - public enum Bet { - SMALL(1), GUARD(2), GUARD_WITHOUT(4), GUARD_AGAINST(6); + public static Game getGameById(int id) { + return GAMES.get(id); + } - private final int multiplier; - - Bet(int multiplier) { - this.multiplier = multiplier; - } - - public int getMultiplier() { - return multiplier; - } + public static List getAllGames() { + List list = new ArrayList<>(GAMES.values()); + list.sort(new Comparator() { + @Override + public int compare(Game o1, Game o2) { + return o2.getDate().compareTo(o1.getDate()); + } + }); + return list; } public static void updateGames() { @@ -440,4 +417,74 @@ public class Game { } }); } + + public enum GameType { + 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; + } + + public static GameType getGameType(int players) { + switch (players) { + case 3: + return THREE_PLAYERS; + case 4: + return FOUR_PLAYERS; + case 5: + return FIVE_PLAYERS; + case 6: + return SIX_PLAYERS; + default: + throw new IllegalArgumentException("A game must have between 3 and 6 players"); + } + } + } + + public enum Bet { + SMALL(1), GUARD(2), GUARD_WITHOUT(4), GUARD_AGAINST(6); + + private final int multiplier; + + Bet(int multiplier) { + this.multiplier = multiplier; + } + + public int getMultiplier() { + return multiplier; + } + + @NonNull + @Override + public String toString() { + switch (this) { + case SMALL: + return "Petite"; + case GUARD: + return "Garde"; + case GUARD_WITHOUT: + return "Garde sans"; + case GUARD_AGAINST: + return "Garde contre"; + default: + return "null"; + } + } + } } diff --git a/app/src/main/java/fr/ynerant/tarot/MainActivity.java b/app/src/main/java/fr/ynerant/tarot/MainActivity.java index cd16c44..6dc299d 100644 --- a/app/src/main/java/fr/ynerant/tarot/MainActivity.java +++ b/app/src/main/java/fr/ynerant/tarot/MainActivity.java @@ -37,7 +37,7 @@ public class MainActivity extends AppCompatActivity { // Passing each menu ID as a set of Ids because each // menu should be considered as top level destinations. mAppBarConfiguration = new AppBarConfiguration.Builder( - R.id.nav_new_game, R.id.nav_personal_stats) + R.id.nav_new_game) .setDrawerLayout(drawer) .build(); NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); diff --git a/app/src/main/java/fr/ynerant/tarot/ui/games/GameInfoFragment.java b/app/src/main/java/fr/ynerant/tarot/ui/games/GameInfoFragment.java new file mode 100644 index 0000000..e110fa5 --- /dev/null +++ b/app/src/main/java/fr/ynerant/tarot/ui/games/GameInfoFragment.java @@ -0,0 +1,111 @@ +package fr.ynerant.tarot.ui.games; + +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProviders; + +import fr.ynerant.tarot.Game; +import fr.ynerant.tarot.MainActivity; +import fr.ynerant.tarot.Player; +import fr.ynerant.tarot.R; +import fr.ynerant.tarot.ui.home.HomeFragment; + +public class GameInfoFragment extends Fragment { + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, final Bundle savedInstanceState) { + ViewModelProviders.of(this).get(GameInfoModel.class); + final View root = inflater.inflate(R.layout.fragment_game_info, container, false); + + if (PreferenceManager.getDefaultSharedPreferences(MainActivity.INSTANCE).getString("token", null) == null) { + //noinspection ConstantConditions + getFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, new HomeFragment(), "Se connecter").commit(); + return root; + } + + Game game = Game.getGameById(getArguments().getInt("gameId")); + + TextView points1 = root.findViewById(R.id.player1_points); + TextView points2 = root.findViewById(R.id.player2_points); + TextView points3 = root.findViewById(R.id.player3_points); + TextView points4 = root.findViewById(R.id.player4_points); + TextView points5 = root.findViewById(R.id.player5_points); + TextView points6 = root.findViewById(R.id.player6_points); + TextView[] points = new TextView[]{points1, points2, points3, points4, points5, points6}; + TextView points1Text = root.findViewById(R.id.player1_points_text); + TextView points2Text = root.findViewById(R.id.player2_points_text); + TextView points3Text = root.findViewById(R.id.player3_points_text); + TextView points4Text = root.findViewById(R.id.player4_points_text); + TextView points5Text = root.findViewById(R.id.player5_points_text); + TextView points6Text = root.findViewById(R.id.player6_points_text); + TextView[] pointsText = new TextView[]{points1Text, points2Text, points3Text, points4Text, points5Text, points6Text}; + + for (int i = 0; i < game.getGameType().getNbPlayers(); ++i) { + System.out.println(i + ", " + game.getGameType()); + pointsText[i].setVisibility(View.VISIBLE); + pointsText[i].setText(game.getPlayers().get(i).getName()); + points[i].setVisibility(View.VISIBLE); + points[i].setText(String.valueOf(game.getPoints(i))); + } + + TextView attacker = root.findViewById(R.id.attacker); + TextView follower = root.findViewById(R.id.follower); + LinearLayout followerLayout = root.findViewById(R.id.follower_layout); + + attacker.setText(game.getAttacker().getName()); + + if (game.getGameType() == Game.GameType.FIVE_PLAYERS || game.getGameType() == Game.GameType.SIX_PLAYERS) { + followerLayout.setVisibility(View.VISIBLE); + follower.setText(game.getFollower().getName()); + } + + TextView bet = root.findViewById(R.id.bet); + bet.setText(game.getBet().toString()); + + TextView ends = root.findViewById(R.id.ends); + ends.setText(game.getEnds() + " bout" + (game.getEnds() >= 2 ? "s" : "")); + + TextView attackScore = root.findViewById(R.id.attack_score); + attackScore.setText(String.valueOf(game.getAttackScore())); + + TextView chelem = root.findViewById(R.id.chelem); + chelem.setText((game.isChelemAnnounced() ? "" : "non ") + "annoncé, " + (game.isChelemRealized() ? "" : "non ") + "réalisé"); + + TextView littleEnd = root.findViewById(R.id.little_end); + littleEnd.setText(game.getLittleEnd() == 0 ? "Non" : game.getPlayers().get(game.getLittleEnd() - 1).getName()); + + TextView handles = root.findViewById(R.id.handles); + String handlesStr = ""; + for (int i = 0; i < game.getGameType().getNbPlayers(); ++i) { + if (game.getHandles().get(i) > 0) + handlesStr += game.getPlayers().get(i) + " (" + (game.getHandles().get(i) == 1 ? "simple" : game.getHandles().get(i) == 2 ? "double" : "triple") + "), "; + } + if (handlesStr.isEmpty()) + handlesStr = "Pas de poignée"; + else + handlesStr = handlesStr.substring(0, handlesStr.length() - 2); + handles.setText(handlesStr); + + TextView miseries = root.findViewById(R.id.miseries); + String miseriesStr = ""; + for (int i = 0; i < game.getGameType().getNbPlayers(); ++i) { + if (game.getMiseries().get(i)) + miseriesStr += game.getPlayers().get(i) + ", "; + } + if (miseriesStr.isEmpty()) + miseriesStr = "Pas de misère"; + else + miseriesStr = miseriesStr.substring(0, miseriesStr.length() - 2); + miseries.setText(miseriesStr); + + return root; + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/ynerant/tarot/ui/games/GameInfoModel.java b/app/src/main/java/fr/ynerant/tarot/ui/games/GameInfoModel.java new file mode 100644 index 0000000..524a9fb --- /dev/null +++ b/app/src/main/java/fr/ynerant/tarot/ui/games/GameInfoModel.java @@ -0,0 +1,6 @@ +package fr.ynerant.tarot.ui.games; + +import androidx.lifecycle.ViewModel; + +public class GameInfoModel extends ViewModel { +} diff --git a/app/src/main/java/fr/ynerant/tarot/ui/games/GamesMenuFragment.java b/app/src/main/java/fr/ynerant/tarot/ui/games/GamesMenuFragment.java new file mode 100644 index 0000000..1763109 --- /dev/null +++ b/app/src/main/java/fr/ynerant/tarot/ui/games/GamesMenuFragment.java @@ -0,0 +1,57 @@ +package fr.ynerant.tarot.ui.games; + +import android.os.Bundle; +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.ListAdapter; +import android.widget.ListView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProviders; + +import fr.ynerant.tarot.Game; +import fr.ynerant.tarot.MainActivity; +import fr.ynerant.tarot.Player; +import fr.ynerant.tarot.R; +import fr.ynerant.tarot.ui.home.HomeFragment; +import fr.ynerant.tarot.ui.stats.PersonalStatsFragment; + +public class GamesMenuFragment extends Fragment { + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, final Bundle savedInstanceState) { + ViewModelProviders.of(this).get(GamesMenuModel.class); + final View root = inflater.inflate(R.layout.fragment_games_menu, container, false); + + if (PreferenceManager.getDefaultSharedPreferences(MainActivity.INSTANCE).getString("token", null) == null) { + //noinspection ConstantConditions + getFragmentManager().beginTransaction().replace(R.id.nav_games, new HomeFragment(), "Se connecter").commit(); + return root; + } + + ListView gameList = root.findViewById(R.id.game_list); + final ListAdapter adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_expandable_list_item_1, Game.getAllGames()); + gameList.setAdapter(adapter); + + gameList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Game game = (Game) adapter.getItem(position); + GameInfoFragment fragment = new GameInfoFragment(); + Bundle bundle = new Bundle(); + bundle.putInt("gameId", game.getId()); + fragment.setArguments(bundle); + //noinspection ConstantConditions + getFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, fragment, "Détails d'une partie") + .addToBackStack("Détails d'une partie").commit(); + } + }); + + return root; + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/ynerant/tarot/ui/games/GamesMenuModel.java b/app/src/main/java/fr/ynerant/tarot/ui/games/GamesMenuModel.java new file mode 100644 index 0000000..b76db1b --- /dev/null +++ b/app/src/main/java/fr/ynerant/tarot/ui/games/GamesMenuModel.java @@ -0,0 +1,6 @@ +package fr.ynerant.tarot.ui.games; + +import androidx.lifecycle.ViewModel; + +public class GamesMenuModel extends ViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/fr/ynerant/tarot/ui/newgame/NewGameFragment.java b/app/src/main/java/fr/ynerant/tarot/ui/newgame/NewGameFragment.java index 11102bf..588743a 100644 --- a/app/src/main/java/fr/ynerant/tarot/ui/newgame/NewGameFragment.java +++ b/app/src/main/java/fr/ynerant/tarot/ui/newgame/NewGameFragment.java @@ -47,6 +47,14 @@ public class NewGameFragment extends Fragment { return root; } + while (Player.getAllPlayers().isEmpty()) { + try { + Thread.sleep(500L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + TextView textView = root.findViewById(R.id.text_new_game); textView.setText(R.string.menu_new_game); @@ -86,7 +94,6 @@ public class NewGameFragment extends Fragment { 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); @@ -198,7 +205,6 @@ public class NewGameFragment extends Fragment { ArrayAdapter 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); for (int i = 0; i < 6; ++i) { @@ -240,7 +246,6 @@ public class NewGameFragment extends Fragment { } attacker.setOnItemSelectedListener(justUpdate); follower.setOnItemSelectedListener(justUpdate); - dealer.setOnItemSelectedListener(justUpdate); nb_players.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override diff --git a/app/src/main/java/fr/ynerant/tarot/ui/stats/PersonalStatsMenuFragment.java b/app/src/main/java/fr/ynerant/tarot/ui/stats/PersonalStatsMenuFragment.java index 331ae6c..701203e 100644 --- a/app/src/main/java/fr/ynerant/tarot/ui/stats/PersonalStatsMenuFragment.java +++ b/app/src/main/java/fr/ynerant/tarot/ui/stats/PersonalStatsMenuFragment.java @@ -67,7 +67,7 @@ public class PersonalStatsMenuFragment extends Fragment { fragment.setArguments(bundle); //noinspection ConstantConditions getFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, fragment, "Statistiques individuelles de " + player.getName()) - .addToBackStack("Statistiques individuelles").commit(); + .addToBackStack("Statistiques individuelles de " + player.getName()).commit(); } }); diff --git a/app/src/main/res/layout/fragment_game_info.xml b/app/src/main/res/layout/fragment_game_info.xml new file mode 100644 index 0000000..c8ce961 --- /dev/null +++ b/app/src/main/res/layout/fragment_game_info.xml @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_games_menu.xml b/app/src/main/res/layout/fragment_games_menu.xml new file mode 100644 index 0000000..1fd75a4 --- /dev/null +++ b/app/src/main/res/layout/fragment_games_menu.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_new_game.xml b/app/src/main/res/layout/fragment_new_game.xml index a8f7f47..935ac0f 100644 --- a/app/src/main/res/layout/fragment_new_game.xml +++ b/app/src/main/res/layout/fragment_new_game.xml @@ -202,24 +202,6 @@ android:layout_height="wrap_content" /> - - - - - - - - + android:textSize="18sp" /> + android:textSize="18sp" /> + android:textSize="18sp" /> + android:textSize="18sp" /> @@ -671,38 +653,38 @@ android:id="@+id/player1_points" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textSize="24sp" /> + android:textSize="18sp" /> + android:textSize="18sp" /> + android:textSize="18sp" /> + android:textSize="18sp" /> @@ -714,38 +696,38 @@ android:id="@+id/player1_total_points" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textSize="24sp" /> + android:textSize="18sp" /> + android:textSize="18sp" /> + android:textSize="18sp" /> + android:textSize="18sp" /> diff --git a/app/src/main/res/layout/fragment_personal_stats.xml b/app/src/main/res/layout/fragment_personal_stats.xml index ccb1cc7..c118a02 100644 --- a/app/src/main/res/layout/fragment_personal_stats.xml +++ b/app/src/main/res/layout/fragment_personal_stats.xml @@ -12,14 +12,14 @@ @@ -27,13 +27,13 @@ @@ -41,13 +41,13 @@ @@ -55,13 +55,13 @@ diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index 3b45163..b84a578 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -13,6 +13,11 @@ android:id="@+id/nav_personal_stats" android:icon="@drawable/ic_launcher_foreground" android:title="@string/personal_stats" /> + + diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 150a749..bf53767 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -22,4 +22,10 @@ android:name="fr.ynerant.tarot.ui.stats.PersonalStatsMenuFragment" android:label="@string/personal_stats" tools:layout="@layout/fragment_personal_stats_menu" /> + + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index aa042f0..c858434 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -34,4 +34,5 @@ Personne Oui Petite + Parties \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 12e6336..ac64585 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -34,4 +34,5 @@ Nobody Yes Little + Parties