From f2cc55ca28a0dc0090003f69745ca858083ef63b Mon Sep 17 00:00:00 2001 From: Kevin Whitaker Date: Sun, 19 Apr 2015 23:26:36 -0400 Subject: [PATCH] Do a better job at fully removing things when deleted. Add more edge case logic. Clean up messy functions. Have players and characters able to be added. Stole an icon from AOSP. ;) --- .../miceandmystics/CampaignActivity.java | 41 +++++++---- .../CampaignDetailsActivity.java | 69 +++++++++++++++++- .../adapters/CampaignAdapter.java | 7 ++ .../adapters/CampaignDetailsAdapter.java | 47 ++++++++++-- .../miceandmystics/model/Player.java | 18 +++-- .../CampaignDetailsViewHolder.java | 2 + .../main/res/layout/dialog_new_campaign.xml | 1 + .../main/res/layout/dialog_new_character.xml | 26 +++++++ .../src/main/res/layout/dialog_new_player.xml | 11 +++ .../main/res/menu/menu_campaign_details.xml | 4 + .../main/res/mipmap-xxhdpi/ic_menu_invite.png | Bin 0 -> 3271 bytes 11 files changed, 192 insertions(+), 34 deletions(-) create mode 100644 MiceAndMysticsTracker/src/main/res/layout/dialog_new_character.xml create mode 100644 MiceAndMysticsTracker/src/main/res/layout/dialog_new_player.xml create mode 100644 MiceAndMysticsTracker/src/main/res/mipmap-xxhdpi/ic_menu_invite.png diff --git a/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/CampaignActivity.java b/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/CampaignActivity.java index cfcaf93..aac6c20 100644 --- a/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/CampaignActivity.java +++ b/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/CampaignActivity.java @@ -10,6 +10,7 @@ import android.view.*; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.Spinner; +import android.widget.Toast; import com.eyecreate.miceandmystics.miceandmystics.adapters.CampaignAdapter; import com.eyecreate.miceandmystics.miceandmystics.model.Enums.CampaignType; @@ -42,25 +43,33 @@ public class CampaignActivity extends RecyclerViewActivity { //noinspection SimplifiableIfStatement if (id == R.id.action_add_campaign) { - LayoutInflater inflator = (LayoutInflater)(new ContextThemeWrapper(this, R.style.dialogTheme)).getSystemService(Context.LAYOUT_INFLATER_SERVICE); - final View dialogView = inflator.inflate(R.layout.dialog_new_campaign, null, false); - final Spinner typeSpinner = ((Spinner)dialogView.findViewById(R.id.campaign_type)); - typeSpinner.setAdapter(new ArrayAdapter(this, R.layout.simple_spinner_item, CampaignType.values())); - typeSpinner.setSelection(0); - AlertDialog addDialog = new AlertDialog.Builder(this,R.style.dialogTheme) - .setMessage("Please give your new campaign a unique name:") - .setView(dialogView) - .setPositiveButton("Ok", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - ((CampaignAdapter) getAdapter()).addItem(((EditText) dialogView.findViewById(R.id.campaign_name)).getText().toString(), CampaignType.valueOfDisplayName(typeSpinner.getSelectedItem().toString())); - } - }) - .create(); - addDialog.show(); + newCampaignDialog(); return true; } return super.onOptionsItemSelected(item); } + + public void newCampaignDialog() { + LayoutInflater inflator = (LayoutInflater)(new ContextThemeWrapper(this, R.style.dialogTheme)).getSystemService(Context.LAYOUT_INFLATER_SERVICE); + final View dialogView = inflator.inflate(R.layout.dialog_new_campaign, null, false); + final Spinner typeSpinner = ((Spinner)dialogView.findViewById(R.id.campaign_type)); + typeSpinner.setAdapter(new ArrayAdapter(this, R.layout.simple_spinner_item, CampaignType.values())); + typeSpinner.setSelection(0); + AlertDialog addDialog = new AlertDialog.Builder(this,R.style.dialogTheme) + .setMessage("Please give your new campaign a unique name:") + .setView(dialogView) + .setPositiveButton("Ok", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if(((EditText) dialogView.findViewById(R.id.campaign_name)).getText().length()>0) { + ((CampaignAdapter) getAdapter()).addItem(((EditText) dialogView.findViewById(R.id.campaign_name)).getText().toString(), CampaignType.valueOfDisplayName(typeSpinner.getSelectedItem().toString())); + } else { + Toast.makeText(CampaignActivity.this,"Can not have blank name!",Toast.LENGTH_LONG).show(); + } + } + }) + .create(); + addDialog.show(); + } } diff --git a/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/CampaignDetailsActivity.java b/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/CampaignDetailsActivity.java index 48055f9..f986c21 100644 --- a/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/CampaignDetailsActivity.java +++ b/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/CampaignDetailsActivity.java @@ -1,11 +1,20 @@ package com.eyecreate.miceandmystics.miceandmystics; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; -import android.view.Menu; -import android.view.MenuItem; +import android.view.*; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.Toast; import com.eyecreate.miceandmystics.miceandmystics.adapters.CampaignDetailsAdapter; import com.eyecreate.miceandmystics.miceandmystics.model.Campaign; +import com.eyecreate.miceandmystics.miceandmystics.model.Enums.CharacterNames; +import com.eyecreate.miceandmystics.miceandmystics.model.Player; +import io.realm.RealmResults; public class CampaignDetailsActivity extends RecyclerViewActivity { @@ -38,9 +47,65 @@ public class CampaignDetailsActivity extends RecyclerViewActivity { //noinspection SimplifiableIfStatement if (id == R.id.action_add_character) { + newCharacterDialog(); + return true; + } else if (id == R.id.action_add_player) { + newPlayerDialog(); return true; } return super.onOptionsItemSelected(item); } + + public void newPlayerDialog() { + LayoutInflater inflator = (LayoutInflater)(new ContextThemeWrapper(this, R.style.dialogTheme)).getSystemService(Context.LAYOUT_INFLATER_SERVICE); + final View dialogView = inflator.inflate(R.layout.dialog_new_player, null, false); + final EditText playerEdit = ((EditText)dialogView.findViewById(R.id.player_name)); + AlertDialog addDialog = new AlertDialog.Builder(this,R.style.dialogTheme) + .setMessage("Please name the new player:") + .setView(dialogView) + .setPositiveButton("Create", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (playerEdit.getText().length()>0) { + MiceAndMysticsApplication.getRealmInstance().beginTransaction(); + Player player = MiceAndMysticsApplication.getRealmInstance().createObject(Player.class); + player.setPlayerName(playerEdit.getText().toString()); + MiceAndMysticsApplication.getRealmInstance().copyToRealmOrUpdate(player); + MiceAndMysticsApplication.getRealmInstance().commitTransaction(); + } else { + Toast.makeText(CampaignDetailsActivity.this,"Can not have a blank name!",Toast.LENGTH_LONG).show(); + } + } + }) + .create(); + addDialog.show(); + } + + public void newCharacterDialog() { + LayoutInflater inflator = (LayoutInflater)(new ContextThemeWrapper(this, R.style.dialogTheme)).getSystemService(Context.LAYOUT_INFLATER_SERVICE); + final View dialogView = inflator.inflate(R.layout.dialog_new_character, null, false); + final Spinner charSpinner = ((Spinner)dialogView.findViewById(R.id.character_type)); + charSpinner.setAdapter(new ArrayAdapter(this, R.layout.simple_spinner_item, CharacterNames.values())); + charSpinner.setSelection(0); + final Spinner playerSpinner = ((Spinner)dialogView.findViewById(R.id.player_name)); + RealmResults players = MiceAndMysticsApplication.getRealmInstance().where(Player.class).findAll(); + playerSpinner.setAdapter(new ArrayAdapter(this, R.layout.simple_spinner_item, Player.convertPlayerListToStringArray(players.subList(0,players.size())))); + playerSpinner.setSelection(0); + AlertDialog addDialog = new AlertDialog.Builder(this,R.style.dialogTheme) + .setMessage("Please select your character and controlling player:") + .setView(dialogView) + .setPositiveButton("Create", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if(playerSpinner.getSelectedItem() != null) { + ((CampaignDetailsAdapter) getAdapter()).addCharacter(CharacterNames.valueOf(charSpinner.getSelectedItem().toString()), MiceAndMysticsApplication.getRealmInstance().where(Player.class).equalTo("playerName", playerSpinner.getSelectedItem().toString()).findFirst()); + } else { + Toast.makeText(CampaignDetailsActivity.this,"No player selected. Maybe try making one first.",Toast.LENGTH_LONG).show(); + } + } + }) + .create(); + addDialog.show(); + } } diff --git a/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/adapters/CampaignAdapter.java b/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/adapters/CampaignAdapter.java index ce051d5..4a3b0ce 100644 --- a/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/adapters/CampaignAdapter.java +++ b/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/adapters/CampaignAdapter.java @@ -6,6 +6,7 @@ import android.view.LayoutInflater; import android.view.ViewGroup; import com.eyecreate.miceandmystics.miceandmystics.MiceAndMysticsApplication; import com.eyecreate.miceandmystics.miceandmystics.R; +import com.eyecreate.miceandmystics.miceandmystics.model.*; import com.eyecreate.miceandmystics.miceandmystics.model.Enums.CampaignType; import com.eyecreate.miceandmystics.miceandmystics.viewholders.CampaignViewHolder; import io.realm.RealmResults; @@ -49,7 +50,13 @@ public class CampaignAdapter extends RecyclerView.Adapter { .where(com.eyecreate.miceandmystics.miceandmystics.model.Campaign.class) .equalTo("campaignName",campaignName) .findFirst(); + for(com.eyecreate.miceandmystics.miceandmystics.model.Character character:campaign.getCurrentCharacters()) { + CampaignDetailsAdapter.removeCharacterFromDB(character); + } MiceAndMysticsApplication.getRealmInstance().beginTransaction(); + for(Achievement achievement:campaign.getPartyStoryAchievements()) { + achievement.removeFromRealm(); + } campaign.removeFromRealm(); MiceAndMysticsApplication.getRealmInstance().commitTransaction(); fullRefresh(); diff --git a/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/adapters/CampaignDetailsAdapter.java b/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/adapters/CampaignDetailsAdapter.java index 31f91d3..30b3b1b 100644 --- a/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/adapters/CampaignDetailsAdapter.java +++ b/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/adapters/CampaignDetailsAdapter.java @@ -4,6 +4,7 @@ import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.ViewGroup; +import android.widget.Toast; import com.eyecreate.miceandmystics.miceandmystics.MiceAndMysticsApplication; import com.eyecreate.miceandmystics.miceandmystics.R; import com.eyecreate.miceandmystics.miceandmystics.model.*; @@ -47,21 +48,51 @@ public class CampaignDetailsAdapter extends RecyclerView.Adapter playerList) { + String[] outputPlayers = new String[playerList.size()]; + int iter = 0; + for(Player player:playerList){ + outputPlayers[iter] = player.getPlayerName(); + iter++; + } + return outputPlayers; } } diff --git a/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/viewholders/CampaignDetailsViewHolder.java b/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/viewholders/CampaignDetailsViewHolder.java index a1f9993..37464ee 100644 --- a/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/viewholders/CampaignDetailsViewHolder.java +++ b/MiceAndMysticsTracker/src/main/java/com/eyecreate/miceandmystics/miceandmystics/viewholders/CampaignDetailsViewHolder.java @@ -23,6 +23,8 @@ public class CampaignDetailsViewHolder extends RecyclerView.ViewHolder implement characterName = (TextView)itemView.findViewById(R.id.character_name); playerName = (TextView)itemView.findViewById(R.id.character_player); characterIcon = (ImageView)itemView.findViewById(R.id.character_icon); + itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); } public void bindModel(Character character) { diff --git a/MiceAndMysticsTracker/src/main/res/layout/dialog_new_campaign.xml b/MiceAndMysticsTracker/src/main/res/layout/dialog_new_campaign.xml index 7557674..ff830bd 100644 --- a/MiceAndMysticsTracker/src/main/res/layout/dialog_new_campaign.xml +++ b/MiceAndMysticsTracker/src/main/res/layout/dialog_new_campaign.xml @@ -1,6 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/MiceAndMysticsTracker/src/main/res/layout/dialog_new_player.xml b/MiceAndMysticsTracker/src/main/res/layout/dialog_new_player.xml new file mode 100644 index 0000000..0f73f87 --- /dev/null +++ b/MiceAndMysticsTracker/src/main/res/layout/dialog_new_player.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/MiceAndMysticsTracker/src/main/res/menu/menu_campaign_details.xml b/MiceAndMysticsTracker/src/main/res/menu/menu_campaign_details.xml index 0a6d9b4..05c4ad0 100644 --- a/MiceAndMysticsTracker/src/main/res/menu/menu_campaign_details.xml +++ b/MiceAndMysticsTracker/src/main/res/menu/menu_campaign_details.xml @@ -6,4 +6,8 @@ android:title="Add Character" android:icon="@android:drawable/ic_menu_add" app:showAsAction="always"/> + diff --git a/MiceAndMysticsTracker/src/main/res/mipmap-xxhdpi/ic_menu_invite.png b/MiceAndMysticsTracker/src/main/res/mipmap-xxhdpi/ic_menu_invite.png new file mode 100644 index 0000000000000000000000000000000000000000..8020fd87860be32af9706caca693f01d49330467 GIT binary patch literal 3271 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 OS~wA136*w~#Qy-u0&(X6 literal 0 HcmV?d00001 -- GitLab