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