From 6ca2b0e6e498fbcdd761fe95696fd8df3ecf4198 Mon Sep 17 00:00:00 2001 From: Negue Date: Wed, 30 Nov 2016 19:57:12 +0100 Subject: [PATCH] show challenge tasks --- Habitica/res/layout/challenge_item.xml | 1 + .../habitica/components/AppComponent.java | 10 +- .../commands/ShowChallengeTasksCommand.java | 9 + .../social/ChallengesListViewAdapter.java | 18 +- .../tasks/BaseTasksRecyclerViewAdapter.java | 11 +- .../ChallengeListFragment.java | 2 +- .../ChallengeTaskRecyclerViewFragment.java | 237 ++++++++++++++++++ .../challenges/ChallengeTasksFragment.java | 140 +++++++++++ .../ChallengesOverviewFragment.java | 15 +- .../habitica/ui/menu/MainDrawerBuilder.java | 3 +- .../viewHolders/tasks/BaseTaskViewHolder.java | 1 + .../habitrpgwrapper/lib/api/ApiService.java | 5 + 12 files changed, 440 insertions(+), 12 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/events/commands/ShowChallengeTasksCommand.java rename Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/{ => challenges}/ChallengeListFragment.java (98%) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTaskRecyclerViewFragment.java create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksFragment.java rename Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/{ => challenges}/ChallengesOverviewFragment.java (85%) diff --git a/Habitica/res/layout/challenge_item.xml b/Habitica/res/layout/challenge_item.xml index a87b11969..ef58ef30b 100644 --- a/Habitica/res/layout/challenge_item.xml +++ b/Habitica/res/layout/challenge_item.xml @@ -4,6 +4,7 @@ style="@style/CardView.Default" android:layout_width="match_parent" android:layout_height="wrap_content" + android:clickable="true" android:layout_margin="5dp"> (); - this.loadContent(true); - + if(loadFromDatabase()) { + this.loadContent(true); + } + this.layoutResource = layoutResource; } @@ -162,7 +164,7 @@ public abstract class BaseTasksRecyclerViewAdapter(); @@ -210,4 +212,7 @@ public abstract class BaseTasksRecyclerViewAdapter tasks) { + ChallengeTaskRecyclerViewFragment fragment = new ChallengeTaskRecyclerViewFragment(); + fragment.setRetainInstance(true); + fragment.user = user; + fragment.classType = classType; + + if(tasks.size() != 0){ + fragment.recyclerAdapter.setTasks(tasks); + } + + tasks.addOnListChangedCallback(new ObservableList.OnListChangedCallback>() { + @Override + public void onChanged(ObservableList tasks) { + } + + @Override + public void onItemRangeChanged(ObservableList tasks, int i, int i1) { + + } + + @Override + public void onItemRangeInserted(ObservableList tasks, int i, int i1) { + fragment.recyclerAdapter.setTasks(tasks); + } + + @Override + public void onItemRangeMoved(ObservableList tasks, int i, int i1, int i2) { + + } + + + @Override + public void onItemRangeRemoved(ObservableList tasks, int i, int i1) { + + } + }); + + return fragment; + } + + public void setInnerAdapter() { + int layoutOfType; + if (this.classType != null) { + switch (this.classType) { + case Task.TYPE_HABIT: + layoutOfType = R.layout.habit_item_card; + this.recyclerAdapter = new ChallengeHabitsRecyclerViewAdapter(Task.TYPE_HABIT, null, layoutOfType, getContext(), userID, null); + break; + case Task.TYPE_DAILY: + layoutOfType = R.layout.daily_item_card; + int dailyResetOffset = 0; + if (user != null) { + dailyResetOffset = user.getPreferences().getDayStart(); + } + this.recyclerAdapter = new ChallengeDailiesRecyclerViewHolder(Task.TYPE_DAILY, null, layoutOfType, getContext(), userID, dailyResetOffset, null); + break; + case Task.TYPE_TODO: + layoutOfType = R.layout.todo_item_card; + this.recyclerAdapter = new ChallengeTodosRecyclerViewAdapter(Task.TYPE_TODO, null, layoutOfType, getContext(), userID, null); + return; + case Task.TYPE_REWARD: + layoutOfType = R.layout.reward_item_card; + this.recyclerAdapter = new ChallengeRewardsRecyclerViewAdapter(Task.TYPE_REWARD, null, layoutOfType, getContext(), user); + break; + } + } + } + + + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + if (view == null) { + view = inflater.inflate(R.layout.fragment_recyclerview, container, false); + + recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); + + android.support.v4.app.FragmentActivity context = getActivity(); + + layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); + + if (layoutManager == null) { + layoutManager = new LinearLayoutManager(context); + + recyclerView.setLayoutManager(layoutManager); + } + if (recyclerView.getAdapter() == null) { + this.setInnerAdapter(); + } + recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); + } + + return view; + } + + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + recyclerView.setAdapter(recyclerAdapter); + } + + @Override + public String getDisplayedClassName() { + return this.classType + super.getDisplayedClassName(); + } + + String getClassName() { + return classType; + } + + // region Challenge specific RecyclerViewAdapters + + private class ChallengeHabitsRecyclerViewAdapter extends SortableTasksRecyclerViewAdapter { + + + public ChallengeHabitsRecyclerViewAdapter(String taskType, TagsHelper tagsHelper, int layoutResource, Context newContext, String userID, SortTasksCallback sortCallback) { + super(taskType, tagsHelper, layoutResource, newContext, userID, sortCallback); + } + + @Override + public boolean loadFromDatabase() { + return false; + } + + @Override + public HabitViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new HabitViewHolder(getContentView(parent)); + } + } + + public class ChallengeDailiesRecyclerViewHolder extends SortableTasksRecyclerViewAdapter { + + public int dailyResetOffset; + + public ChallengeDailiesRecyclerViewHolder(String taskType, TagsHelper tagsHelper, int layoutResource, + Context newContext, String userID, int dailyResetOffset, + SortTasksCallback sortTasksCallback) { + super(taskType, tagsHelper, layoutResource, newContext, userID, sortTasksCallback); + this.dailyResetOffset = dailyResetOffset; + } + + @Override + public boolean loadFromDatabase() { + return false; + } + + @Override + public DailyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new DailyViewHolder(getContentView(parent), dailyResetOffset); + } + } + + public class ChallengeTodosRecyclerViewAdapter extends SortableTasksRecyclerViewAdapter { + + public ChallengeTodosRecyclerViewAdapter(String taskType, TagsHelper tagsHelper, int layoutResource, + Context newContext, String userID, SortTasksCallback sortCallback) { + super(taskType, tagsHelper, layoutResource, newContext, userID, sortCallback); + } + + @Override + public boolean loadFromDatabase() { + return false; + } + + @Override + public TodoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new TodoViewHolder(getContentView(parent)); + } + } + + public class ChallengeRewardsRecyclerViewAdapter extends BaseTasksRecyclerViewAdapter { + + public ChallengeRewardsRecyclerViewAdapter(String taskType, TagsHelper tagsHelper, int layoutResource, Context newContext, HabitRPGUser user) { + super(taskType, tagsHelper, layoutResource, newContext, user.getId()); + } + + @Override + public boolean loadFromDatabase() { + return false; + } + + @Override + public RewardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new RewardViewHolder(getContentView(parent)); + } + } + + // endregion +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksFragment.java new file mode 100644 index 000000000..243550fae --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeTasksFragment.java @@ -0,0 +1,140 @@ +package com.habitrpg.android.habitica.ui.fragments.social.challenges; + +import android.databinding.ObservableArrayList; +import android.databinding.ObservableList; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.components.AppComponent; +import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; + +import java.util.ArrayList; +import java.util.Map; + +public class ChallengeTasksFragment extends BaseMainFragment { + + public ViewPager viewPager; + private String challengeId; + + public void setChallengeId(String challengeId) { + this.challengeId = challengeId; + } + + @Override + public void injectFragment(AppComponent component) { + component.inject(this); + } + + ObservableList observableTodoList = new ObservableArrayList<>(); + ObservableList observableDailyList = new ObservableArrayList<>(); + ObservableList observableHabitList = new ObservableArrayList<>(); + ObservableList observableRewardList = new ObservableArrayList<>(); + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + this.usesTabLayout = true; + super.onCreateView(inflater, container, savedInstanceState); + View v = inflater.inflate(R.layout.fragment_viewpager, container, false); + + + viewPager = (ViewPager) v.findViewById(R.id.view_pager); + + loadTaskLists(); + return v; + } + + public void loadTaskLists() { + android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager(); + + viewPager.setAdapter(new FragmentPagerAdapter(fragmentManager) { + + @Override + public Fragment getItem(int position) { + ChallengeTaskRecyclerViewFragment fragment; + + switch (position) { + case 0: + fragment = ChallengeTaskRecyclerViewFragment.newInstance(user, Task.TYPE_HABIT, observableHabitList); + break; + case 1: + fragment = ChallengeTaskRecyclerViewFragment.newInstance(user, Task.TYPE_DAILY, observableDailyList); + break; + case 3: + fragment = ChallengeTaskRecyclerViewFragment.newInstance(user, Task.TYPE_REWARD, observableRewardList); + break; + default: + fragment = ChallengeTaskRecyclerViewFragment.newInstance(user, Task.TYPE_TODO, observableTodoList); + } + + return fragment; + } + + @Override + public int getCount() { + return 4; + } + + @Override + public CharSequence getPageTitle(int position) { + switch (position) { + case 0: + return activity.getString(R.string.habits); + case 1: + return activity.getString(R.string.dailies); + case 2: + return activity.getString(R.string.todos); + case 3: + return activity.getString(R.string.rewards); + } + return ""; + } + }); + + if (tabLayout != null) { + tabLayout.setupWithViewPager(viewPager); + } + + apiHelper.apiService.getChallengeTasks(challengeId) + .compose(this.apiHelper.configureApiCallObserver()) + .subscribe(taskList -> { + ArrayList todos = new ArrayList<>(); + ArrayList habits = new ArrayList<>(); + ArrayList dailies = new ArrayList<>(); + ArrayList rewards = new ArrayList<>(); + + for (Map.Entry entry : taskList.tasks.entrySet()) { + switch (entry.getValue().type) { + case Task.TYPE_TODO: + todos.add(entry.getValue()); + break; + case Task.TYPE_HABIT: + + habits.add(entry.getValue()); + break; + case Task.TYPE_DAILY: + + dailies.add(entry.getValue()); + break; + case Task.TYPE_REWARD: + + rewards.add(entry.getValue()); + break; + } + } + + observableTodoList.addAll(todos); + observableDailyList.addAll(dailies); + observableHabitList.addAll(habits); + observableRewardList.addAll(rewards); + }, throwable -> { + }); + } +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChallengesOverviewFragment.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.java similarity index 85% rename from Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChallengesOverviewFragment.java rename to Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.java index 627718ac7..8e08824b5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChallengesOverviewFragment.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.java @@ -1,18 +1,20 @@ -package com.habitrpg.android.habitica.ui.fragments.social; +package com.habitrpg.android.habitica.ui.fragments.social.challenges; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; -import android.support.v4.widget.SwipeRefreshLayout; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.components.AppComponent; +import com.habitrpg.android.habitica.events.commands.ShowChallengeTasksCommand; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; +import org.greenrobot.eventbus.Subscribe; + public class ChallengesOverviewFragment extends BaseMainFragment { public ViewPager viewPager; @@ -25,7 +27,6 @@ public class ChallengesOverviewFragment extends BaseMainFragment { View v = inflater.inflate(R.layout.fragment_viewpager, container, false); viewPager = (ViewPager) v.findViewById(R.id.view_pager); - viewPager.setCurrentItem(1); setViewPagerAdapter(); @@ -84,4 +85,12 @@ public class ChallengesOverviewFragment extends BaseMainFragment { tabLayout.setupWithViewPager(viewPager); } } + + @Subscribe + public void onEvent(ShowChallengeTasksCommand cmd){ + ChallengeTasksFragment fragment = new ChallengeTasksFragment(); + fragment.setChallengeId(cmd.challengeId); + + activity.displayFragment(fragment); + } } 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 ef3cb38b4..5982114c4 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 @@ -6,7 +6,6 @@ import com.habitrpg.android.habitica.ui.activities.GemPurchaseActivity; import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.habitrpg.android.habitica.ui.activities.PrefsActivity; import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment; -import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment; import com.habitrpg.android.habitica.ui.fragments.NewsFragment; import com.habitrpg.android.habitica.ui.fragments.faq.FAQOverviewFragment; import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarOverviewFragment; @@ -15,7 +14,7 @@ import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemsFragment; import com.habitrpg.android.habitica.ui.fragments.inventory.shops.ShopsFragment; 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.ChallengesOverviewFragment; +import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengesOverviewFragment; 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; diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.java index b1e4873b6..07f5c87df 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.java @@ -42,6 +42,7 @@ public class BaseTaskViewHolder extends RecyclerView.ViewHolder implements View. itemView.setOnClickListener(this); itemView.setClickable(true); + itemView.setEnabled(false); ButterKnife.bind(this, itemView); 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 554c312a7..b90a98064 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 @@ -1,5 +1,7 @@ package com.magicmicky.habitrpgwrapper.lib.api; +import android.databinding.ObservableList; + import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage; import com.magicmicky.habitrpgwrapper.lib.models.ContentResult; import com.magicmicky.habitrpgwrapper.lib.models.Group; @@ -262,6 +264,9 @@ public interface ApiService { @GET("challenges/user") Observable> getUserChallenges(); + @GET("tasks/challenge/{challengeId}") + Observable getChallengeTasks(@Path("challengeId") String challengeId); + //DEBUG: These calls only work on a local development server @POST("debug/add-ten-gems")