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