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. ;)

This commit is contained in:
Kevin Whitaker
2015-04-19 23:26:36 -04:00
parent 8103e30036
commit f2cc55ca28
11 changed files with 192 additions and 34 deletions

View File

@@ -10,6 +10,7 @@ import android.view.*;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.Toast;
import com.eyecreate.miceandmystics.miceandmystics.adapters.CampaignAdapter; import com.eyecreate.miceandmystics.miceandmystics.adapters.CampaignAdapter;
import com.eyecreate.miceandmystics.miceandmystics.model.Enums.CampaignType; import com.eyecreate.miceandmystics.miceandmystics.model.Enums.CampaignType;
@@ -42,25 +43,33 @@ public class CampaignActivity extends RecyclerViewActivity {
//noinspection SimplifiableIfStatement //noinspection SimplifiableIfStatement
if (id == R.id.action_add_campaign) { if (id == R.id.action_add_campaign) {
LayoutInflater inflator = (LayoutInflater)(new ContextThemeWrapper(this, R.style.dialogTheme)).getSystemService(Context.LAYOUT_INFLATER_SERVICE); newCampaignDialog();
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<CampaignType>(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();
return true; return true;
} }
return super.onOptionsItemSelected(item); 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<CampaignType>(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();
}
} }

View File

@@ -1,11 +1,20 @@
package com.eyecreate.miceandmystics.miceandmystics; package com.eyecreate.miceandmystics.miceandmystics;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.view.Menu; import android.view.*;
import android.view.MenuItem; 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.adapters.CampaignDetailsAdapter;
import com.eyecreate.miceandmystics.miceandmystics.model.Campaign; 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 { public class CampaignDetailsActivity extends RecyclerViewActivity {
@@ -38,9 +47,65 @@ public class CampaignDetailsActivity extends RecyclerViewActivity {
//noinspection SimplifiableIfStatement //noinspection SimplifiableIfStatement
if (id == R.id.action_add_character) { if (id == R.id.action_add_character) {
newCharacterDialog();
return true;
} else if (id == R.id.action_add_player) {
newPlayerDialog();
return true; return true;
} }
return super.onOptionsItemSelected(item); 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<CharacterNames>(this, R.layout.simple_spinner_item, CharacterNames.values()));
charSpinner.setSelection(0);
final Spinner playerSpinner = ((Spinner)dialogView.findViewById(R.id.player_name));
RealmResults<Player> players = MiceAndMysticsApplication.getRealmInstance().where(Player.class).findAll();
playerSpinner.setAdapter(new ArrayAdapter<String>(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();
}
} }

View File

@@ -6,6 +6,7 @@ import android.view.LayoutInflater;
import android.view.ViewGroup; import android.view.ViewGroup;
import com.eyecreate.miceandmystics.miceandmystics.MiceAndMysticsApplication; import com.eyecreate.miceandmystics.miceandmystics.MiceAndMysticsApplication;
import com.eyecreate.miceandmystics.miceandmystics.R; 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.model.Enums.CampaignType;
import com.eyecreate.miceandmystics.miceandmystics.viewholders.CampaignViewHolder; import com.eyecreate.miceandmystics.miceandmystics.viewholders.CampaignViewHolder;
import io.realm.RealmResults; import io.realm.RealmResults;
@@ -49,7 +50,13 @@ public class CampaignAdapter extends RecyclerView.Adapter<CampaignViewHolder> {
.where(com.eyecreate.miceandmystics.miceandmystics.model.Campaign.class) .where(com.eyecreate.miceandmystics.miceandmystics.model.Campaign.class)
.equalTo("campaignName",campaignName) .equalTo("campaignName",campaignName)
.findFirst(); .findFirst();
for(com.eyecreate.miceandmystics.miceandmystics.model.Character character:campaign.getCurrentCharacters()) {
CampaignDetailsAdapter.removeCharacterFromDB(character);
}
MiceAndMysticsApplication.getRealmInstance().beginTransaction(); MiceAndMysticsApplication.getRealmInstance().beginTransaction();
for(Achievement achievement:campaign.getPartyStoryAchievements()) {
achievement.removeFromRealm();
}
campaign.removeFromRealm(); campaign.removeFromRealm();
MiceAndMysticsApplication.getRealmInstance().commitTransaction(); MiceAndMysticsApplication.getRealmInstance().commitTransaction();
fullRefresh(); fullRefresh();

View File

@@ -4,6 +4,7 @@ import android.content.Context;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Toast;
import com.eyecreate.miceandmystics.miceandmystics.MiceAndMysticsApplication; import com.eyecreate.miceandmystics.miceandmystics.MiceAndMysticsApplication;
import com.eyecreate.miceandmystics.miceandmystics.R; import com.eyecreate.miceandmystics.miceandmystics.R;
import com.eyecreate.miceandmystics.miceandmystics.model.*; import com.eyecreate.miceandmystics.miceandmystics.model.*;
@@ -47,21 +48,51 @@ public class CampaignDetailsAdapter extends RecyclerView.Adapter<RecyclerView.Vi
notifyDataSetChanged(); notifyDataSetChanged();
} }
private boolean areThereDuplicates(Campaign campaign, CharacterNames character) {
for(Character chr:campaign.getCurrentCharacters()) {
if(chr.getCharacterName().equals(character.name())){
return true;
}
}
return false;
}
public void addCharacter(CharacterNames name, Player player) { public void addCharacter(CharacterNames name, Player player) {
MiceAndMysticsApplication.getRealmInstance().beginTransaction(); if(!areThereDuplicates(currentCampaign,name)) {
Character character = MiceAndMysticsApplication.getRealmInstance().createObject(Character.class); MiceAndMysticsApplication.getRealmInstance().beginTransaction();
character.setUuid(UUID.randomUUID().toString()); Character character = MiceAndMysticsApplication.getRealmInstance().createObject(Character.class);
character.setCharacterName(name.name()); character.setUuid(UUID.randomUUID().toString());
character.setControllingPlayer(player); character.setCharacterName(name.name());
MiceAndMysticsApplication.getRealmInstance().commitTransaction(); character.setControllingPlayer(player);
fullRefresh(); currentCampaign.getCurrentCharacters().add(character);
MiceAndMysticsApplication.getRealmInstance().commitTransaction();
fullRefresh();
} else {
Toast.makeText(inflater.getContext(),"Can not have two of same character in game.",Toast.LENGTH_LONG).show();
}
} }
public void removeCharacter(Character character) { public void removeCharacter(Character character) {
removeCharacterFromDB(character);
fullRefresh();
}
public static void removeCharacterFromDB(Character character) {
removeItemsAndAbilities(character);
MiceAndMysticsApplication.getRealmInstance().beginTransaction(); MiceAndMysticsApplication.getRealmInstance().beginTransaction();
character.removeFromRealm(); character.removeFromRealm();
MiceAndMysticsApplication.getRealmInstance().commitTransaction(); MiceAndMysticsApplication.getRealmInstance().commitTransaction();
fullRefresh(); }
private static void removeItemsAndAbilities(Character character) {
MiceAndMysticsApplication.getRealmInstance().beginTransaction();
for(Ability ability:character.getAbilities()) {
ability.removeFromRealm();
}
for(BackpackItem item:character.getStoredItems()) {
item.removeFromRealm();
}
MiceAndMysticsApplication.getRealmInstance().commitTransaction();
} }
@Override @Override

View File

@@ -3,16 +3,16 @@ package com.eyecreate.miceandmystics.miceandmystics.model;
import io.realm.RealmObject; import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey; import io.realm.annotations.PrimaryKey;
import java.util.List;
import java.util.UUID; import java.util.UUID;
public class Player extends RealmObject { public class Player extends RealmObject {
@PrimaryKey @PrimaryKey
private String uuid;
private String playerName; private String playerName;
public Player() {} public Player() {}
public Player(String playerName) {setPlayerName(playerName);setUuid(UUID.randomUUID().toString());} public Player(String playerName) {setPlayerName(playerName);}
public String getPlayerName() { public String getPlayerName() {
return playerName; return playerName;
@@ -22,11 +22,13 @@ public class Player extends RealmObject {
this.playerName = playerName; this.playerName = playerName;
} }
public String getUuid() { public static String[] convertPlayerListToStringArray(List<Player> playerList) {
return uuid; String[] outputPlayers = new String[playerList.size()];
} int iter = 0;
for(Player player:playerList){
public void setUuid(String uuid) { outputPlayers[iter] = player.getPlayerName();
this.uuid = uuid; iter++;
}
return outputPlayers;
} }
} }

View File

@@ -23,6 +23,8 @@ public class CampaignDetailsViewHolder extends RecyclerView.ViewHolder implement
characterName = (TextView)itemView.findViewById(R.id.character_name); characterName = (TextView)itemView.findViewById(R.id.character_name);
playerName = (TextView)itemView.findViewById(R.id.character_player); playerName = (TextView)itemView.findViewById(R.id.character_player);
characterIcon = (ImageView)itemView.findViewById(R.id.character_icon); characterIcon = (ImageView)itemView.findViewById(R.id.character_icon);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
} }
public void bindModel(Character character) { public void bindModel(Character character) {

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:orientation="vertical"
android:padding="7dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<EditText <EditText

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="7dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/dark_red"
android:text="Character:"/>
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/character_type"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/dark_red"
android:text="Player:"/>
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/player_name"/>
</LinearLayout>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="7dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/player_name"/>
</LinearLayout>

View File

@@ -6,4 +6,8 @@
android:title="Add Character" android:title="Add Character"
android:icon="@android:drawable/ic_menu_add" android:icon="@android:drawable/ic_menu_add"
app:showAsAction="always"/> app:showAsAction="always"/>
<item android:id="@+id/action_add_player"
android:title="Add Player"
android:icon="@mipmap/ic_menu_invite"
app:showAsAction="always"/>
</menu> </menu>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB