diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index da9a7e972..76d459508 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:parentActivityName=".MainActivity"> @@ -89,7 +89,7 @@ + android:parentActivityName=".MainActivity"> @@ -97,7 +97,7 @@ + android:parentActivityName=".MainActivity"> @@ -105,10 +105,10 @@ + android:parentActivityName=".MainActivity"> + android:value=".MainActivity" /> - \ No newline at end of file + + + + + + + + + + + + + + diff --git a/Habitica/res/layout/fragment_tavern.xml b/Habitica/res/layout/fragment_tavern.xml new file mode 100644 index 000000000..e56c0f23f --- /dev/null +++ b/Habitica/res/layout/fragment_tavern.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/Habitica/res/menu/menu_main_activity.xml b/Habitica/res/menu/menu_main_activity.xml index b4078ec39..0840f12fe 100644 --- a/Habitica/res/menu/menu_main_activity.xml +++ b/Habitica/res/menu/menu_main_activity.xml @@ -6,12 +6,13 @@ diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 64874f8ca..6c59afd79 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -173,4 +173,7 @@ You lost a Level, your Gold, and a piece of Equipment, but you can get them all back with hard work! Good luck--you\'ll do great. You ran out of Health! + + + Filter \ No newline at end of file diff --git a/Habitica/src/com/habitrpg/android/habitica/BaseFragment.java b/Habitica/src/com/habitrpg/android/habitica/BaseFragment.java index fd884a8d1..cb5f1bb17 100644 --- a/Habitica/src/com/habitrpg/android/habitica/BaseFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/BaseFragment.java @@ -5,27 +5,65 @@ import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import butterknife.ButterKnife; +import de.greenrobot.event.EventBus; + /** * Created by admin on 18/11/15. */ public abstract class BaseFragment extends Fragment { public MainActivity activity; + public TabLayout tabLayout; APIHelper mAPIHelper; protected HabitRPGUser user; + public boolean usesTabLayout; public void setUser(HabitRPGUser user) { this.user = user; } public void updateUserData(HabitRPGUser user) { this.user = user; } - public void setTabLayout(TabLayout tabLayout) {} + public void setTabLayout(TabLayout tabLayout) { + this.tabLayout = tabLayout; + } public void setActivity(MainActivity activity) {this.activity = activity; } @Override public void onAttach(Context context) { super.onAttach(context); this.activity = (MainActivity) getActivity(); } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + if (this.usesTabLayout) { + tabLayout.setVisibility(View.VISIBLE); + } else { + tabLayout.setVisibility(View.GONE); + } + + // Receive Events + EventBus.getDefault().register(this); + + setHasOptionsMenu(true); + + return null; + } + + @Override + public void onDestroy() { + EventBus.getDefault().unregister(this); + + super.onDestroy(); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + } } diff --git a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java index 62f239d6d..09d394a77 100644 --- a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java @@ -7,6 +7,7 @@ import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.TabLayout; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; +import android.view.Menu; import android.view.View; import android.widget.FrameLayout; import android.widget.TextView; @@ -135,6 +136,11 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU SetUserData(); } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + return true; + } + public void displayFragment(BaseFragment fragment) { fragment.setArguments(getIntent().getExtras()); fragment.mAPIHelper = mAPIHelper; diff --git a/Habitica/src/com/habitrpg/android/habitica/PartyFragment.java b/Habitica/src/com/habitrpg/android/habitica/PartyFragment.java index c7b1488ad..0dc22c109 100644 --- a/Habitica/src/com/habitrpg/android/habitica/PartyFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/PartyFragment.java @@ -31,7 +31,6 @@ import retrofit.client.Response; */ public class PartyFragment extends BaseFragment { - public TabLayout tabLayout; public ViewPager viewPager; private Group group; private HashMap fragmentDictionary = new HashMap<>(); @@ -42,7 +41,8 @@ public class PartyFragment extends BaseFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // Inflate the layout for this fragment + this.usesTabLayout = true; + super.onCreateView(inflater, container, savedInstanceState); View v = inflater.inflate(R.layout.fragment_party, container, false); viewPager = (ViewPager) v.findViewById(R.id.view_pager); @@ -88,12 +88,6 @@ public class PartyFragment extends BaseFragment { return v; } - @Override - public void setTabLayout(TabLayout tabLayout) { - this.tabLayout = tabLayout; - this.tabLayout.removeAllTabs(); - } - public void setViewPagerAdapter() { android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager(); diff --git a/Habitica/src/com/habitrpg/android/habitica/TaskActivity.java b/Habitica/src/com/habitrpg/android/habitica/TaskActivity.java index 5030d4631..58903ee60 100644 --- a/Habitica/src/com/habitrpg/android/habitica/TaskActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/TaskActivity.java @@ -681,7 +681,6 @@ public class TaskActivity extends AvatarActivityBase implements HabitRPGUserCall @Override public void onCheckedChanged(IDrawerItem iDrawerItem, CompoundButton compoundButton, boolean b) { Tag t = (Tag) iDrawerItem.getTag(); - Log.w("Tags", "onCheckedChanged" + compoundButton.isChecked() + " : " + b); if (t != null) { tagFilterMap.put(t.getId(), b); filterChangedHandler.hit(); diff --git a/Habitica/src/com/habitrpg/android/habitica/TasksFragment.java b/Habitica/src/com/habitrpg/android/habitica/TasksFragment.java index ab78fb537..d7b247303 100644 --- a/Habitica/src/com/habitrpg/android/habitica/TasksFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/TasksFragment.java @@ -1,30 +1,79 @@ package com.habitrpg.android.habitica; +import android.content.DialogInterface; +import android.content.Intent; +import android.databinding.DataBindingUtil; import android.os.Bundle; +import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; +import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.ImageView; +import android.widget.RadioGroup; +import android.widget.TextView; +import com.afollestad.materialdialogs.MaterialDialog; +import com.github.clans.fab.FloatingActionButton; +import com.github.clans.fab.FloatingActionMenu; +import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback; +import com.habitrpg.android.habitica.callbacks.TaskCreationCallback; +import com.habitrpg.android.habitica.callbacks.TaskScoringCallback; +import com.habitrpg.android.habitica.callbacks.TaskUpdateCallback; +import com.habitrpg.android.habitica.databinding.ValueBarBinding; +import com.habitrpg.android.habitica.events.HabitScoreEvent; +import com.habitrpg.android.habitica.events.TaskLongPressedEvent; +import com.habitrpg.android.habitica.events.TaskSaveEvent; +import com.habitrpg.android.habitica.events.TaskTappedEvent; +import com.habitrpg.android.habitica.events.ToggledInnStateEvent; +import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand; +import com.habitrpg.android.habitica.events.commands.BuyRewardCommand; +import com.habitrpg.android.habitica.events.commands.CreateTagCommand; +import com.habitrpg.android.habitica.events.commands.FilterTasksByTagsCommand; +import com.habitrpg.android.habitica.events.commands.TaskCheckedCommand; import com.habitrpg.android.habitica.helpers.TagsHelper; +import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel; +import com.habitrpg.android.habitica.ui.EditTextDrawer; import com.habitrpg.android.habitica.ui.adapter.HabitItemRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.adapter.IReceiveNewEntries; import com.habitrpg.android.habitica.ui.fragments.TaskRecyclerViewFragment; +import com.habitrpg.android.habitica.ui.helpers.Debounce; +import com.habitrpg.android.habitica.userpicture.UserPicture; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; +import com.magicmicky.habitrpgwrapper.lib.models.SuppressedModals; +import com.magicmicky.habitrpgwrapper.lib.models.Tag; +import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; +import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.TaskTag; import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.DrawerBuilder; +import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener; +import com.mikepenz.materialdrawer.model.SectionDrawerItem; +import com.mikepenz.materialdrawer.model.SwitchDrawerItem; +import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; +import com.raizlabs.android.dbflow.runtime.FlowContentObserver; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import butterknife.ButterKnife; +import butterknife.InjectView; +import butterknife.OnClick; +import de.greenrobot.event.EventBus; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; @@ -32,13 +81,22 @@ import retrofit.client.Response; /** * Created by admin on 18/11/15. */ -public class TasksFragment extends BaseFragment { +public class TasksFragment extends BaseFragment implements TaskScoringCallback.OnTaskScored, OnCheckedChangeListener { + + public enum SnackbarDisplayType { + NORMAL, FAILURE, DROP + } + + static final int TASK_CREATED_RESULT = 1; + static final int TASK_UPDATED_RESULT = 2; - public TabLayout tabLayout; public ViewPager viewPager; - Drawer filterDrawer; + private MaterialDialog faintDialog; + + FloatingActionMenu floatingMenu; + Map ViewFragmentsDictionary = new HashMap<>(); private TagsHelper tagsHelper; @@ -49,18 +107,44 @@ public class TasksFragment extends BaseFragment { contentCache = new ContentCache(mAPIHelper.apiService); } - @Override - public void setTabLayout(TabLayout tabLayout) { - this.tabLayout = tabLayout; - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // Inflate the layout for this fragment + this.usesTabLayout = true; + super.onCreateView(inflater, container, savedInstanceState); View v = inflater.inflate(R.layout.fragment_tasks, container, false); + viewPager = (ViewPager) v.findViewById(R.id.view_pager); + floatingMenu = (FloatingActionMenu)v.findViewById(R.id.fab_menu); + FloatingActionButton habit_fab = (FloatingActionButton) v.findViewById(R.id.fab_new_habit); + habit_fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + openNewTaskActivity("habit"); + } + }); + FloatingActionButton daily_fab = (FloatingActionButton) v.findViewById(R.id.fab_new_daily); + daily_fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + openNewTaskActivity("daily"); + } + }); + FloatingActionButton todo_fab = (FloatingActionButton) v.findViewById(R.id.fab_new_todo); + todo_fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + openNewTaskActivity("todo"); + } + }); + FloatingActionButton reward_fab = (FloatingActionButton) v.findViewById(R.id.fab_new_reward); + reward_fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + openNewTaskActivity("reward"); + } + }); filterDrawer = new DrawerBuilder() .withActivity(activity) @@ -76,6 +160,30 @@ public class TasksFragment extends BaseFragment { return v; } + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.menu_main_activity, menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + switch (id) { + case R.id.action_search: + filterDrawer.openDrawer(); + return true; + case R.id.action_reload: + mAPIHelper.retrieveUser(new HabitRPGUserCallback(activity)); + return true; + } + + return super.onOptionsItemSelected(item); + } + public void loadTaskLists() { android.support.v4.app.FragmentManager fragmentManager = getChildFragmentManager(); @@ -199,6 +307,7 @@ public class TasksFragment extends BaseFragment { public void updateUserData(HabitRPGUser user) { super.updateUserData(user); if (this.user != null) { + FillTagFilterDrawer(user.getTags()); TaskRecyclerViewFragment fragment = ViewFragmentsDictionary.get(2); if (fragment != null) { HabitItemRecyclerViewAdapter adapter =(HabitItemRecyclerViewAdapter)fragment.mAdapter; @@ -206,4 +315,352 @@ public class TasksFragment extends BaseFragment { } } } + + @Override + public void onTaskDataReceived(TaskDirectionData data) { + notifyUser(data.getExp(), data.getHp(), data.getGp(), data.getLvl(), data.getDelta()); + if (data.get_tmp() != null) { + if (data.get_tmp().getDrop() != null) { + showSnackbar(data.get_tmp().getDrop().getDialog(), SnackbarDisplayType.DROP); + } + } + } + + @Override + public void onTaskScoringFailed() { + + } + + + private void openNewTaskActivity(String type) { + Bundle bundle = new Bundle(); + bundle.putString("type", type); + bundle.putStringArrayList("tagsId", new ArrayList(this.tagsHelper.getTags())); + + Intent intent = new Intent(activity, TaskFormActivity.class); + intent.putExtras(bundle); + intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + + startActivityForResult(intent, TASK_CREATED_RESULT); + } + + // endregion + + private void showSnackbar(String content) { + showSnackbar(content, SnackbarDisplayType.NORMAL); + } + + private void showSnackbar(String content, SnackbarDisplayType displayType) { + Snackbar snackbar = Snackbar.make(floatingMenu, content, Snackbar.LENGTH_LONG); + View snackbarView = snackbar.getView(); + + if (displayType == SnackbarDisplayType.FAILURE) { + + //change Snackbar's background color; + snackbarView.setBackgroundColor(ContextCompat.getColor(activity, R.color.worse_10)); + } else if (displayType == SnackbarDisplayType.DROP) { + TextView tv = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text); + tv.setMaxLines(5); + snackbarView.setBackgroundColor(ContextCompat.getColor(activity, R.color.best_10)); + } + snackbar.show(); + } + + //region Events + + public void onEvent(CreateTagCommand event) { + Tag t = new Tag(); + t.setName(event.tagName); + t.save(); + + mAPIHelper.apiService.createTag(t, new Callback>() { + @Override + public void success(List tags, Response response) { + FillTagFilterDrawer(tags); + } + + @Override + public void failure(RetrofitError error) { + showSnackbar("Error: " + error.getMessage(), SnackbarDisplayType.FAILURE); + } + }); + } + + public void onEvent(TaskTappedEvent event) { + if (event.Task.type.equals("reward")) + return; + + Bundle bundle = new Bundle(); + bundle.putString("type", event.Task.getType()); + bundle.putString("taskId", event.Task.getId()); + bundle.putStringArrayList("tagsId", new ArrayList(this.tagsHelper.getTags())); + Intent intent = new Intent(activity, TaskFormActivity.class); + intent.putExtras(bundle); + startActivityForResult(intent, TASK_UPDATED_RESULT); + } + + public void onEvent(TaskLongPressedEvent event) { + } + + public void onEvent(TaskCheckedCommand event) { + mAPIHelper.updateTaskDirection(event.Task.getId(), event.Task.getCompleted() ? TaskDirection.down : TaskDirection.up, new TaskScoringCallback(this, event.Task.getId())); + } + + public void onEvent(HabitScoreEvent event) { + mAPIHelper.updateTaskDirection(event.Habit.getId(), event.Up ? TaskDirection.up : TaskDirection.down, new TaskScoringCallback(this, event.Habit.getId())); + } + + public void onEvent(AddNewTaskCommand event) { + openNewTaskActivity(event.ClassType.toLowerCase()); + } + + public void onEvent(final BuyRewardCommand event) { + final String rewardKey = event.Reward.getId(); + + if (user.getStats().getGp() < event.Reward.getValue()) { + showSnackbar("Not enough Gold", SnackbarDisplayType.FAILURE); + return; + } + + if (event.Reward.specialTag == "item") { + if (rewardKey.equals("potion")) { + int currentHp = user.getStats().getHp().intValue(); + int maxHp = user.getStats().getMaxHealth(); + + if(currentHp == maxHp) { + showSnackbar("You don't need to buy an health potion", SnackbarDisplayType.FAILURE); + return; + } + } + + mAPIHelper.apiService.buyItem(event.Reward.getId(), new Callback() { + + @Override + public void success(Void aVoid, Response response) { + switch (rewardKey) { + case "potion": + double newHp = Math.min(user.getStats().getMaxHealth(), user.getStats().getHp() + 15); + user.getStats().setHp(newHp); + + + break; + default: + + // TODO Add bought item to the avatar + + break; + } + + showSnackbar("Buy Reward Successful " + event.Reward.getText()); + } + + @Override + public void failure(RetrofitError error) { + showSnackbar("Buy Reward Error " + event.Reward.getText(), SnackbarDisplayType.FAILURE); + } + }); + } else { + // user created Rewards + + mAPIHelper.updateTaskDirection(rewardKey, TaskDirection.down, new TaskScoringCallback(this, rewardKey)); + } + } + + public void onEvent(final TaskSaveEvent event) { + Task task = (Task) event.task; + Log.d("tags", "Task saving"); + if (event.created) { + this.mAPIHelper.createNewTask(task, new TaskCreationCallback()); + updateTags(event.task.getTags()); + } else { + this.mAPIHelper.updateTask(task, new TaskUpdateCallback()); + } + } + + public void onEvent(ToggledInnStateEvent event) { + user.getPreferences().setSleep(event.Inn); + } + + //endregion Events + + private void notifyUser(double xp, double hp, double gold, + int lvl, double delta) { + StringBuilder message = new StringBuilder(); + SnackbarDisplayType displayType = SnackbarDisplayType.NORMAL; + if (lvl > user.getStats().getLvl()) { + displayLevelUpDialog(lvl); + + this.mAPIHelper.retrieveUser(new HabitRPGUserCallback(activity)); + user.getStats().setLvl((int) lvl); + showSnackbar(message.toString()); + } else { + com.magicmicky.habitrpgwrapper.lib.models.Stats stats = user.getStats(); + + if (xp > stats.getExp()) { + message.append(" + ").append(round(xp - stats.getExp(), 2)).append(" XP"); + user.getStats().setExp(xp); + } + if (hp != stats.getHp()) { + displayType = SnackbarDisplayType.FAILURE; + message.append(" - ").append(round(stats.getHp() - hp, 2)).append(" HP"); + user.getStats().setHp(hp); + } + if (gold > stats.getGp()) { + message.append(" + ").append(round(gold - stats.getGp(), 2)).append(" GP"); + stats.setGp(gold); + } else if (gold < stats.getGp()) { + displayType = SnackbarDisplayType.FAILURE; + message.append(" - ").append(round(stats.getGp() - gold, 2)).append(" GP"); + stats.setGp(gold); + } + showSnackbar(message.toString(), displayType); + + } + } + + static public Double round(Double value, int n) { + return (Math.round(value * Math.pow(10, n))) / (Math.pow(10, n)); + } + + private void displayDeathDialogIfNeeded() { + + if (user.getStats().getHp() > 0) { + return; + } + + if (this.faintDialog == null) { + this.faintDialog = new MaterialDialog.Builder(activity) + .title(R.string.faint_header) + .customView(R.layout.faint_dialog, true) + .positiveText(R.string.faint_button) + .positiveColorRes(R.color.worse_100) + .dismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + faintDialog = null; + mAPIHelper.reviveUser(new HabitRPGUserCallback(activity)); + } + }) + .cancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + faintDialog = null; + } + }) + .build(); + + View customView = this.faintDialog.getCustomView(); + if (customView != null) { + View hpBarView = customView.findViewById(R.id.hpBar); + + ValueBarBinding hpBar = DataBindingUtil.bind(hpBarView); + hpBar.setPartyMembers(true); + AvatarWithBarsViewModel.setHpBarData(hpBar, user.getStats(), activity); + + ImageView avatarView = (ImageView)customView.findViewById(R.id.avatarView); + UserPicture userPicture = new UserPicture(user, activity, false, false); + userPicture.setPictureOn(avatarView); + } + + this.faintDialog.show(); + } + } + + private void displayLevelUpDialog(int level) { + SuppressedModals suppressedModals = user.getPreferences().getSuppressModals(); + if (suppressedModals != null) { + if (suppressedModals.getLevelUp()) { + return; + } + } + + MaterialDialog dialog = new MaterialDialog.Builder(activity) + .title(R.string.levelup_header) + .customView(R.layout.levelup_dialog, true) + .positiveText(R.string.levelup_button) + .positiveColorRes(R.color.brand_100) + .build(); + + View customView = dialog.getCustomView(); + if (customView != null) { + TextView detailView = (TextView)customView.findViewById(R.id.levelupDetail); + detailView.setText(this.getString(R.string.levelup_detail, level)); + + ImageView avatarView = (ImageView)customView.findViewById(R.id.avatarView); + UserPicture userPicture = new UserPicture(user, activity, false, false); + userPicture.setPictureOn(avatarView); + } + + dialog.show(); + } + + + public void FillTagFilterDrawer(List tagList) { + filterDrawer.removeAllItems(); + filterDrawer.addItems( + new SectionDrawerItem().withName("Filter by Tag"), + new EditTextDrawer() + ); + + for (Tag t : tagList) { + filterDrawer.addItem(new SwitchDrawerItem() + .withName(t.getName()) + .withTag(t) + .withDescription("" + t.getTasks().size()) + .withOnCheckedChangeListener(this) + ); + } + } + + private Debounce filterChangedHandler = new Debounce(1500, 1000) { + @Override + public void execute() { + ArrayList tagList = new ArrayList<>(); + + for (Map.Entry f : tagFilterMap.entrySet()) { + if (f.getValue()) { + tagList.add(f.getKey()); + } + } + tagsHelper.setTags(tagList); + EventBus.getDefault().post(new FilterTasksByTagsCommand()); + } + }; + + private HashMap tagFilterMap = new HashMap<>(); + + /* + Updates concerned tags. + */ + public void updateTags(List tags) { + Log.d("tags", "Updating tags"); + List filters = filterDrawer.getDrawerItems(); + for (IDrawerItem filter : filters) { + if (filter instanceof SwitchDrawerItem) { + SwitchDrawerItem currentfilter = (SwitchDrawerItem) filter; + Log.v("tags", "Tag " + currentfilter.getName()); + String tagId = ((Tag) currentfilter.getTag()).getId(); + for (TaskTag tag : tags) { + Tag currentTag = tag.getTag(); + + + if (tagId != null && currentTag != null && tagId.equals(currentTag.getId())) { + currentfilter.withDescription("" + (currentTag.getTasks().size() + 1)); + filterDrawer.updateItem(currentfilter); + } + } + } + } + + } + + @Override + public void onCheckedChanged(IDrawerItem iDrawerItem, CompoundButton compoundButton, boolean b) { + Tag t = (Tag) iDrawerItem.getTag(); + if (t != null) { + tagFilterMap.put(t.getId(), b); + filterChangedHandler.hit(); + showSnackbar(t.getName() + " : " + b); + } + } } diff --git a/Habitica/src/com/habitrpg/android/habitica/TavernFragment.java b/Habitica/src/com/habitrpg/android/habitica/TavernFragment.java new file mode 100644 index 000000000..efd35f13c --- /dev/null +++ b/Habitica/src/com/habitrpg/android/habitica/TavernFragment.java @@ -0,0 +1,40 @@ +package com.habitrpg.android.habitica; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.ViewPager; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.habitrpg.android.habitica.helpers.TagsHelper; +import com.habitrpg.android.habitica.ui.fragments.ChatListFragment; +import com.mikepenz.materialdrawer.DrawerBuilder; + +/** + * Created by viirus on 19/11/15. + */ +public class TavernFragment extends BaseFragment { + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + View v = inflater.inflate(R.layout.fragment_tavern, container, false); + + setFragment(new ChatListFragment(activity, "habitrpg", mAPIHelper, user, true)); + + return v; + } + + protected void setFragment(Fragment fragment) { + FragmentManager fragmentManager = getChildFragmentManager(); + FragmentTransaction fragmentTransaction = + fragmentManager.beginTransaction(); + fragmentTransaction.replace(R.id.tavern_framelayout, fragment); + fragmentTransaction.commit(); + } +} diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java b/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java index 332b8b958..d9314ade3 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java @@ -15,6 +15,7 @@ import com.habitrpg.android.habitica.PartyActivity; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.TasksFragment; import com.habitrpg.android.habitica.TavernActivity; +import com.habitrpg.android.habitica.TavernFragment; import com.habitrpg.android.habitica.prefs.PrefsActivity; import com.mikepenz.materialdrawer.AccountHeader; import com.mikepenz.materialdrawer.AccountHeaderBuilder; @@ -112,6 +113,10 @@ public class MainDrawerBuilder { fragment = new PartyFragment(); break; } + case SIDEBAR_TAVERN: { + fragment = new TavernFragment(); + break; + } } if (fragment != null) {