From 4c38eaa9c4d0e639d28c12d3400f4d3a3f62886c Mon Sep 17 00:00:00 2001 From: Jawnnypoo Date: Sat, 7 May 2016 01:18:11 -0500 Subject: [PATCH 1/3] Give Group a proper equals method, which checks to see if the IDs match --- .../habitrpgwrapper/lib/models/Group.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Group.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Group.java index 1e4dc7c95..f4446876d 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Group.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Group.java @@ -40,4 +40,21 @@ public class Group extends BaseModel { public int challengeCount; // TODO Challenges + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Group group = (Group) o; + + return id != null ? id.equals(group.id) : group.id == null; + + } + + @Override + public int hashCode() { + return id != null ? id.hashCode() : 0; + } } From 6bb57e5f50e16555d88d7d1709456e84fac14620 Mon Sep 17 00:00:00 2001 From: Jawnnypoo Date: Sat, 7 May 2016 01:24:44 -0500 Subject: [PATCH 2/3] Change API call to where it reflects the actual response (void). Update the Join/Leave state properly based on the callbacks when attemping to join or leave guilds. --- .../PublicGuildsRecyclerViewAdapter.java | 102 ++++++++++-------- .../ui/fragments/social/GuildFragment.java | 11 +- .../fragments/social/party/PartyFragment.java | 4 +- .../habitrpgwrapper/lib/api/ApiService.java | 2 +- 4 files changed, 72 insertions(+), 47 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.java index c7cba1352..55c7ba11e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.java @@ -6,6 +6,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; +import android.widget.Toast; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.R; @@ -40,16 +41,64 @@ public class PublicGuildsRecyclerViewAdapter extends RecyclerView.Adapter { + Group guild = (Group) v.getTag(); + GuildFragment guildFragment = new GuildFragment(); + guildFragment.setGuild(guild); + guildFragment.isMember = isInGroup(guild); + DisplayFragmentEvent event = new DisplayFragmentEvent(); + event.fragment = guildFragment; + EventBus.getDefault().post(event); + }); + guildViewHolder.joinLeaveButton.setOnClickListener(v -> { + Group guild = (Group) v.getTag(); + boolean isMember = this.memberGuildIDs != null && this.memberGuildIDs.contains(guild.id); + if (isMember) { + PublicGuildsRecyclerViewAdapter.this.apiHelper.apiService.leaveGroup(guild.id, new Callback() { + @Override + public void success(Void nope, Response response) { + memberGuildIDs.remove(guild.id); + int indexOfGroup = publicGuildList.indexOf(guild); + notifyItemChanged(indexOfGroup); + } - return new GuildViewHolder(view); + @Override + public void failure(RetrofitError error) { + Toast.makeText(guildViewHolder.itemView.getContext(), R.string.unknown_error, Toast.LENGTH_SHORT) + .show(); + } + }); + } else { + PublicGuildsRecyclerViewAdapter.this.apiHelper.apiService.joinGroup(guild.id, new Callback() { + @Override + public void success(Group group, Response response) { + memberGuildIDs.add(group.id); + int indexOfGroup = publicGuildList.indexOf(group); + notifyItemChanged(indexOfGroup); + } + + @Override + public void failure(RetrofitError error) { + Toast.makeText(guildViewHolder.itemView.getContext(), R.string.unknown_error, Toast.LENGTH_SHORT) + .show(); + } + }); + } + + }); + return guildViewHolder; } @Override public void onBindViewHolder(GuildViewHolder holder, int position) { - holder.bind(publicGuildList.get(position)); + Group guild = publicGuildList.get(position); + boolean isInGroup = isInGroup(guild); + holder.bind(guild, isInGroup); + holder.itemView.setTag(guild); + holder.joinLeaveButton.setTag(guild); } @Override @@ -57,7 +106,11 @@ public class PublicGuildsRecyclerViewAdapter extends RecyclerView.Adapter { + private boolean isInGroup(Group guild) { + return this.memberGuildIDs != null && this.memberGuildIDs.contains(guild.id); + } + + static class GuildViewHolder extends RecyclerView.ViewHolder { @Bind(R.id.nameTextView) TextView nameTextView; @@ -71,57 +124,20 @@ public class PublicGuildsRecyclerViewAdapter extends RecyclerView.Adapter { this.isMember = true; return true; case R.id.menu_guild_leave: - this.mAPIHelper.apiService.leaveGroup(this.guild.id, this); + this.mAPIHelper.apiService.leaveGroup(this.guild.id, new Callback() { + @Override + public void success(Void aVoid, Response response) { + getActivity().supportInvalidateOptionsMenu(); + } + + @Override + public void failure(RetrofitError error) { + } + }); this.isMember = false; return true; case R.id.menu_guild_edit: diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java index 56a45f58b..331e83e57 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.java @@ -135,9 +135,9 @@ public class PartyFragment extends BaseMainFragment { this.displayEditForm(); return true; case R.id.menu_guild_leave: - this.mAPIHelper.apiService.leaveGroup(this.group.id, new Callback() { + this.mAPIHelper.apiService.leaveGroup(this.group.id, new Callback() { @Override - public void success(Group group, Response response) { + public void success(Void aVoid, Response response) { getActivity().getSupportFragmentManager().beginTransaction().remove(PartyFragment.this).commit(); } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java index 35cf16759..ab4de9ae1 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java @@ -145,7 +145,7 @@ public interface ApiService { void joinGroup(@Path("gid") String groupId, Callback cb); @POST("/groups/{gid}/leave") - void leaveGroup(@Path("gid") String groupId, Callback cb); + void leaveGroup(@Path("gid") String groupId, Callback cb); @POST("/groups/{gid}/chat") void postGroupChat(@Path("gid") String groupId, @Query("message") String message, Callback cb); From fddd0537775fcf653d289a660112f3e9ae282168 Mon Sep 17 00:00:00 2001 From: Jawnnypoo Date: Sat, 7 May 2016 01:25:02 -0500 Subject: [PATCH 3/3] Add ripple touch state to guilds so that it is more apparent that they are clickable --- Habitica/res/layout/item_public_guild.xml | 37 ++++++++++++----------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/Habitica/res/layout/item_public_guild.xml b/Habitica/res/layout/item_public_guild.xml index 284134399..928e6100d 100644 --- a/Habitica/res/layout/item_public_guild.xml +++ b/Habitica/res/layout/item_public_guild.xml @@ -1,44 +1,47 @@ - + android:orientation="vertical" + android:padding="@dimen/row_padding" + android:background="?attr/selectableItemBackground"> + android:layout_height="wrap_content" + android:orientation="horizontal"> + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + android:orientation="horizontal"> + android:layout_weight="1" + android:text="New Text" />