From c57d2219adac7e47af27f0eb887189449180b086 Mon Sep 17 00:00:00 2001 From: Negue Date: Sat, 27 Jun 2015 20:22:38 +0200 Subject: [PATCH] Port Checklist Feature --- .../res/drawable-hdpi/ic_action_delete.png | Bin 0 -> 160 bytes Habitica/res/drawable-hdpi/ic_action_list.png | Bin 0 -> 126 bytes .../res/drawable-mdpi/ic_action_delete.png | Bin 0 -> 112 bytes Habitica/res/drawable-mdpi/ic_action_list.png | Bin 0 -> 116 bytes .../res/drawable-xhdpi/ic_action_delete.png | Bin 0 -> 156 bytes .../res/drawable-xhdpi/ic_action_list.png | Bin 0 -> 118 bytes .../res/drawable-xxhdpi/ic_action_delete.png | Bin 0 -> 201 bytes .../res/drawable-xxhdpi/ic_action_list.png | Bin 0 -> 175 bytes .../res/drawable-xxxhdpi/ic_action_delete.png | Bin 0 -> 245 bytes .../res/drawable-xxxhdpi/ic_action_list.png | Bin 0 -> 139 bytes Habitica/res/layout/add_task_dialog.xml | 204 +++---- Habitica/res/layout/checklist_dialog.xml | 47 ++ .../res/layout/checklist_dialog_list_item.xml | 46 ++ .../res/layout/custom_list_preference_row.xml | 35 +- Habitica/res/layout/todo.xml | 17 +- Habitica/res/values/strings.xml | 189 ++++--- .../android/habitica/AddTaskDialog.java | 496 ++++++++++-------- .../android/habitica/ChecklistDialog.java | 211 ++++++++ .../android/habitica/MainActivity.java | 12 +- .../habitica/ui/fragments/CardFragment.java | 2 +- .../habitica/ui/fragments/DailyFragment.java | 29 + .../habitica/ui/fragments/ToDoFragment.java | 171 +++--- .../lib/models/tasks/Checklist.java | 6 + 23 files changed, 959 insertions(+), 506 deletions(-) create mode 100644 Habitica/res/drawable-hdpi/ic_action_delete.png create mode 100644 Habitica/res/drawable-hdpi/ic_action_list.png create mode 100644 Habitica/res/drawable-mdpi/ic_action_delete.png create mode 100644 Habitica/res/drawable-mdpi/ic_action_list.png create mode 100644 Habitica/res/drawable-xhdpi/ic_action_delete.png create mode 100644 Habitica/res/drawable-xhdpi/ic_action_list.png create mode 100644 Habitica/res/drawable-xxhdpi/ic_action_delete.png create mode 100644 Habitica/res/drawable-xxhdpi/ic_action_list.png create mode 100644 Habitica/res/drawable-xxxhdpi/ic_action_delete.png create mode 100644 Habitica/res/drawable-xxxhdpi/ic_action_list.png create mode 100644 Habitica/res/layout/checklist_dialog.xml create mode 100644 Habitica/res/layout/checklist_dialog_list_item.xml create mode 100644 Habitica/src/com/habitrpg/android/habitica/ChecklistDialog.java 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 0000000000000000000000000000000000000000..eec14f009a0cff5693eac90425c72e361118508a GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K8x~Gd{NX4z>1PRtD418@|ZEPwL zj3SDsXUOvWzxaUfQE%3P3q9OsJf_VnxTHE7To{vV%(5=5a9qsRD`m2T=a>718T*e& zmh>%fOz$v0(e{u#F4@j7LNNNzX@e(^b-sO;T;d*W{DhG~R^h;>n2Zy_Kr0zMUHx3v IIVCg!000Ix9smFU literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8fe7ee3cd60e85949922bbcc9499fb696292d3d6 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^W+2SL0wmRZ7KH&RS5FtmkcwMxFE8X}P~c%X(05_t zuKz&^1uU0Yc*@^r-TR`<@Sw3L>g3x?-t$gt9rMba9_MxQ>89oUO@Y!|1Cy_u>XB;D Z_i@X6lJnE)mMG9b22WQ%mvv4FO#qc1Es_8L literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f5f473fd1d46d407b3de4fa802097212068e4a1a GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1b59q?kcwN$2@*^WjSm?Q*K5=; zJbB3Y|D(gJ3fjbQL} L^>bP0l+XkKGSDch literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..86018ee4c114f8322ba8203c5b5d99500003c385 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;wWo_?NX4z>1PRu~2^GxjZEOl9 z4oSkyvIe|a2|xH-cs+8G5}0{;7tOlvmYi#H4M;3Gc1uHo^$9ZrYuxo(C&`a@fW|O* My85}Sb4q9e0Iew=t^fc4 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1e207672ccdce9eac3a4657dd47b3be2100c1d2f GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DWKS2zkcwMxuQ_rxCJ~4QQ+xaHjvJRbkAg$P z3--Nv)eMYGEF1zr9x~&L=7pq(XY2yf8BOg1av7)E1+4mLv^@OLo{;BKdPPRxKiY&Y nHPd_cF*NT{x~h`WqT;m@bD0n9fAzEs=r#sVS3j3^P6 z`^F-liZe1=MGF7-#{KPn_&>{JfB&)H8G9f^Q=kFY3O0sASJV`q?A#{Dl zI&?2JORYQ>!P@3m!n~>Qy~{rfwda1!?*-D7R6Hkbajn&npZ9P7b8}CP+4p4@*8Jn= z@P5h+G>YMZm_yLq(>x$1esF>B!Az_F6ZvNZF(%tRn8aoAjG51H`Puo4ySaEX8-hbJ z<+o4ydHsg#6(t_&{~n)zeO-OF{(fumo$KlEf43LMtj`mlq~fXdj&-?fMb(4gjXy!Q NdAj!}F~=@(uriAN7$EGYmp`a~EE$km)@RCISt( c*z6e?yc9Uy(oDSf0JSrCy85}Sb4q9e0ExaQNdN!< literal 0 HcmV?d00001 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);