diff --git a/Habitica/res/drawable-hdpi/ic_action_delete.png b/Habitica/res/drawable-hdpi/ic_action_delete.png new file mode 100644 index 000000000..eec14f009 Binary files /dev/null and b/Habitica/res/drawable-hdpi/ic_action_delete.png differ diff --git a/Habitica/res/drawable-hdpi/ic_action_list.png b/Habitica/res/drawable-hdpi/ic_action_list.png new file mode 100644 index 000000000..8fe7ee3cd Binary files /dev/null and b/Habitica/res/drawable-hdpi/ic_action_list.png differ diff --git a/Habitica/res/drawable-mdpi/ic_action_delete.png b/Habitica/res/drawable-mdpi/ic_action_delete.png new file mode 100644 index 000000000..f5f473fd1 Binary files /dev/null and b/Habitica/res/drawable-mdpi/ic_action_delete.png differ diff --git a/Habitica/res/drawable-mdpi/ic_action_list.png b/Habitica/res/drawable-mdpi/ic_action_list.png new file mode 100644 index 000000000..86018ee4c Binary files /dev/null and b/Habitica/res/drawable-mdpi/ic_action_list.png differ diff --git a/Habitica/res/drawable-xhdpi/ic_action_delete.png b/Habitica/res/drawable-xhdpi/ic_action_delete.png new file mode 100644 index 000000000..1e207672c Binary files /dev/null and b/Habitica/res/drawable-xhdpi/ic_action_delete.png differ diff --git a/Habitica/res/drawable-xhdpi/ic_action_list.png b/Habitica/res/drawable-xhdpi/ic_action_list.png new file mode 100644 index 000000000..7549f60ee Binary files /dev/null and b/Habitica/res/drawable-xhdpi/ic_action_list.png differ diff --git a/Habitica/res/drawable-xxhdpi/ic_action_delete.png b/Habitica/res/drawable-xxhdpi/ic_action_delete.png new file mode 100644 index 000000000..3a25d9b62 Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/ic_action_delete.png differ diff --git a/Habitica/res/drawable-xxhdpi/ic_action_list.png b/Habitica/res/drawable-xxhdpi/ic_action_list.png new file mode 100644 index 000000000..8a8594e34 Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/ic_action_list.png differ diff --git a/Habitica/res/drawable-xxxhdpi/ic_action_delete.png b/Habitica/res/drawable-xxxhdpi/ic_action_delete.png new file mode 100644 index 000000000..1f08a9526 Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/ic_action_delete.png differ diff --git a/Habitica/res/drawable-xxxhdpi/ic_action_list.png b/Habitica/res/drawable-xxxhdpi/ic_action_list.png new file mode 100644 index 000000000..7c4fc4944 Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/ic_action_list.png differ diff --git a/Habitica/res/layout/add_task_dialog.xml b/Habitica/res/layout/add_task_dialog.xml index 70df24bd8..ab4ff062f 100644 --- a/Habitica/res/layout/add_task_dialog.xml +++ b/Habitica/res/layout/add_task_dialog.xml @@ -1,104 +1,129 @@ - - - - - - + android:layout_height="match_parent" + android:background="@android:color/background_light" + android:orientation="vertical"> - - - + android:paddingLeft="@dimen/activity_vertical_margin" + android:paddingRight="@dimen/activity_vertical_margin"> - + + + + + + + + + + + android:paddingLeft="@dimen/activity_vertical_margin" + android:paddingRight="@dimen/activity_vertical_margin"> - + + + + + + + - + android:paddingLeft="@dimen/activity_vertical_margin" + android:paddingRight="@dimen/activity_vertical_margin" + android:visibility="gone"> + - - - - + android:paddingLeft="@dimen/activity_vertical_margin" + android:paddingRight="@dimen/activity_vertical_margin" + android:visibility="gone"> + + + + + + + - - + android:paddingLeft="@dimen/activity_vertical_margin" + android:paddingRight="@dimen/activity_vertical_margin" + android:visibility="gone"> + + + + - + diff --git a/Habitica/res/layout/checklist_dialog.xml b/Habitica/res/layout/checklist_dialog.xml new file mode 100644 index 000000000..b4ad89b66 --- /dev/null +++ b/Habitica/res/layout/checklist_dialog.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + \ 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 new file mode 100644 index 000000000..4e6568434 --- /dev/null +++ b/Habitica/res/layout/checklist_dialog_list_item.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/layout/custom_list_preference_row.xml b/Habitica/res/layout/custom_list_preference_row.xml index deee48516..aa8b81791 100644 --- a/Habitica/res/layout/custom_list_preference_row.xml +++ b/Habitica/res/layout/custom_list_preference_row.xml @@ -1,29 +1,26 @@ - + android:paddingRight="10dip" + android:paddingTop="8dip"> + - - - + \ No newline at end of file diff --git a/Habitica/res/layout/todo.xml b/Habitica/res/layout/todo.xml index 4b397c7e4..07a9ca0c3 100644 --- a/Habitica/res/layout/todo.xml +++ b/Habitica/res/layout/todo.xml @@ -24,13 +24,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - - - - - - + + \ No newline at end of file diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 0221a8180..cfd19190a 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -4,121 +4,116 @@ Habitica Settings Refresh - Hello world! + - - XP - HP - %1$d-%2$d-%3$d - A new task have been added - LVL UP! - Scan a barcode - Prefs couldn\'t be loaded from the barcode - Settings were successfully updated! - HabitRPG settings - OK - - Params - Server config - ServerAdress - Server Address - Enter the address of the server - https://habitrpg.com/ - Your custom server - UserID - User ID - Your User ID - APIToken - API Token - Your API Token - Contact me - \@MagicMicky - Contact me via Twitter - Licence notices - Information about softwares that helped me develop this software - There was a problem with the settings - Please fill the settings. - An error happened… - - Add a note - Creation of a new %s - Task: - Note: - Due date: - Value: - Up - Down - OK - Cancel - 20 - Task creation has failed: you need to provide a title - - Open drawer - close drawer - - - Tags + XP + HP + %1$d-%2$d-%3$d + A new task have been added + LVL UP! + Scan a barcode + Prefs couldn\'t be loaded from the barcode + Settings were successfully updated! + HabitRPG settings + OK + + + Params + Server config + ServerAdress + Server Address + Enter the address of the server + https://habitrpg.com/ + Your custom server + UserID + User ID + Your User ID + APIToken + API Token + Your API Token + Contact me + \@MagicMicky + Contact me via Twitter + Licence notices + Information about softwares that helped me develop this software + There was a problem with the settings + Please fill the settings. + An error happened… + + + Add a note + Creation of a new %s + Task: + Note: + Due date: + Value: + Up + Down + OK + Cancel + 20 + Task creation has failed: you need to provide a title + + Open drawer + close drawer + + Tags To simplify everything you can scan the QRCode to connect to HabitRPG. To start the scanning mode, use the button in the menu. - acknowledge_qrcode_omg - New todo - New reward - New daily - New habit - New task - The task %s was deleted successfully - Edit - Delete - %d tasks selected - Cancel - A task were successfully updated - You just bought a shinny new %s! - User Token - API Token - Login (normal) - Register - Username - Password - Email address - Confirm password - Login (via tokens) + acknowledge_qrcode_omg + New todo + New reward + New daily + New habit + New task + The task %s was deleted successfully + Edit + Delete + %d tasks selected + Cancel + A task were successfully updated + You just bought a shinny new %s! + User Token + API Token + Login (normal) + Register + Username + Password + Email address + Confirm password + Login (via tokens) If you registered via facebook, please use the QRCode, or login using your API/USER tokens - An error happened. Please try to connect - Error: your credentials couldn\'t be saved! - Logout - Login + An error happened. Please try to connect + Error: your credentials couldn\'t be saved! + Logout + Login To use this application, you need to have an account on http://habitrpg.com. You can register using the register button in this application.\n\n If you already have an account, use the connect buttons, or the QRCode scanner. If you created your account using Facebook on the website, you will need to use the QRcode scanner or connect using your API and User token that you can find on http://habitrpg.com. - Help - You\'re dead! + Help + You\'re dead! You weren\'t vigilant enough, and get lost between some bad habits and some difficult dailies. You are going to revive, but will loose a level, your gold and a random piece of equipment. Try to be more careful with your dailies, and manage those bad habits! - Revive + + + Revive Refreshing widget… Please connect through the application before using a widget - -    Change log -    Close +      + Close SP_last_version See the changelog - MP - - + MP + Update + About + Changelog + Add checklist + Edit checklist + Add item… \ No newline at end of file diff --git a/Habitica/src/com/habitrpg/android/habitica/AddTaskDialog.java b/Habitica/src/com/habitrpg/android/habitica/AddTaskDialog.java index 253f749d3..ccfd7acc0 100644 --- a/Habitica/src/com/habitrpg/android/habitica/AddTaskDialog.java +++ b/Habitica/src/com/habitrpg/android/habitica/AddTaskDialog.java @@ -2,12 +2,14 @@ package com.habitrpg.android.habitica; import java.util.Calendar; import java.util.Date; + import android.app.Activity; import android.app.AlertDialog; import android.app.DatePickerDialog.OnDateSetListener; import android.app.Dialog; import android.content.DialogInterface; import android.graphics.Typeface; +import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.util.Log; @@ -18,12 +20,15 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.widget.DatePicker; import android.widget.EditText; +import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.ToggleButton; import com.crashlytics.android.Crashlytics; +import com.habitrpg.android.habitica.ChecklistDialog.CheckListUpdater; import com.habitrpg.android.habitica.ui.fragments.DatePickerFragment; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Checklist; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Daily; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Habit; import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitItem; @@ -32,52 +37,64 @@ import com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward; import com.magicmicky.habitrpgwrapper.lib.models.tasks.ToDo; import com.magicmicky.habitrpgwrapper.lib.utils.DaysUtils; +import org.json.JSONObject; + import static com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType.*; import static com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType.habit; -public class AddTaskDialog extends DialogFragment implements OnDateSetListener{ - private EditText taskText, taskNote, taskValue; - private boolean[] repeat = {false, false, false, false, false, false, false}; - private boolean[] down_up= {true,true}; - private String toDoDate; - private HabitType hType; +/** + * Updated by Negue on 21/06/15 + */ +public class AddTaskDialog extends DialogFragment implements OnDateSetListener, CheckListUpdater { + private EditText taskText, taskNote, taskValue; + private boolean[] repeat = {false, false, false, false, false, false, false}; + private boolean[] down_up = {true, true}; + private String toDoDate; + private HabitType hType; - private String[] mShortWeekDayStrings = {"Mo","Tu","We","Th","Fr","Sa","Su"}; - private int colorDesactivated; - private int colorActivated; - private Typeface mRobotoBold; - private Typeface mRobotoNormal; - private ToggleButton[] buttons; - private ViewGroup[] buttonsHolder = new ViewGroup[7]; - private LayoutInflater inflater; - private TextView spinner; - - private OnTaskCreationListener mListener; - private boolean mEditMode=false; - private String mEditingId; - private Double oldValue=null; + private String[] mShortWeekDayStrings = {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"}; + private int colorDesactivated; + private int colorActivated; + private Typeface mRobotoBold; + private Typeface mRobotoNormal; + private ToggleButton[] buttons; + private ViewGroup[] buttonsHolder = new ViewGroup[7]; + private LayoutInflater inflater; + private TextView spinner; - @Override + private OnTaskCreationListener mListener; + private boolean mEditMode = false; + private String mEditingId; + private Double oldValue = null; + private Checklist mChecklist = new Checklist() { + @Override + protected HabitType getType() { + return daily; + } + }; + + @Override public void onAttach(Activity activity) { super.onAttach(activity); - try { + try { mListener = (OnTaskCreationListener) activity; } catch (ClassCastException e) { - e.printStackTrace(); - this.dismiss(); + e.printStackTrace(); + this.dismiss(); } - } + } + @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); //getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); } - + public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the Builder class for convenient dialog construction AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - this.inflater = getActivity().getLayoutInflater(); - View mainView =inflater.inflate(R.layout.add_task_dialog, null); + this.inflater = getActivity().getLayoutInflater(); + View mainView = inflater.inflate(R.layout.add_task_dialog, null); builder.setView(mainView); this.colorActivated = this.getResources().getColor(R.color.days_black); this.colorDesactivated = this.getResources().getColor(R.color.days_gray); @@ -87,75 +104,79 @@ public class AddTaskDialog extends DialogFragment implements OnDateSetListener{ this.taskText = (EditText) mainView.findViewById(R.id.ET_taskText); this.taskValue = (EditText) mainView.findViewById(R.id.ET_taskValue); - Bundle b = this.getArguments(); + Bundle b = this.getArguments(); int pos = b.getInt("pos", -1); - String type; - String text; - if(pos != -1) { - this.mEditMode=true; - } + String type; + String text; + if (pos != -1) { + this.mEditMode = true; + } + + type = b.getString("type"); + text = b.getString("text"); + + this.taskText.setText(text); + Log.d("AddTaskDialog", "type=" + type); + hType = type.equals(daily.toString()) ? + daily : type.equals(reward.toString()) ? + reward : type.equals(todo.toString()) ? + todo : habit; + LinearLayout specialView = (LinearLayout) mainView.findViewById(R.id.repeat_days); + if (hType == daily) { + this.initializeSpecialButtons(specialView, mShortWeekDayStrings, repeat); + + showChecklistButton(mainView); + + } else if (hType == habit) { + String[] texts = {getString(R.string.minus_sign), getString(R.string.plus_sign)}; + this.initializeSpecialButtons(specialView, texts, this.down_up); + } else if (hType == todo) { + LinearLayout dueDate = (LinearLayout) mainView.findViewById(R.id.due_date); + this.initializeDatePicker(dueDate); - type = b.getString("type"); - text = b.getString("text"); + showChecklistButton(mainView); - this.taskText.setText(text); - Log.d("AddTaskDialog","type="+type); - hType = type.equals(daily.toString()) ? - daily : type.equals(reward.toString()) ? - reward : type.equals(todo.toString()) ? - todo : habit; - LinearLayout specialView = (LinearLayout) mainView.findViewById(R.id.repeat_days); - if(hType == daily) { - this.initializeSpecialButtons(specialView, mShortWeekDayStrings, repeat); - } - else if(hType== habit) { - String[] texts = {getString(R.string.minus_sign),getString(R.string.plus_sign)}; - this.initializeSpecialButtons(specialView, texts, this.down_up); - } - else if(hType== todo) { - LinearLayout dueDate = (LinearLayout) mainView.findViewById(R.id.due_date); - this.initializeDatePicker(dueDate); - } else if(hType== reward) { - LinearLayout value = (LinearLayout) mainView.findViewById(R.id.value); - value.setVisibility(View.VISIBLE); + } else if (hType == reward) { + LinearLayout value = (LinearLayout) mainView.findViewById(R.id.value); + value.setVisibility(View.VISIBLE); - } + } - if(mEditMode) { + if (mEditMode) { // this.reconstructObjectFrom(json); - switch(hType) { + switch (hType) { case todo: - this.populate(((MainActivity)getActivity()).getTodo(pos)); + this.populate(((MainActivity) getActivity()).getTodo(pos)); break; case daily: - this.populate(((MainActivity)getActivity()).getDaily(pos)); + this.populate(((MainActivity) getActivity()).getDaily(pos)); break; case reward: - this.populate(((MainActivity)getActivity()).getReward(pos)); + this.populate(((MainActivity) getActivity()).getReward(pos)); break; case habit: - this.populate(((MainActivity)getActivity()).getHabit(pos)); + this.populate(((MainActivity) getActivity()).getHabit(pos)); break; } - } + } builder.setTitle(getString(R.string.new_task, hType.toString())) - .setPositiveButton(R.string.dialog_confirm_button, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { + .setPositiveButton(R.string.dialog_confirm_button, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { - if (AddTaskDialog.this.taskText.getText().length() > 0) { + if (AddTaskDialog.this.taskText.getText().length() > 0) { - mListener.onTaskCreation(AddTaskDialog.this.createTask(), mEditMode); - } else { - mListener.onTaskCreationFail(getActivity().getString(R.string.task_creation_fail)); - } - } - }) - .setNegativeButton(R.string.dialog_cancel_button, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - // User cancelled the dialog - } - }); + mListener.onTaskCreation(AddTaskDialog.this.createTask(), mEditMode); + } else { + mListener.onTaskCreationFail(getActivity().getString(R.string.task_creation_fail)); + } + } + }) + .setNegativeButton(R.string.dialog_cancel_button, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + // User cancelled the dialog + } + }); // Create the AlertDialog object and return it Dialog d = builder.create(); d.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); @@ -163,31 +184,45 @@ public class AddTaskDialog extends DialogFragment implements OnDateSetListener{ return d; } + private void showChecklistButton(View mainView) { + ImageButton btn = (ImageButton) mainView.findViewById(R.id.BT_checklist); + btn.setVisibility(View.VISIBLE); - private void initializeDatePicker(LinearLayout specialView) { - specialView.setVisibility(ViewGroup.VISIBLE); - this.spinner = (TextView) specialView.findViewById(R.id.due_date_spinner); - spinner.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - DialogFragment newFragment = new DatePickerFragment(); - newFragment.setTargetFragment(AddTaskDialog.this, 0); - newFragment.show(getActivity().getSupportFragmentManager(), "timePicker"); - } - }); + btn.setOnClickListener(new View.OnClickListener() { + + @Override + + public void onClick(View v) { + ChecklistDialog dialog = new ChecklistDialog(getActivity(), AddTaskDialog.this, null, mChecklist, mEditMode); + dialog.show(); + } + + }); + } + + private void initializeDatePicker(LinearLayout specialView) { + specialView.setVisibility(ViewGroup.VISIBLE); + this.spinner = (TextView) specialView.findViewById(R.id.due_date_spinner); + spinner.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + DialogFragment newFragment = new DatePickerFragment(); + newFragment.setTargetFragment(AddTaskDialog.this, 0); + newFragment.show(getActivity().getSupportFragmentManager(), "timePicker"); + } + }); } - - private void initializeSpecialButtons(LinearLayout specialView, String[] texts, final boolean[] resArray) { - int length = texts.length; - this.buttonsHolder = new ViewGroup[length]; - this.buttons = new ToggleButton[length]; - specialView.setVisibility(ViewGroup.VISIBLE); + private void initializeSpecialButtons(LinearLayout specialView, String[] texts, final boolean[] resArray) { + int length = texts.length; + this.buttonsHolder = new ViewGroup[length]; + this.buttons = new ToggleButton[length]; + specialView.setVisibility(ViewGroup.VISIBLE); for (int i = 0; i < length; i++) { final ViewGroup viewgroup = (ViewGroup) inflater.inflate(R.layout.button_day_of_week, - specialView, false); + specialView, false); final ToggleButton button = (ToggleButton) viewgroup.getChildAt(0); button.setText(texts[i]); button.setTextOn(texts[i]); @@ -195,164 +230,181 @@ public class AddTaskDialog extends DialogFragment implements OnDateSetListener{ specialView.addView(viewgroup); this.buttonsHolder[i] = viewgroup; this.buttons[i] = button; - if(i<5) { - buttonOn(i); - resArray[i] = true; + if (i < 5) { + buttonOn(i); + resArray[i] = true; } } - for(int i=0;i implements DialogInterface.OnClickListener { + private final Context mContext; + private Checklist checklist; + private THabitItem item; + private Callback updateCallback; + private final LayoutInflater mInflater; + private final APIHelper mAPIHelper; + private CheckListUpdater checklistUpdater; + private boolean mEditMode; + + public ChecklistDialog(Context act, APIHelper apiHelper, THabitItem todo, Checklist checklist) { + this.mContext = act; + this.item = todo; + + this.checklist = todo != null ? todo : checklist; + this.mInflater = LayoutInflater.from(mContext); + this.mAPIHelper = apiHelper; + this.checklistUpdater = null; + mEditMode = false; + } + + public ChecklistDialog(Context context, CheckListUpdater checkListUpdater, THabitItem todo, Checklist checklist, boolean editMode) { + this(context, null, todo, checklist); + + this.checklistUpdater = checkListUpdater; + this.mEditMode = editMode; + } + + public void show() { + View convertView = mInflater.inflate(R.layout.checklist_dialog, null); + AlertDialog d = new AlertDialog.Builder(mContext) + .setTitle(item != null ? item.getText() : mEditMode + ? mContext.getString(R.string.checklist_title_edit) + : mContext.getString(R.string.checklist_title_add)) + .setView(convertView) + .setPositiveButton(mContext.getString(R.string.update_btn), this) + .setNegativeButton(mContext.getString(R.string.dialog_cancel_button), null) + .create(); + ListView lv = (ListView) convertView.findViewById(R.id.LV_checklist); + + final CheckListAdapter adapter = new CheckListAdapter(mContext, checklist); + + lv.setAdapter(adapter); + d.show(); + + if (mAPIHelper == null) { + convertView.findViewById(R.id.RL_addItem).setVisibility(View.VISIBLE); + ImageButton btn = (ImageButton) convertView.findViewById(R.id.BT_addItem); + final EditText addItem = (EditText) convertView.findViewById(R.id.ET_addItem); + btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (addItem.getText() != null && addItem.getText().length() > 0) { + Checklist.ChecklistItem item = new Checklist.ChecklistItem(); + item.setText(addItem.getText().toString()); + adapter.addItem(item); + adapter.notifyDataSetChanged(); + addItem.setText(""); + } + } + }); + } + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if (checklistUpdater != null) { + checklistUpdater.onChecklistChosen(checklist); + } else { + if (item instanceof ToDo) { + mAPIHelper.updateTask((ToDo) item, new Callback() { + @Override + public void success(ToDo toDo, Response response) { + + } + + @Override + public void failure(RetrofitError error) { + + } + }); + } + + if (item instanceof Daily) { + mAPIHelper.updateTask((Daily) item, new Callback() { + @Override + public void success(Daily daily, Response response) { + + } + + @Override + public void failure(RetrofitError error) { + + } + }); + } + } + } + + private class CheckListAdapter extends BaseAdapter { + + private final Checklist checklist; + private final Context mContext; + + public CheckListAdapter(Context context, Checklist list) { + this.checklist = list; + this.mContext = context; + } + + @Override + public int getCount() { + return checklist.getSize(); + } + + @Override + public Checklist.ChecklistItem getItem(int position) { + return checklist.getItems().get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + LayoutInflater inflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + if (convertView == null) { + convertView = inflator.inflate(R.layout.checklist_dialog_list_item, parent, false); + } + CheckBox completed = (CheckBox) convertView.findViewById(R.id.plus); + TextView text = (TextView) convertView.findViewById(R.id.TV_title); + Checklist.ChecklistItem currentItem = this.getItem(position); + text.setText(currentItem.getText()); + convertView.setId(position); + completed.setChecked(currentItem.isCompleted()); + completed.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (v.getParent() != null) { + getItem(((View) v.getParent()).getId()).setCompleted(((CheckBox) v).isChecked()); + } + } + }); + + + ImageButton delete = (ImageButton) convertView.findViewById(R.id.BT_delete); + + if(mAPIHelper == null) { + delete.setVisibility(View.VISIBLE); + } + delete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (v .getParent() != null){ + removeItem(((View)v.getParent()).getId()); + } + } + }); + + return convertView; + } + + private void removeItem(int pos) { + this.checklist.getItems().remove(pos); + + this.notifyDataSetChanged(); + } + + public void addItem(Checklist.ChecklistItem item) { + this.checklist.addItem(item); + } + } + + public interface CheckListUpdater { + void onChecklistChosen(Checklist list); + } +} \ 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 d71716ba8..1c8ac2f9c 100644 --- a/Habitica/src/com/habitrpg/android/habitica/MainActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/MainActivity.java @@ -48,7 +48,7 @@ import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel; import com.habitrpg.android.habitica.ui.adapter.HabitItemAdapter; import com.habitrpg.android.habitica.ui.fragments.DailyFragment; import com.habitrpg.android.habitica.ui.fragments.RewardFragment; -import com.habitrpg.android.habitica.ui.fragments.TagAdapter; +import com.habitrpg.android.habitica.ui.adapter.TagAdapter; import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.magicmicky.habitrpgwrapper.lib.models.TaskDirectionData; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Daily; @@ -110,10 +110,11 @@ public class MainActivity extends ActionBarActivity implements OnTaskCreationLis finish(); } else { if(this.isThisFirstTimeSinceUpdate()) { - ChangeLogDialog _ChangelogDialog = new ChangeLogDialog(this); - _ChangelogDialog.show(); + // ChangeLogDialog _ChangelogDialog = new ChangeLogDialog(this); + // _ChangelogDialog.show(getSupportFragmentManager()); } } + /* * Retrieve all the views */ @@ -392,6 +393,9 @@ public class MainActivity extends ActionBarActivity implements OnTaskCreationLis case R.id.action_showTestActivity: startActivity(new Intent(this, MainActivityNew.class)); break; + case R.id.action_showChangelogActivity: + startActivity(new Intent(this, AboutActivity.class)); + break; case R.id.action_settings: startActivity(new Intent(this, PrefsActivity.class)); break; @@ -570,7 +574,9 @@ public class MainActivity extends ActionBarActivity implements OnTaskCreationLis public Habit getHabit(int pos) { return user.getHabits().get(pos); } + public ToDo getTodo(int pos) { + return user.getTodos().get(pos); } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/CardFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/CardFragment.java index cb3ebddbe..f3637460b 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/CardFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/CardFragment.java @@ -49,7 +49,7 @@ public abstract class CardFragment extends Fragment implements OnTasksChanged { private List tmpTasks= new ArrayList(); protected MyAdapter mAdapter; private ListView mListView; - private APIHelper mAPIHelper; + protected APIHelper mAPIHelper; private List tmpTags = new ArrayList(); private ActionMode mActionMode; private static final String API_KEY ="b89ef880-7e07-4d13-8a5f-b6be25437fd8"; diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/DailyFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/DailyFragment.java index b3b488984..218867f8c 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/DailyFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/DailyFragment.java @@ -14,9 +14,11 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; +import com.habitrpg.android.habitica.ChecklistDialog; import com.habitrpg.android.habitica.R; import com.magicmicky.habitrpgwrapper.lib.models.tasks.Daily; import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitItem; @@ -75,6 +77,9 @@ public class DailyFragment extends CardFragment { CheckBox completed = (CheckBox) convertView.findViewById(R.id.plus); completed.setOnClickListener(this.getOnClickListener()); TextView text = (TextView) convertView.findViewById(R.id.TV_title); + + ImageButton checklist = (ImageButton) convertView.findViewById(R.id.BT_checklist); + Calendar c = Calendar.getInstance(); c.add(Calendar.HOUR_OF_DAY, -getDayStart()); int index = c.get(Calendar.DAY_OF_WEEK)-2; @@ -101,6 +106,16 @@ public class DailyFragment extends CardFragment { text.setText(currentItem.getText()); completed.setChecked(isChecked(currentItem)); convertView.setLongClickable(true); + + List items =currentItem.getItems(); + + if (items != null && !items.isEmpty()) { + checklist.setVisibility(View.VISIBLE); + checklist.setOnClickListener(openChecklist); + } else { + checklist.setVisibility(View.GONE); + } + if(isItemChecked(position)) { convertView.setBackgroundResource(R.drawable.list_focused_holo); } else { @@ -136,7 +151,21 @@ public class DailyFragment extends CardFragment { return !isChecked ? "down" : "up"; } + private View.OnClickListener openChecklist = new View.OnClickListener() { + @Override + public void onClick(View v) { + + if(v.getParent() != null && v.getParent().getParent() != null) { + + int position = ((View) v.getParent().getParent()).getId(); + + ChecklistDialog dialog = new ChecklistDialog(getActivity(),mAPIHelper,(Daily) getItem(position), null); + + dialog.show(); + } + } + }; } public int getDayStart() { diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/ToDoFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/ToDoFragment.java index 04abf62ed..9939f0e30 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/ToDoFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/ToDoFragment.java @@ -9,89 +9,124 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; +import com.habitrpg.android.habitica.ChecklistDialog; import com.habitrpg.android.habitica.R; +import com.magicmicky.habitrpgwrapper.lib.models.tasks.Daily; import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitItem; import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType; import com.magicmicky.habitrpgwrapper.lib.models.tasks.ToDo; public class ToDoFragment extends CardFragment { - private static final String TITLE = "To do"; - private ToDoAdapter adapter = null; - - @Override - public MyAdapter instantiateAdapter(Context c) { - if(adapter == null) { - List todos = new ArrayList(); - this.adapter = new ToDoAdapter(c,todos); - } - return adapter; - } + private static final String TITLE = "To do"; + private ToDoAdapter adapter = null; - @Override - protected HabitType getTaskType() { - return HabitType.todo; - } - @Override - protected String getTitle() { - return ToDoFragment.TITLE; - } + @Override + public MyAdapter instantiateAdapter(Context c) { + if (adapter == null) { + List todos = new ArrayList(); + this.adapter = new ToDoAdapter(c, todos); + } + return adapter; + } - @Override - protected List filterData(List items) { - List res = new ArrayList(); - for(HabitItem it:items) { - if(it instanceof ToDo) { - if(((ToDo) it).isCompleted()) { - - } else { - res.add(it); - } - } - } - return res; - } + @Override + protected HabitType getTaskType() { + return HabitType.todo; + } - protected class ToDoAdapter extends MyAdapter { - public ToDoAdapter(Context c, List todos) { - super(c,todos); - } + @Override + protected String getTitle() { + return ToDoFragment.TITLE; + } - @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflator = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - if (convertView == null){ - convertView = inflator.inflate(R.layout.todo, parent, false); - } - convertView.setId(position); - ToDo currentItem = (ToDo) this.getItem(position); - ImageView color_indic = (ImageView) convertView.findViewById(R.id.IV_task_color); - color_indic.setImageDrawable(getResources().getDrawable(getColorRes(currentItem.getValue()))); - CheckBox completed = (CheckBox) convertView.findViewById(R.id.plus); - completed.setOnClickListener(this.getOnClickListener()); - TextView text = (TextView) convertView.findViewById(R.id.TV_title); - text.setText(currentItem.getText()); - completed.setChecked(currentItem.isCompleted()); - convertView.setLongClickable(true); - if(isItemChecked(position)) { - convertView.setBackgroundResource(R.drawable.list_focused_holo); - } else { - convertView.setBackgroundResource(R.drawable.item_background); - } + @Override + protected List filterData(List items) { + List res = new ArrayList(); + for (HabitItem it : items) { + if (it instanceof ToDo) { + if (((ToDo) it).isCompleted()) { - return convertView; + } else { + res.add(it); + } + } + } + return res; + } - } - @Override - protected String upOrDown(View v, HabitItem h) { - boolean isChecked = ((CheckBox) v).isChecked(); - ((ToDo) h).setCompleted(isChecked); - return !isChecked ? "down" : "up"; - - } - } + protected class ToDoAdapter extends MyAdapter { + public ToDoAdapter(Context c, List todos) { + super(c, todos); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + LayoutInflater inflator = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + if (convertView == null) { + convertView = inflator.inflate(R.layout.todo, parent, false); + } + convertView.setId(position); + ToDo currentItem = (ToDo) this.getItem(position); + ImageView color_indic = (ImageView) convertView.findViewById(R.id.IV_task_color); + color_indic.setImageDrawable(getResources().getDrawable(getColorRes(currentItem.getValue()))); + CheckBox completed = (CheckBox) convertView.findViewById(R.id.plus); + completed.setOnClickListener(this.getOnClickListener()); + TextView text = (TextView) convertView.findViewById(R.id.TV_title); + text.setText(currentItem.getText()); + completed.setChecked(currentItem.isCompleted()); + convertView.setLongClickable(true); + + ImageButton checklist = (ImageButton) convertView.findViewById(R.id.BT_checklist); + + List items =currentItem.getItems(); + + + if (items != null && !items.isEmpty()) { + checklist.setVisibility(View.VISIBLE); + checklist.setOnClickListener(openChecklist); + } else { + checklist.setVisibility(View.GONE); + } + + + if (isItemChecked(position)) { + convertView.setBackgroundResource(R.drawable.list_focused_holo); + } else { + convertView.setBackgroundResource(R.drawable.item_background); + } + + return convertView; + + } + + @Override + protected String upOrDown(View v, HabitItem h) { + boolean isChecked = ((CheckBox) v).isChecked(); + ((ToDo) h).setCompleted(isChecked); + return !isChecked ? "down" : "up"; + + } + + private View.OnClickListener openChecklist = new View.OnClickListener() { + @Override + + public void onClick(View v) { + + if (v.getParent() != null && v.getParent().getParent() != null) { + + int position = ((View) v.getParent().getParent()).getId(); + + ChecklistDialog dialog = new ChecklistDialog(getActivity(), mAPIHelper, (ToDo) getItem(position), null); + + dialog.show(); + } + } + }; + } } diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Checklist.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Checklist.java index 79bad8536..a2d0b4571 100644 --- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Checklist.java +++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/tasks/Checklist.java @@ -26,6 +26,12 @@ public abstract class Checklist extends HabitItem{ } } + public void addItems(Checklist list){ + for (ChecklistItem l : list.getItems()) + { + this.checklist.add(l); + } + } public void addItem(ChecklistItem item) { this.checklist.add(item);