show challenge tasks

This commit is contained in:
Negue 2016-11-30 19:57:12 +01:00
parent 7958a08efc
commit 6ca2b0e6e4
12 changed files with 440 additions and 12 deletions

View file

@ -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">
<LinearLayout

View file

@ -43,8 +43,10 @@ import com.habitrpg.android.habitica.ui.fragments.setup.IntroFragment;
import com.habitrpg.android.habitica.ui.fragments.setup.TaskSetupFragment;
import com.habitrpg.android.habitica.ui.fragments.skills.SkillTasksRecyclerViewFragment;
import com.habitrpg.android.habitica.ui.fragments.skills.SkillsFragment;
import com.habitrpg.android.habitica.ui.fragments.social.ChallengeListFragment;
import com.habitrpg.android.habitica.ui.fragments.social.ChallengesOverviewFragment;
import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeListFragment;
import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeTaskRecyclerViewFragment;
import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengeTasksFragment;
import com.habitrpg.android.habitica.ui.fragments.social.challenges.ChallengesOverviewFragment;
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;
@ -190,4 +192,8 @@ public interface AppComponent {
void inject(ChallengesOverviewFragment challengesOverviewFragment);
void inject(ChallengeListFragment challengeListFragment);
void inject(ChallengeTasksFragment challengeTasksFragment);
void inject(ChallengeTaskRecyclerViewFragment challengeTaskRecyclerViewFragment);
}

View file

@ -0,0 +1,9 @@
package com.habitrpg.android.habitica.events.commands;
public class ShowChallengeTasksCommand {
public String challengeId;
public ShowChallengeTasksCommand(String challengeId){
this.challengeId = challengeId;
}
}

View file

@ -8,9 +8,12 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.events.commands.ShowChallengeTasksCommand;
import com.magicmicky.habitrpgwrapper.lib.models.Challenge;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import org.greenrobot.eventbus.EventBus;
import java.util.ArrayList;
import java.util.List;
@ -48,7 +51,7 @@ public class ChallengesListViewAdapter extends RecyclerView.Adapter<ChallengesLi
return challenges.size();
}
public class ChallengeViewHolder extends RecyclerView.ViewHolder {
public class ChallengeViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@BindView(R.id.challenge_name)
TextView challengeName;
@ -64,13 +67,19 @@ public class ChallengesListViewAdapter extends RecyclerView.Adapter<ChallengesLi
@BindView(R.id.gemPrizeTextView)
TextView gemPrizeTextView;
private Challenge challenge;
public ChallengeViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
itemView.setOnClickListener(this);
}
public void bind(Challenge challenge) {
this.challenge = challenge;
challengeName.setText(challenge.name);
leaderName.setText(getContext().getString(R.string.by) + " " + getLeaderName(challenge.leader));
@ -92,5 +101,12 @@ public class ChallengesListViewAdapter extends RecyclerView.Adapter<ChallengesLi
return "";
}
}
@Override
public void onClick(View view) {
if (challenge != null) {
EventBus.getDefault().post(new ShowChallengeTasksCommand(challenge.id));
}
}
}
}

View file

@ -52,8 +52,10 @@ public abstract class BaseTasksRecyclerViewAdapter<VH extends BaseTaskViewHolder
this.userID = userID;
this.filteredContent = new ArrayList<>();
this.loadContent(true);
if(loadFromDatabase()) {
this.loadContent(true);
}
this.layoutResource = layoutResource;
}
@ -162,7 +164,7 @@ public abstract class BaseTasksRecyclerViewAdapter<VH extends BaseTaskViewHolder
}
private void filter() {
if (this.tagsHelper.howMany() == 0) {
if (this.tagsHelper == null || this.tagsHelper.howMany() == 0) {
filteredContent = content;
} else {
filteredContent = new ObservableArrayList<>();
@ -210,4 +212,7 @@ public abstract class BaseTasksRecyclerViewAdapter<VH extends BaseTaskViewHolder
filter();
}
public boolean loadFromDatabase(){
return true;
}
}

View file

@ -1,4 +1,4 @@
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.widget.SwipeRefreshLayout;

View file

@ -0,0 +1,237 @@
package com.habitrpg.android.habitica.ui.fragments.social.challenges;
import android.content.Context;
import android.databinding.ObservableList;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.habitrpg.android.habitica.APIHelper;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.components.AppComponent;
import com.habitrpg.android.habitica.helpers.TagsHelper;
import com.habitrpg.android.habitica.ui.adapter.tasks.BaseTasksRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.adapter.tasks.SortableTasksRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
import com.habitrpg.android.habitica.ui.menu.DividerItemDecoration;
import com.habitrpg.android.habitica.ui.viewHolders.tasks.DailyViewHolder;
import com.habitrpg.android.habitica.ui.viewHolders.tasks.HabitViewHolder;
import com.habitrpg.android.habitica.ui.viewHolders.tasks.RewardViewHolder;
import com.habitrpg.android.habitica.ui.viewHolders.tasks.TodoViewHolder;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
import javax.inject.Inject;
import javax.inject.Named;
public class ChallengeTaskRecyclerViewFragment extends BaseFragment {
public RecyclerView recyclerView;
public BaseTasksRecyclerViewAdapter recyclerAdapter;
@Inject
@Named("UserID")
String userID;
@Inject
APIHelper apiHelper;
LinearLayoutManager layoutManager = null;
private String classType;
private HabitRPGUser user;
private View view;
public static ChallengeTaskRecyclerViewFragment newInstance(HabitRPGUser user, String classType, ObservableList<Task> 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<ObservableList<Task>>() {
@Override
public void onChanged(ObservableList<Task> tasks) {
}
@Override
public void onItemRangeChanged(ObservableList<Task> tasks, int i, int i1) {
}
@Override
public void onItemRangeInserted(ObservableList<Task> tasks, int i, int i1) {
fragment.recyclerAdapter.setTasks(tasks);
}
@Override
public void onItemRangeMoved(ObservableList<Task> tasks, int i, int i1, int i2) {
}
@Override
public void onItemRangeRemoved(ObservableList<Task> 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<HabitViewHolder> {
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<DailyViewHolder> {
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<TodoViewHolder> {
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<RewardViewHolder> {
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
}

View file

@ -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<Task> observableTodoList = new ObservableArrayList<>();
ObservableList<Task> observableDailyList = new ObservableArrayList<>();
ObservableList<Task> observableHabitList = new ObservableArrayList<>();
ObservableList<Task> 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<Task> todos = new ArrayList<>();
ArrayList<Task> habits = new ArrayList<>();
ArrayList<Task> dailies = new ArrayList<>();
ArrayList<Task> rewards = new ArrayList<>();
for (Map.Entry<String, Task> 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 -> {
});
}
}

View file

@ -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);
}
}

View file

@ -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;

View file

@ -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);

View file

@ -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<ArrayList<Challenge>> getUserChallenges();
@GET("tasks/challenge/{challengeId}")
Observable<TaskList> getChallengeTasks(@Path("challengeId") String challengeId);
//DEBUG: These calls only work on a local development server
@POST("debug/add-ten-gems")