From 46320f4ba3c2e88b78e827a0c0380b82a2b8df4e Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Wed, 22 Jun 2016 12:35:04 -0500 Subject: [PATCH 1/6] Added reading inbox --- Habitica/res/layout/fragment_inbox.xml | 41 +++++++ .../layout/fragment_inbox_message_list.xml | 18 +++ Habitica/res/values/strings.sidebar.xml | 1 + Habitica/res/values/strings.xml | 9 +- .../habitrpg/android/habitica/APIHelper.java | 3 +- .../android/habitica/HabitDatabase.java | 2 +- .../habitica/components/AppComponent.java | 6 + .../ui/fragments/social/InboxFragment.java | 114 +++++++++++++++++ .../social/InboxMessageListFragment.java | 104 ++++++++++++++++ .../habitica/ui/menu/MainDrawerBuilder.java | 10 +- .../lib/models/HabitRPGUser.java | 16 +++ .../habitrpgwrapper/lib/models/Inbox.java | 115 ++++++++++++++++++ 12 files changed, 432 insertions(+), 7 deletions(-) create mode 100644 Habitica/res/layout/fragment_inbox.xml create mode 100644 Habitica/res/layout/fragment_inbox_message_list.xml create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java create mode 100644 Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Inbox.java diff --git a/Habitica/res/layout/fragment_inbox.xml b/Habitica/res/layout/fragment_inbox.xml new file mode 100644 index 000000000..9108559c6 --- /dev/null +++ b/Habitica/res/layout/fragment_inbox.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/Habitica/res/layout/fragment_inbox_message_list.xml b/Habitica/res/layout/fragment_inbox_message_list.xml new file mode 100644 index 000000000..175342514 --- /dev/null +++ b/Habitica/res/layout/fragment_inbox_message_list.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/Habitica/res/values/strings.sidebar.xml b/Habitica/res/values/strings.sidebar.xml index 7de63c092..c6bad659a 100644 --- a/Habitica/res/values/strings.sidebar.xml +++ b/Habitica/res/values/strings.sidebar.xml @@ -3,6 +3,7 @@ Tasks Skills Social + Inbox Tavern Party Purchase Gems diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index f4d2bf21b..b00802a48 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -56,9 +56,9 @@ Report a Bug Source Code - - Connection Error - You are not connected to the internet. + + Connection Error + You are not connected to the internet. There seems to be a problem with the server. Try again later. Authentication Error @@ -347,4 +347,7 @@ To start, which parts of your life do you want to improve? Open in play store Are you sure you want to change your class? This will cost 3 gems. Message from %1$s + + + Hello blank fragment diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java index 4190fe332..4673d7f07 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/APIHelper.java @@ -91,6 +91,7 @@ import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; import okhttp3.logging.HttpLoggingInterceptor; +import okio.Buffer; import retrofit2.Call; import retrofit2.Converter; import retrofit2.Retrofit; @@ -151,7 +152,7 @@ public class APIHelper implements Action1 { HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); if (BuildConfig.DEBUG) { - logging.setLevel(HttpLoggingInterceptor.Level.BASIC); + logging.setLevel(HttpLoggingInterceptor.Level.BODY); } OkHttpClient client = new OkHttpClient.Builder() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java index 5a688bde6..ac803aff5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java @@ -7,5 +7,5 @@ public class HabitDatabase { public static final String NAME = "Habitica"; - public static final int VERSION = 21; + public static final int VERSION = 22; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java index 2f22c62b5..03384aa2d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java @@ -39,6 +39,8 @@ import com.habitrpg.android.habitica.ui.fragments.social.ChatListFragment; import com.habitrpg.android.habitica.ui.fragments.social.GroupInformationFragment; import com.habitrpg.android.habitica.ui.fragments.social.GuildFragment; import com.habitrpg.android.habitica.ui.fragments.social.GuildsOverviewFragment; +import com.habitrpg.android.habitica.ui.fragments.social.InboxFragment; +import com.habitrpg.android.habitica.ui.fragments.social.InboxMessageListFragment; import com.habitrpg.android.habitica.ui.fragments.social.PublicGuildsFragment; import com.habitrpg.android.habitica.ui.fragments.social.TavernFragment; import com.habitrpg.android.habitica.ui.fragments.social.party.PartyFragment; @@ -144,4 +146,8 @@ public interface AppComponent { void inject(HabiticaApplication habiticaApplication); void inject(PreferencesFragment preferencesFragment); + + void inject(InboxFragment inboxFragment); + + void inject(InboxMessageListFragment inboxMessageListFragment); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java new file mode 100644 index 000000000..9fa72b491 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java @@ -0,0 +1,114 @@ +package com.habitrpg.android.habitica.ui.fragments.social; + +import com.facebook.internal.BoltsMeasurementEventListener; +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; +import com.habitrpg.android.habitica.components.AppComponent; +import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; +import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage; +import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; + +import android.content.Context; +import android.os.Bundle; +import android.support.v4.util.ArrayMap; +import android.support.v4.widget.SwipeRefreshLayout; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class InboxFragment extends BaseMainFragment + implements SwipeRefreshLayout.OnRefreshListener, View.OnClickListener, HabitRPGUserCallback.OnUserReceived { + + @BindView(R.id.inbox_messages) + LinearLayout inboxMessagesListView; + + @BindView(R.id.inbox_refresh_layout) + SwipeRefreshLayout swipeRefreshLayout; + + Map messages; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + + View v = inflater.inflate(R.layout.fragment_inbox, container, false); + unbinder = ButterKnife.bind(this, v); + + swipeRefreshLayout.setOnRefreshListener(this); + + this.messages = this.user.getInbox().getMessages(); + if (this.messages != null) { + this.setInboxMessages(); + } + + return v; + } + + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + + @Override + public void onRefresh() { + swipeRefreshLayout.setRefreshing(true); + this.apiHelper.retrieveUser(true) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(new HabitRPGUserCallback(this), throwable -> {}); + } + + public void setInboxMessages() { + if (this.inboxMessagesListView == null) { + return; + } + + this.inboxMessagesListView.removeAllViewsInLayout(); + + LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + Map roomsAdded = new HashMap(); + + Iterator it = this.messages.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry)it.next(); + + ChatMessage message = (ChatMessage) pair.getValue(); + if (roomsAdded.get(message.user) != null && roomsAdded.get(message.user)) return; + roomsAdded.put(message.user, true); + + TextView entry = (TextView) inflater.inflate(R.layout.plain_list_item, this.inboxMessagesListView, false); + entry.setText(message.user); + entry.setOnClickListener(this); + this.inboxMessagesListView.addView(entry); + } + + } + + @Override + public void onClick(View v) { + TextView entry = (TextView) v; + InboxMessageListFragment inboxMessageListFragment = new InboxMessageListFragment(); + Log.v("test", entry.getText().toString()); + inboxMessageListFragment.setMessages(this.messages, entry.getText().toString()); + this.activity.displayFragment(inboxMessageListFragment); + } + + @Override + public void onUserReceived(HabitRPGUser user) { + this.user = user; + this.messages = user.getInbox().getMessages(); + this.setInboxMessages(); + swipeRefreshLayout.setRefreshing(false); + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java new file mode 100644 index 000000000..c2549d8c7 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java @@ -0,0 +1,104 @@ +package com.habitrpg.android.habitica.ui.fragments.social; + +import android.os.Bundle; +import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.google.common.collect.Lists; +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; +import com.habitrpg.android.habitica.components.AppComponent; +import com.habitrpg.android.habitica.ui.adapter.social.ChatRecyclerViewAdapter; +import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; +import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage; +import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import butterknife.BindView; +import butterknife.ButterKnife; + +/** + * Created by keithholliday on 6/20/16. + */ +public class InboxMessageListFragment extends BaseMainFragment + implements SwipeRefreshLayout.OnRefreshListener, HabitRPGUserCallback.OnUserReceived { + + @BindView(R.id.inbox_refresh_layout) + SwipeRefreshLayout swipeRefreshLayout; + + @BindView(R.id.chat_list) + RecyclerView chatRecyclerView; + + List messages; + ChatRecyclerViewAdapter chatAdapter; + String chatRoomUser; + + public InboxMessageListFragment() { + messages = new ArrayList(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + + View view = inflater.inflate(R.layout.fragment_inbox_message_list, container, false); + ButterKnife.bind(this, view); + swipeRefreshLayout.setOnRefreshListener(this); + + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this.getActivity()); + chatRecyclerView.setLayoutManager(layoutManager); + + chatAdapter = new ChatRecyclerViewAdapter(messages, null, null, false); + chatRecyclerView.setAdapter(chatAdapter); + + return view; + } + + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + + @Override + public void onRefresh() { + swipeRefreshLayout.setRefreshing(true); + this.apiHelper.retrieveUser(true) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(new HabitRPGUserCallback(this), throwable -> {}); + } + + public void setMessages(Map messages, String chatRoomUser) { + this.chatRoomUser = chatRoomUser; + + Iterator it = messages.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry)it.next(); + ChatMessage message = (ChatMessage) pair.getValue(); + if (!message.user.equals(chatRoomUser)) continue; + this.messages.add(message); + } + + if (this.chatAdapter != null) { + this.chatAdapter.notifyDataSetChanged(); + } + } + + @Override + public void onUserReceived(HabitRPGUser user) { + this.user = user; + this.setMessages(user.getInbox().getMessages(), this.chatRoomUser); + swipeRefreshLayout.setRefreshing(false); + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/MainDrawerBuilder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/MainDrawerBuilder.java index b23e7f4d2..2670f327b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/MainDrawerBuilder.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/MainDrawerBuilder.java @@ -14,6 +14,7 @@ import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemsFragment; import com.habitrpg.android.habitica.ui.fragments.inventory.stable.StableFragment; import com.habitrpg.android.habitica.ui.fragments.skills.SkillsFragment; import com.habitrpg.android.habitica.ui.fragments.social.GuildsOverviewFragment; +import com.habitrpg.android.habitica.ui.fragments.social.InboxFragment; import com.habitrpg.android.habitica.ui.fragments.social.TavernFragment; import com.habitrpg.android.habitica.ui.fragments.social.party.PartyFragment; import com.habitrpg.android.habitica.ui.fragments.tasks.TasksFragment; @@ -32,6 +33,7 @@ public class MainDrawerBuilder { // Change the identificationIDs to the position IDs so that its easier to set the selected entry public static final int SIDEBAR_TASKS = 0; public static final int SIDEBAR_SKILLS = 1; + public static final int SIDEBAR_INBOX = 15; public static final int SIDEBAR_TAVERN = 3; public static final int SIDEBAR_PARTY = 4; public static final int SIDEBAR_GUILDS = 5; @@ -44,8 +46,7 @@ public class MainDrawerBuilder { public static final int SIDEBAR_SETTINGS = 12; public static final int SIDEBAR_HELP = 13; public static final int SIDEBAR_ABOUT = 14; - - + public static AccountHeaderBuilder CreateDefaultAccountHeader(final Activity activity) { return new AccountHeaderBuilder() .withActivity(activity) @@ -73,6 +74,7 @@ public class MainDrawerBuilder { new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_skills)).withIdentifier(SIDEBAR_SKILLS), new SectionIconDrawerItem().withName(activity.getString(R.string.sidebar_section_social).toUpperCase()), + new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_inbox)).withIdentifier(SIDEBAR_INBOX), new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_tavern)).withIdentifier(SIDEBAR_TAVERN), new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_party)).withIdentifier(SIDEBAR_PARTY), new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_guilds)).withIdentifier(SIDEBAR_GUILDS), @@ -106,6 +108,10 @@ public class MainDrawerBuilder { fragment = new SkillsFragment(); break; } + case SIDEBAR_INBOX: { + fragment = new InboxFragment(); + break; + } case SIDEBAR_PARTY: { fragment = new PartyFragment(); break; diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java index 2cde7fef6..42014f3cf 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java @@ -43,6 +43,12 @@ public class HabitRPGUser extends BaseModel { foreignColumnName = "id")}) private Stats stats; + @Column + @ForeignKey(references = {@ForeignKeyReference(columnName = "inbox_id", + columnType = String.class, + foreignColumnName = "user_Id")}) + private Inbox inbox; + @Column @ForeignKey(references = {@ForeignKeyReference(columnName = "preferences_id", columnType = String.class, @@ -104,10 +110,19 @@ public class HabitRPGUser extends BaseModel { return stats; } + public void setInbox(Inbox inbox) { + this.inbox = inbox; + } + + public Inbox getInbox() { + return inbox; + } + public void setStats(Stats stats) { this.stats = stats; } + public Profile getProfile() { return profile; } @@ -258,6 +273,7 @@ public class HabitRPGUser extends BaseModel { preferences.user_id = id; stats.id = id; profile.user_Id = id; + inbox.user_Id = id; items.user_id = id; authentication.user_id = id; flags.user_id = id; diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Inbox.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Inbox.java new file mode 100644 index 000000000..59064507f --- /dev/null +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/Inbox.java @@ -0,0 +1,115 @@ +package com.magicmicky.habitrpgwrapper.lib.models; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; +import com.habitrpg.android.habitica.HabitDatabase; +import com.raizlabs.android.dbflow.annotation.Column; +import com.raizlabs.android.dbflow.annotation.NotNull; +import com.raizlabs.android.dbflow.annotation.PrimaryKey; +import com.raizlabs.android.dbflow.annotation.Table; +import com.raizlabs.android.dbflow.structure.BaseModel; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Created by keithholliday on 6/20/16. + */ +@Table(databaseName = HabitDatabase.NAME) +public class Inbox extends BaseModel { + + @Column + @PrimaryKey +// @NotNull + String user_Id; + + @SerializedName("optOut") + @Expose + private Boolean optOut; + + @SerializedName("messages") + @Expose + private Map messages; + + @SerializedName("blocks") + @Expose + private List blocks = new ArrayList(); + + @SerializedName("newMessages") + @Expose + private Integer newMessages; + + /** + * + * @return + * The optOut + */ + public Boolean getOptOut() { + return optOut; + } + + /** + * + * @param optOut + * The optOut + */ + public void setOptOut(Boolean optOut) { + this.optOut = optOut; + } + + /** + * + * @return + * The messages + */ + public Map getMessages() { + return messages; + } + + /** + * + * @param messages + * The messages + */ + public void setMessages(Map messages) { + this.messages = messages; + } + + /** + * + * @return + * The blocks + */ + public List getBlocks() { + return blocks; + } + + /** + * + * @param blocks + * The blocks + */ + public void setBlocks(List blocks) { + this.blocks = blocks; + } + + /** + * + * @return + * The newMessages + */ + public Integer getNewMessages() { + return newMessages; + } + + /** + * + * @param newMessages + * The newMessages + */ + public void setNewMessages(Integer newMessages) { + this.newMessages = newMessages; + } + +} \ No newline at end of file From 2baf90b9ef3d87c269b9535b8608036340ce2d44 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Wed, 22 Jun 2016 12:49:23 -0500 Subject: [PATCH 2/6] Fixed chat display --- Habitica/res/layout/fragment_inbox.xml | 3 ++- .../habitica/ui/adapter/social/ChatRecyclerViewAdapter.java | 5 +++++ .../android/habitica/ui/fragments/social/InboxFragment.java | 1 - 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Habitica/res/layout/fragment_inbox.xml b/Habitica/res/layout/fragment_inbox.xml index 9108559c6..f6d2b1bd3 100644 --- a/Habitica/res/layout/fragment_inbox.xml +++ b/Habitica/res/layout/fragment_inbox.xml @@ -25,11 +25,12 @@ diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java index cf5b655df..4e5b33d4c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java @@ -26,6 +26,7 @@ import android.support.v4.content.ContextCompat; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.text.method.LinkMovementMethod; +import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -238,10 +239,14 @@ public class ChatRecyclerViewAdapter extends RecyclerView.Adapter Date: Thu, 23 Jun 2016 13:32:43 -0500 Subject: [PATCH 3/6] Added sending chat. Fixed sorting of messages --- .../commands/SendNewInboxMessageCommand.java | 14 +++++ .../social/ChatRecyclerViewAdapter.java | 14 ++++- .../ui/fragments/social/InboxFragment.java | 10 ++-- .../social/InboxMessageListFragment.java | 51 ++++++++++++++++--- .../habitrpgwrapper/lib/api/ApiService.java | 3 ++ 5 files changed, 80 insertions(+), 12 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/SendNewInboxMessageCommand.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/SendNewInboxMessageCommand.java b/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/SendNewInboxMessageCommand.java new file mode 100644 index 000000000..2073c3e87 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/SendNewInboxMessageCommand.java @@ -0,0 +1,14 @@ +package com.habitrpg.android.habitica.events.commands; + +/** + * Created by keithholliday on 6/22/16. + */ +public class SendNewInboxMessageCommand { + public String Message; + public String UserToSendTo; + + public SendNewInboxMessageCommand(String userToSendTo, String message) { + UserToSendTo = userToSendTo; + Message = message; + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java index 4e5b33d4c..e699a10e8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java @@ -7,6 +7,7 @@ import com.habitrpg.android.habitica.events.commands.DeleteChatMessageCommand; import com.habitrpg.android.habitica.events.commands.FlagChatMessageCommand; import com.habitrpg.android.habitica.events.commands.OpenNewPMActivityCommand; import com.habitrpg.android.habitica.events.commands.SendNewGroupMessageCommand; +import com.habitrpg.android.habitica.events.commands.SendNewInboxMessageCommand; import com.habitrpg.android.habitica.events.commands.ToggleInnCommand; import com.habitrpg.android.habitica.events.commands.ToggleLikeMessageCommand; import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils; @@ -52,6 +53,8 @@ public class ChatRecyclerViewAdapter extends RecyclerView.Adapter messages, String uuid, String groupId, boolean isTavern) { this.messages = messages; @@ -60,6 +63,11 @@ public class ChatRecyclerViewAdapter extends RecyclerView.Adapter messages) { this.messages = messages; this.notifyDataSetChanged(); @@ -381,7 +389,11 @@ public class ChatRecyclerViewAdapter extends RecyclerView.Adapter messages; + Map roomsAdded; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -77,15 +78,15 @@ public class InboxFragment extends BaseMainFragment LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - Map roomsAdded = new HashMap(); + roomsAdded = new HashMap(); Iterator it = this.messages.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry)it.next(); ChatMessage message = (ChatMessage) pair.getValue(); - if (roomsAdded.get(message.user) != null && roomsAdded.get(message.user)) return; - roomsAdded.put(message.user, true); + if (roomsAdded.get(message.user) != null) continue; + roomsAdded.put(message.user, message.uuid); TextView entry = (TextView) inflater.inflate(R.layout.plain_list_item, this.inboxMessagesListView, false); entry.setText(message.user); @@ -99,7 +100,8 @@ public class InboxFragment extends BaseMainFragment public void onClick(View v) { TextView entry = (TextView) v; InboxMessageListFragment inboxMessageListFragment = new InboxMessageListFragment(); - inboxMessageListFragment.setMessages(this.messages, entry.getText().toString()); + String replyToUserName = entry.getText().toString(); + inboxMessageListFragment.setMessages(this.messages, replyToUserName, this.roomsAdded.get(replyToUserName)); this.activity.displayFragment(inboxMessageListFragment); } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java index c2549d8c7..678b64102 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java @@ -12,15 +12,23 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.google.common.collect.Lists; +import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; import com.habitrpg.android.habitica.components.AppComponent; +import com.habitrpg.android.habitica.events.commands.SendNewInboxMessageCommand; import com.habitrpg.android.habitica.ui.adapter.social.ChatRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; +import com.habitrpg.android.habitica.ui.helpers.UiUtils; import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import org.greenrobot.eventbus.Subscribe; + +import java.sql.Date; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -43,6 +51,7 @@ public class InboxMessageListFragment extends BaseMainFragment List messages; ChatRecyclerViewAdapter chatAdapter; String chatRoomUser; + String replyToUserUUID; public InboxMessageListFragment() { messages = new ArrayList(); @@ -61,6 +70,7 @@ public class InboxMessageListFragment extends BaseMainFragment chatRecyclerView.setLayoutManager(layoutManager); chatAdapter = new ChatRecyclerViewAdapter(messages, null, null, false); + chatAdapter.setToInboxChat(this.replyToUserUUID); chatRecyclerView.setAdapter(chatAdapter); return view; @@ -71,34 +81,61 @@ public class InboxMessageListFragment extends BaseMainFragment component.inject(this); } - @Override - public void onRefresh() { - swipeRefreshLayout.setRefreshing(true); + private void refreshUserInbox () { + this.swipeRefreshLayout.setRefreshing(true); this.apiHelper.retrieveUser(true) .compose(apiHelper.configureApiCallObserver()) .subscribe(new HabitRPGUserCallback(this), throwable -> {}); } - public void setMessages(Map messages, String chatRoomUser) { + @Override + public void onRefresh() { + this.refreshUserInbox(); + } + + public void setMessages(Map messages, String chatRoomUser, String replyToUserUUID) { this.chatRoomUser = chatRoomUser; + this.replyToUserUUID = replyToUserUUID; + + this.messages = new ArrayList(); Iterator it = messages.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry)it.next(); ChatMessage message = (ChatMessage) pair.getValue(); if (!message.user.equals(chatRoomUser)) continue; - this.messages.add(message); + this.messages.add(0, message); } + Collections.sort(this.messages, + (message1, message2) -> new Date(message2.timestamp).compareTo(new Date(message1.timestamp))); + if (this.chatAdapter != null) { - this.chatAdapter.notifyDataSetChanged(); + chatAdapter.setToInboxChat(replyToUserUUID); + this.chatAdapter.setMessages(this.messages); } } @Override public void onUserReceived(HabitRPGUser user) { this.user = user; - this.setMessages(user.getInbox().getMessages(), this.chatRoomUser); + this.setMessages(user.getInbox().getMessages(), this.chatRoomUser, this.replyToUserUUID); swipeRefreshLayout.setRefreshing(false); } + + @Subscribe + public void onEvent(SendNewInboxMessageCommand cmd) { + HashMap messageObject = new HashMap<>(); + messageObject.put("message", cmd.Message); + messageObject.put("toUserId", cmd.UserToSendTo); + + apiHelper.apiService.postPrivateMessage(messageObject) + .compose(apiHelper.configureApiCallObserver()) + .subscribe(postChatMessageResult -> { + this.refreshUserInbox(); + }, throwable -> { + }); + + UiUtils.dismissKeyboard(HabiticaApplication.currentActivity); + } } 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 f43334229..3be2f1bb0 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 @@ -213,6 +213,9 @@ public interface ApiService { @POST("/iap/android/verify") Call validatePurchase(@Body PurchaseValidationRequest request); + //Members URL + @POST("members/send-private-message") + Observable postPrivateMessage(@Body HashMap messageDetails); //DEBUG: These calls only work on a local development server From 70fec9fa457f1b0f3b0a42fa1db968a2e796cce1 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 24 Jun 2016 15:00:46 -0500 Subject: [PATCH 4/6] Removed extra code. Fixed Menu index --- Habitica/res/values/strings.xml | 3 --- .../ui/fragments/social/InboxMessageListFragment.java | 4 ---- .../habitrpg/android/habitica/ui/menu/MainDrawerBuilder.java | 4 ++-- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index b00802a48..be0b94dc2 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -347,7 +347,4 @@ To start, which parts of your life do you want to improve? Open in play store Are you sure you want to change your class? This will cost 3 gems. Message from %1$s - - - Hello blank fragment diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java index 678b64102..907d6deb6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.java @@ -4,14 +4,10 @@ import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.LinearLayout; -import android.widget.TextView; -import com.google.common.collect.Lists; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/MainDrawerBuilder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/MainDrawerBuilder.java index 2670f327b..13a1c823c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/MainDrawerBuilder.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/menu/MainDrawerBuilder.java @@ -33,7 +33,7 @@ public class MainDrawerBuilder { // Change the identificationIDs to the position IDs so that its easier to set the selected entry public static final int SIDEBAR_TASKS = 0; public static final int SIDEBAR_SKILLS = 1; - public static final int SIDEBAR_INBOX = 15; + public static final int SIDEBAR_INBOX = 2; public static final int SIDEBAR_TAVERN = 3; public static final int SIDEBAR_PARTY = 4; public static final int SIDEBAR_GUILDS = 5; @@ -46,7 +46,7 @@ public class MainDrawerBuilder { public static final int SIDEBAR_SETTINGS = 12; public static final int SIDEBAR_HELP = 13; public static final int SIDEBAR_ABOUT = 14; - + public static AccountHeaderBuilder CreateDefaultAccountHeader(final Activity activity) { return new AccountHeaderBuilder() .withActivity(activity) From eb21f188679bdcf4295b14cd11b1cec97632a789 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Wed, 6 Jul 2016 16:59:51 -0500 Subject: [PATCH 5/6] Added contributor info to user model. Added distinction when user sent message in inbox --- .../android/habitica/HabitDatabase.java | 2 +- .../social/ChatRecyclerViewAdapter.java | 18 ++- .../social/InboxMessageListFragment.java | 1 + .../lib/models/ChatMessage.java | 23 +--- .../lib/models/ContributorInfo.java | 105 ++++++++++++++++++ .../lib/models/HabitRPGUser.java | 16 +++ .../lib/utils/ChatMessageDeserializer.java | 8 ++ 7 files changed, 151 insertions(+), 22 deletions(-) create mode 100644 Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ContributorInfo.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java b/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java index ac803aff5..c0c6af461 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/HabitDatabase.java @@ -7,5 +7,5 @@ public class HabitDatabase { public static final String NAME = "Habitica"; - public static final int VERSION = 22; + public static final int VERSION = 23; } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java index e699a10e8..8d82c4c01 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/ChatRecyclerViewAdapter.java @@ -14,6 +14,7 @@ import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils; import com.habitrpg.android.habitica.ui.helpers.EmojiKeyboard; import com.habitrpg.android.habitica.ui.helpers.ViewHelper; import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage; +import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import net.pherth.android.emoji_library.EmojiEditText; import net.pherth.android.emoji_library.EmojiTextView; @@ -55,6 +56,7 @@ public class ChatRecyclerViewAdapter extends RecyclerView.Adapter messages, String uuid, String groupId, boolean isTavern) { this.messages = messages; @@ -68,6 +70,10 @@ public class ChatRecyclerViewAdapter extends RecyclerView.Adapter messages) { this.messages = messages; this.notifyDataSetChanged(); @@ -238,14 +244,22 @@ public class ChatRecyclerViewAdapter extends RecyclerView.Adapter CONTRIBUTOR_COLOR_DICT; - - static { - CONTRIBUTOR_COLOR_DICT = new HashMap<>(); - CONTRIBUTOR_COLOR_DICT.put(0, R.color.contributor_0); - CONTRIBUTOR_COLOR_DICT.put(1, R.color.contributor_1); - CONTRIBUTOR_COLOR_DICT.put(2, R.color.contributor_2); - CONTRIBUTOR_COLOR_DICT.put(3, R.color.contributor_3); - CONTRIBUTOR_COLOR_DICT.put(4, R.color.contributor_4); - CONTRIBUTOR_COLOR_DICT.put(5, R.color.contributor_5); - CONTRIBUTOR_COLOR_DICT.put(6, R.color.contributor_6); - CONTRIBUTOR_COLOR_DICT.put(7, R.color.contributor_7); - CONTRIBUTOR_COLOR_DICT.put(8, R.color.contributor_mod); - CONTRIBUTOR_COLOR_DICT.put(9, R.color.contributor_staff); - } - - public String id; public String text; @@ -50,13 +33,15 @@ public class ChatMessage { public String user; + public String sent; + public int getContributorColor() { int rColor = android.R.color.black; if (contributor != null) { - if (CONTRIBUTOR_COLOR_DICT.containsKey(contributor.level)) { - rColor = CONTRIBUTOR_COLOR_DICT.get(contributor.level); + if (ContributorInfo.CONTRIBUTOR_COLOR_DICT.containsKey(contributor.level)) { + rColor = ContributorInfo.CONTRIBUTOR_COLOR_DICT.get(contributor.level); } } diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ContributorInfo.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ContributorInfo.java new file mode 100644 index 000000000..27c5a4c01 --- /dev/null +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/ContributorInfo.java @@ -0,0 +1,105 @@ +package com.magicmicky.habitrpgwrapper.lib.models; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; +import com.habitrpg.android.habitica.HabitDatabase; +import com.habitrpg.android.habitica.R; +import com.raizlabs.android.dbflow.annotation.Column; +import com.raizlabs.android.dbflow.annotation.NotNull; +import com.raizlabs.android.dbflow.annotation.PrimaryKey; +import com.raizlabs.android.dbflow.annotation.Table; +import com.raizlabs.android.dbflow.structure.BaseModel; + +import java.util.HashMap; + +/** + * Created by keithholliday on 7/6/16. + */ +@Table(databaseName = HabitDatabase.NAME) +public class ContributorInfo extends BaseModel { + + public static final HashMap CONTRIBUTOR_COLOR_DICT; + + static { + CONTRIBUTOR_COLOR_DICT = new HashMap<>(); + CONTRIBUTOR_COLOR_DICT.put(0, R.color.contributor_0); + CONTRIBUTOR_COLOR_DICT.put(1, R.color.contributor_1); + CONTRIBUTOR_COLOR_DICT.put(2, R.color.contributor_2); + CONTRIBUTOR_COLOR_DICT.put(3, R.color.contributor_3); + CONTRIBUTOR_COLOR_DICT.put(4, R.color.contributor_4); + CONTRIBUTOR_COLOR_DICT.put(5, R.color.contributor_5); + CONTRIBUTOR_COLOR_DICT.put(6, R.color.contributor_6); + CONTRIBUTOR_COLOR_DICT.put(7, R.color.contributor_7); + CONTRIBUTOR_COLOR_DICT.put(8, R.color.contributor_mod); + CONTRIBUTOR_COLOR_DICT.put(9, R.color.contributor_staff); + } + + @Column + @PrimaryKey + @NotNull + public String user_id; + + @SerializedName("admin") + @Expose + private boolean admin; + + @SerializedName("contributions") + @Expose + private String contributions; + + @SerializedName("level") + @Expose + private int level; + + @SerializedName("text") + @Expose + private String text; + + public void setAdmin(Boolean admin) { + this.admin = admin; + } + + public Boolean getAdmin() { + return this.admin; + } + + public void setContributions(String contributions) { + this.contributions = contributions; + } + + public String getContributions() { + return this.contributions; + } + + public void setLevel(int level) { + this.level = level; + } + + public int getLevel() { + return this.level; + } + + public void setText(String text) { + this.text = text; + } + + public String getText() { + return this.text; + } + + public int getContributorColor() { + int rColor = android.R.color.black; + + + if (CONTRIBUTOR_COLOR_DICT.containsKey(this.level)) { + rColor = CONTRIBUTOR_COLOR_DICT.get(this.level); + } + + return rColor; + } + + public int getContributorForegroundColor() { + int rColor = android.R.color.white; + return rColor; + } +} diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java index 42014f3cf..27851422c 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java @@ -86,6 +86,12 @@ public class HabitRPGUser extends BaseModel { foreignColumnName = "user_id")}) private Flags flags; + @Column + @ForeignKey(references = {@ForeignKeyReference(columnName = "contributor_id", + columnType = String.class, + foreignColumnName = "user_id")}) + private ContributorInfo contributor; + private Purchases purchased; private TasksOrder tasksOrder; @@ -131,6 +137,15 @@ public class HabitRPGUser extends BaseModel { this.profile = profile; } + public ContributorInfo getContributor() { + return contributor; + } + + public void setContributor(ContributorInfo contributor) { + this.contributor = contributor; + } + + public UserParty getParty() { return party; } @@ -277,6 +292,7 @@ public class HabitRPGUser extends BaseModel { items.user_id = id; authentication.user_id = id; flags.user_id = id; + contributor.user_id = id; ArrayList allTasks = new ArrayList(); if (dailys != null) { diff --git a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/ChatMessageDeserializer.java b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/ChatMessageDeserializer.java index 0e5193c3e..d6a4a3dbc 100644 --- a/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/ChatMessageDeserializer.java +++ b/Habitica/src/main/java/com/magicmicky/habitrpgwrapper/lib/utils/ChatMessageDeserializer.java @@ -35,9 +35,11 @@ public class ChatMessageDeserializer implements JsonDeserializer { if (obj.has("flagCount")) { message.flagCount = obj.get("flagCount").getAsInt(); } + if (obj.has("uuid")) { message.uuid = obj.get("uuid").getAsString(); } + if (obj.has("contributor")) { if (!obj.get("contributor").isJsonNull()) { if (obj.get("contributor").isJsonObject()) { @@ -49,13 +51,19 @@ public class ChatMessageDeserializer implements JsonDeserializer { } } } + if (obj.has("backer")) { message.backer = context.deserialize(obj.get("backer"), Backer.class); } + if (obj.has("user")) { message.user = obj.get("user").getAsString(); } + if (obj.has("sent")) { + message.sent = obj.get("sent").getAsString(); + } + return message; } } From b13f1d3a29e136ebdbbfdc101113577a66a8c015 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Thu, 7 Jul 2016 18:49:57 -0500 Subject: [PATCH 6/6] Added notification badge for unread inbox messages. Added marked pms read --- .../habitica/ui/activities/MainActivity.java | 32 +++++++++++++++++++ .../ui/fragments/social/InboxFragment.java | 4 +++ .../habitrpgwrapper/lib/api/ApiService.java | 3 ++ 3 files changed, 39 insertions(+) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java index 1dd82dd2b..245b30ad1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.java @@ -63,9 +63,12 @@ import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag; import com.mikepenz.materialdrawer.AccountHeader; import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.DrawerBuilder; +import com.mikepenz.materialdrawer.holder.BadgeStyle; +import com.mikepenz.materialdrawer.holder.StringHolder; import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; import com.mikepenz.materialdrawer.model.interfaces.IProfile; +import com.mikepenz.materialdrawer.model.utils.BadgeDrawableBuilder; import com.raizlabs.android.dbflow.runtime.TransactionManager; import com.raizlabs.android.dbflow.runtime.transaction.BaseTransaction; import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; @@ -97,6 +100,7 @@ import android.database.sqlite.SQLiteDoneException; import android.databinding.DataBindingUtil; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; @@ -346,6 +350,9 @@ public class MainActivity extends BaseActivity implements Action1, Ha displayDeathDialogIfNeeded(); if (!fromLocalDb) { + + displayNewInboxMessagesBadge(); + // Update the oldEntries new Thread(() -> { @@ -441,6 +448,31 @@ public class MainActivity extends BaseActivity implements Action1, Ha } } + private void displayNewInboxMessagesBadge() { + Integer numberOfUnreadPms = this.user.getInbox().getNewMessages(); + IDrawerItem newInboxItem; + + if (numberOfUnreadPms <= 0) { + newInboxItem = new PrimaryDrawerItem() + .withName(this.getString(R.string.sidebar_inbox)) + .withIdentifier(MainDrawerBuilder.SIDEBAR_INBOX); + } else { + String numberOfUnreadPmsLabel = String.valueOf(numberOfUnreadPms); + BadgeStyle badgeStyle = new BadgeStyle() + .withTextColor(Color.WHITE) + .withColorRes(R.color.md_red_700); + + newInboxItem = new PrimaryDrawerItem() + .withName(this.getString(R.string.sidebar_inbox)) + .withIdentifier(MainDrawerBuilder.SIDEBAR_INBOX) + .withBadge(numberOfUnreadPmsLabel) + .withBadgeStyle(badgeStyle); + } + + this.drawer.updateItemAtPosition(newInboxItem, MainDrawerBuilder.SIDEBAR_INBOX + 2); + } + + private void loadAndRemoveOldChecklists(final List onlineEntries) { final ArrayList onlineChecklistItemIdList = new ArrayList<>(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java index f331e0a8d..c0d037858 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxFragment.java @@ -43,6 +43,10 @@ public class InboxFragment extends BaseMainFragment Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); + this.apiHelper.apiService.markPrivateMessagesRead() + .compose(apiHelper.configureApiCallObserver()) + .subscribe(aVoid -> {}, throwable -> {}); + View v = inflater.inflate(R.layout.fragment_inbox, container, false); unbinder = ButterKnife.bind(this, v); 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 3be2f1bb0..672c7c64c 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 @@ -144,6 +144,9 @@ public interface ApiService { @POST("user/disable-classes") Observable disableClasses(); + @POST("user/mark-pms-read") + Observable markPrivateMessagesRead(); + /* Group API */ @GET("groups")