diff --git a/Habitica/res/layout/checklist_dialog.xml b/Habitica/res/layout/checklist_dialog.xml deleted file mode 100644 index b4ad89b66..000000000 --- a/Habitica/res/layout/checklist_dialog.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/Habitica/res/layout/checklist_dialog_list_item.xml b/Habitica/res/layout/checklist_dialog_list_item.xml deleted file mode 100644 index 4e6568434..000000000 --- a/Habitica/res/layout/checklist_dialog_list_item.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/Habitica/res/layout/checklist_item_row.xml b/Habitica/res/layout/checklist_item_row.xml new file mode 100644 index 000000000..700640f7b --- /dev/null +++ b/Habitica/res/layout/checklist_item_row.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/layout/daily_item_card.xml b/Habitica/res/layout/daily_item_card.xml index f36eb4343..74e712366 100644 --- a/Habitica/res/layout/daily_item_card.xml +++ b/Habitica/res/layout/daily_item_card.xml @@ -8,6 +8,9 @@ + + + + \ No newline at end of file diff --git a/Habitica/res/layout/todo_item_card.xml b/Habitica/res/layout/todo_item_card.xml index 623943e4c..d2f967b3f 100644 --- a/Habitica/res/layout/todo_item_card.xml +++ b/Habitica/res/layout/todo_item_card.xml @@ -8,6 +8,9 @@ + + + + \ No newline at end of file diff --git a/Habitica/res/values/colors.xml b/Habitica/res/values/colors.xml index 24a01b3dc..beb35d319 100644 --- a/Habitica/res/values/colors.xml +++ b/Habitica/res/values/colors.xml @@ -10,9 +10,9 @@ @color/brand_100 - #E6B8AF - #c96652 - #c96652 + #a13f44 + #a1334d + #a10013 #FF6165 #F74E52 @@ -93,4 +93,5 @@ #ffd8dcdd #c3c2c6 + #ededed \ No newline at end of file diff --git a/Habitica/res/values/dimens.xml b/Habitica/res/values/dimens.xml index cdaf4cad2..c28118827 100644 --- a/Habitica/res/values/dimens.xml +++ b/Habitica/res/values/dimens.xml @@ -38,4 +38,5 @@ 0.5dp 14dp 36dp + 50dp \ No newline at end of file diff --git a/Habitica/src/com/habitrpg/android/habitica/CheckableLinearLayout.java b/Habitica/src/com/habitrpg/android/habitica/CheckableLinearLayout.java deleted file mode 100644 index cdee120d6..000000000 --- a/Habitica/src/com/habitrpg/android/habitica/CheckableLinearLayout.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.habitrpg.android.habitica; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.widget.Checkable; -import android.widget.CheckedTextView; -import android.widget.LinearLayout; - -/* - * This class is useful for using inside of ListView that needs to have checkable items. - */ -public class CheckableLinearLayout extends LinearLayout implements Checkable { - private CheckedTextView _checkbox; - - public CheckableLinearLayout(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - // find checked text view - - View v = findViewById(R.id.TV_title); - - if (v instanceof CheckedTextView) { - _checkbox = (CheckedTextView) v; - } - } - - @Override - public boolean isChecked() { - return _checkbox != null ? _checkbox.isChecked() : false; - } - - @Override - public void setChecked(boolean checked) { - if (_checkbox != null) { - _checkbox.setChecked(checked); - } - } - - @Override - public void toggle() { - if (_checkbox != null) { - - _checkbox.toggle(); - } - } -} \ No newline at end of file diff --git a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java index 226876a5a..1a0073f6b 100644 --- a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java @@ -28,7 +28,7 @@ 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.TodoCheckedEvent; +import com.habitrpg.android.habitica.events.TaskCheckedEvent; import com.habitrpg.android.habitica.events.ToggledInnStateEvent; import com.habitrpg.android.habitica.prefs.PrefsActivity; import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel; @@ -37,7 +37,6 @@ import com.habitrpg.android.habitica.ui.MainDrawerBuilder; import com.habitrpg.android.habitica.ui.adapter.HabitItemRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.fragments.TaskRecyclerViewFragment; import com.instabug.wrapper.support.activity.InstabugAppCompatActivity; -import com.magicmicky.habitrpgwrapper.lib.models.ContentResult; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.Tag; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirection; @@ -253,8 +252,9 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU showSnackbar("LongPress: " + event.Task.text); } - public void onEvent(TodoCheckedEvent event) { - showSnackbar("ToDo Checked= " + event.ToDo.getText(), true); + public void onEvent(TaskCheckedEvent event) { + showSnackbar("ToDo Checked= " + event.Task.getText(), true); + mAPIHelper.updateTaskDirection(event.Task.getId(), event.Task.getCompleted() ? TaskDirection.down : TaskDirection.up, new TaskScoringCallback(this, event.Task.getId())); } public void onEvent(HabitScoreEvent event) { diff --git a/Habitica/src/com/habitrpg/android/habitica/events/TodoCheckedEvent.java b/Habitica/src/com/habitrpg/android/habitica/events/TaskCheckedEvent.java similarity index 74% rename from Habitica/src/com/habitrpg/android/habitica/events/TodoCheckedEvent.java rename to Habitica/src/com/habitrpg/android/habitica/events/TaskCheckedEvent.java index 72e1795f0..370f5b69b 100644 --- a/Habitica/src/com/habitrpg/android/habitica/events/TodoCheckedEvent.java +++ b/Habitica/src/com/habitrpg/android/habitica/events/TaskCheckedEvent.java @@ -5,6 +5,6 @@ import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; /** * Created by Negue on 11.07.2015. */ -public class TodoCheckedEvent { - public Task ToDo; +public class TaskCheckedEvent { + public Task Task; } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java index 5afde7251..c98587688 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/HabitItemRecyclerViewAdapter.java @@ -14,9 +14,10 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; -import android.widget.CheckedTextView; import android.widget.CompoundButton; import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; import android.widget.TextView; import com.habitrpg.android.habitica.R; @@ -28,8 +29,9 @@ import com.habitrpg.android.habitica.events.BuyRewardTappedEvent; import com.habitrpg.android.habitica.events.HabitScoreEvent; import com.habitrpg.android.habitica.events.TaskLongPressedEvent; import com.habitrpg.android.habitica.events.TaskTappedEvent; -import com.habitrpg.android.habitica.events.TodoCheckedEvent; +import com.habitrpg.android.habitica.events.TaskCheckedEvent; import com.habitrpg.android.habitica.ui.helpers.ViewHelper; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.ChecklistItem; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task; import com.raizlabs.android.dbflow.runtime.FlowContentObserver; import com.raizlabs.android.dbflow.sql.builder.Condition; @@ -52,6 +54,7 @@ public class HabitItemRecyclerViewAdapter private Class> viewHolderClass; List contents; Class taskClass; + Integer displayedChecklist = null; String taskType; private ObservableArrayList observableContent; FlowContentObserver observer; @@ -180,6 +183,11 @@ public class HabitItemRecyclerViewAdapter Task item = contents.get(position); holder.bindHolder(item, position); + + if (this.displayedChecklist != null && ChecklistedViewHolder.class.isAssignableFrom(holder.getClass())) { + ChecklistedViewHolder checklistedHolder = (ChecklistedViewHolder) holder; + checklistedHolder.setDisplayChecklist(this.displayedChecklist == position); + } } private Handler handler = new Handler(); @@ -323,7 +331,68 @@ public class HabitItemRecyclerViewAdapter } } - public class DailyViewHolder extends ViewHolder { + public class ChecklistedViewHolder extends ViewHolder { + + @InjectView(R.id.checklistView) + LinearLayout checklistView; + + @InjectView(R.id.checklistIndicatorWrapper) + RelativeLayout checklistIndicatorWrapper; + + public Boolean displayChecklist; + + public ChecklistedViewHolder(View itemView) { + super(itemView); + checklistIndicatorWrapper.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + + if (v == checklistIndicatorWrapper) { + if (this.displayChecklist != null) { + this.setDisplayChecklist(!this.displayChecklist); + } else { + this.setDisplayChecklist(true); + } + } else { + super.onClick(v); + } + + } + + @Override + public void bindHolder(Task habitItem, int position) { + super.bindHolder(habitItem, position); + Boolean isClickable = false; + if (habitItem.getChecklist() != null && habitItem.getChecklist().size() > 0) { + isClickable = true; + } + checklistIndicatorWrapper.setClickable(isClickable); + } + + public void setDisplayChecklist(Boolean displayChecklist) { + this.displayChecklist = displayChecklist; + if (this.checklistView != null) { + if (this.displayChecklist && this.Item.checklist != null) { + LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + for (ChecklistItem item : this.Item.checklist) { + LinearLayout itemView = (LinearLayout)layoutInflater.inflate(R.layout.checklist_item_row, null); + CheckBox checkbox = (CheckBox) itemView.findViewById(R.id.checkBox); + TextView textView = (TextView) itemView.findViewById(R.id.checkedTextView); + // Populate the data into the template view using the data object + textView.setText(item.getText()); + checkbox.setChecked(item.getCompleted()); + this.checklistView.addView(itemView); + } + } else { + this.checklistView.removeAllViewsInLayout(); + } + } + } + } + + public class DailyViewHolder extends ChecklistedViewHolder implements CompoundButton.OnCheckedChangeListener { @InjectView(R.id.checkBox) CheckBox checkbox; @@ -333,6 +402,8 @@ public class HabitItemRecyclerViewAdapter super(itemView); binding = DataBindingUtil.bind(itemView); + + checkbox.setOnCheckedChangeListener(this); } @@ -342,9 +413,25 @@ public class HabitItemRecyclerViewAdapter binding.setDaily(habitItem); } + + @Override + public void setDisplayChecklist(Boolean displayChecklist) { + binding.setDisplayChecklist(displayChecklist); + super.setDisplayChecklist(displayChecklist); + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked != Item.getCompleted()) { + TaskCheckedEvent event = new TaskCheckedEvent(); + event.Task = Item; + EventBus.getDefault().post(event); + } + } + } - public class TodoViewHolder extends ViewHolder implements CompoundButton.OnCheckedChangeListener { + public class TodoViewHolder extends ChecklistedViewHolder implements CompoundButton.OnCheckedChangeListener { @InjectView(R.id.checkBox) CheckBox checkbox; @@ -368,10 +455,17 @@ public class HabitItemRecyclerViewAdapter @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - TodoCheckedEvent event = new TodoCheckedEvent(); - event.ToDo = Item; + if (isChecked != Item.getCompleted()) { + TaskCheckedEvent event = new TaskCheckedEvent(); + event.Task = Item; + EventBus.getDefault().post(event); + } + } - EventBus.getDefault().post(event); + @Override + public void setDisplayChecklist(Boolean displayChecklist) { + binding.setDisplayChecklist(displayChecklist); + super.setDisplayChecklist(displayChecklist); } }