First working task creating/update form

This commit is contained in:
Phillip Thelen 2015-08-03 15:51:04 +02:00
parent 73f8c596d3
commit bbe80a30c4
14 changed files with 395 additions and 45 deletions

View file

@ -139,30 +139,29 @@
</RelativeLayout>
<RelativeLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="72dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/negative_habit_form"
android:id="@+id/textView8"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginTop="11dp" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/task_negative_checkbox"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginTop="0dp" />
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="72dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/negative_habit_form"
android:id="@+id/textView8"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginTop="11dp" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/task_negative_checkbox"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginTop="0dp" />
</RelativeLayout>
</LinearLayout>
<LinearLayout
@ -182,5 +181,35 @@
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/task_weekdays_wrapper"
android:layout_marginTop="@dimen/abc_action_bar_content_inset_material" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/frequency"
android:id="@+id/textView10" />
<Spinner
android:layout_width="match_parent"
android:layout_height="72dp"
android:id="@+id/task_frequency_spinner" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/task_frequency_container"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="72dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/label"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginTop="11dp" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkbox"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginTop="0dp" />
</RelativeLayout>

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="72dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/label"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginTop="11dp" />
<NumberPicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/numberPicker"
android:layout_toRightOf="@id/label"
android:layout_toEndOf="@id/label"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>

View file

@ -124,6 +124,10 @@
<string name="notes">Notes</string>
<string name="text">Text</string>
<string name="difficulty">Difficulty</string>
<string name="trivial">Trivial</string>
<string name="easy">Easy</string>
<string name="medium">Medium</string>
<string name="hard">Hard</string>
<string name="start_date">Start Date</string>
<string name="positive_habit_form">Positive ( + )</string>
<string name="negative_habit_form">Negative ( - )</string>
@ -131,4 +135,16 @@
<string name="actions">Actions</string>
<string name="task">Task</string>
<string name="frequency">Frequency</string>
<string name="frequency_weekly">On Certain Days of the Week</string>
<string name="frequency_daily">Every X Days</string>
<string name="monday">Monday</string>
<string name="tuesday">Tuesday</string>
<string name="wednesday">Wednesday</string>
<string name="thursday">Thursday</string>
<string name="friday">Friday</string>
<string name="saturday">Saturday</string>
<string name="sunday">Sunday</string>
</resources>

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="task_difficulties">
<item>Trivial</item>
<item>Easy</item>
<item>Medium</item>
<item>Hard</item>
</string-array>
</resources>

View file

@ -7,4 +7,26 @@
<string-array name="prefs_items_values">
<item>https://habitrpg.com/</item>
</string-array>
<string-array name="task_difficulties">
<item>@string/trivial</item>
<item>@string/easy</item>
<item>@string/medium</item>
<item>@string/hard</item>
</string-array>
<string-array name="daily_frequencies">
<item>@string/frequency_weekly</item>
<item>@string/frequency_daily</item>
</string-array>
<string-array name="weekdays">
<item>@string/monday</item>
<item>@string/tuesday</item>
<item>@string/wednesday</item>
<item>@string/thursday</item>
<item>@string/friday</item>
<item>@string/saturday</item>
<item>@string/sunday</item>
</string-array>
</resources>

View file

@ -123,7 +123,7 @@ public class APIHelper implements ErrorHandler, Profiler {
};
public void createUndefNewTask(HabitItem item, Callback cb) {
public void createNewTask(HabitItem item, Callback cb) {
if(item instanceof Habit) {
createNewTask((Habit) item, cb);
} else if(item instanceof Daily) {
@ -175,6 +175,19 @@ public class APIHelper implements ErrorHandler, Profiler {
public void deleteTask(HabitItem item, TaskDeletionCallback cb) {
this.apiService.deleteTask(item.getId(), cb);
}
public void updateTask(HabitItem item, Callback cb) {
if(item instanceof Habit) {
updateTask((Habit) item, cb);
} else if(item instanceof Daily) {
updateTask((Daily) item, cb);
} else if(item instanceof ToDo) {
updateTask((ToDo) item, cb);
} else if(item instanceof Reward) {
updateTask((Reward) item, cb);
}
}
public void updateTask(Daily item, Callback<Daily> cb) {
this.apiService.updateTask(item.getId(), item, cb);
}

View file

@ -75,6 +75,8 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
Callback<List<ItemData>> {
static final int SETTINGS = 11;
static final int ABOUT = 12;
static final int TASK_CREATED_RESULT = 1;
static final int TASK_UPDATED_RESULT = 2;
//region View Elements
@InjectView(R.id.materialViewPager)
@ -289,7 +291,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
Intent intent = new Intent(this, TaskFormActivity.class);
intent.putExtras(bundle);
startActivity(intent);
startActivityForResult(intent, TASK_UPDATED_RESULT);
}
public void onEvent(TaskLongPressedEvent event) {
@ -310,7 +312,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
Intent intent = new Intent(this, TaskFormActivity.class);
intent.putExtras(bundle);
startActivity(intent);
startActivityForResult(intent, TASK_CREATED_RESULT);
}
public void onEvent(final BuyRewardTappedEvent event) {
@ -361,6 +363,15 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
}
}
public void onEvent(final TaskSaveEvent event) {
HabitItem task = (HabitItem) event.task;
if (event.created) {
this.mAPIHelper.createNewTask(task, new TaskCreationCallback(this));
} else {
this.mAPIHelper.updateTask(task, new TaskUpdateCallback(this));
}
}
private void notifyUser(double xp, double hp, double gold,
double lvl, double delta) {
StringBuilder message = new StringBuilder();
@ -690,7 +701,7 @@ public class MainActivity extends InstabugAppCompatActivity implements HabitRPGU
@Override
public void onTaskCreation(HabitItem task, boolean editMode) {
if (!editMode) {
this.mAPIHelper.createUndefNewTask(task, new TaskCreationCallback(this));
this.mAPIHelper.createNewTask(task, new TaskCreationCallback(this));
} else {
this.mAPIHelper.uprateUndefinedTask(task, new TaskUpdateCallback(this));
}

View file

@ -1,39 +1,55 @@
package com.habitrpg.android.habitica;
import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.NumberPicker;
import android.widget.Spinner;
import android.widget.TextView;
import com.habitrpg.android.habitica.R;
import com.habitrpg.android.habitica.events.TaskSaveEvent;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Daily;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Days;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Habit;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitItem;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Reward;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.ToDo;
import com.raizlabs.android.dbflow.sql.language.Select;
import java.util.ArrayList;
import java.util.List;
import de.greenrobot.event.EventBus;
import io.fabric.sdk.android.services.concurrency.Task;
import static com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType.daily;
import static com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType.habit;
import static com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType.reward;
import static com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitType.todo;
public class TaskFormActivity extends AppCompatActivity {
public class TaskFormActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
private HabitType taskType;
private String taskId;
private HabitItem task;
private EditText taskText, taskNotes;
private Spinner taskDifficulty;
private Spinner taskDifficultySpinner, dailyFrequencySpinner;
private CheckBox positiveCheckBox, negativeCheckBox;
private List<CheckBox> weekdayCheckboxes = new ArrayList<CheckBox>();
private NumberPicker frequencyPicker;
private LinearLayout frequencyContainer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -54,12 +70,12 @@ public class TaskFormActivity extends AppCompatActivity {
LinearLayout mainWrapper = (LinearLayout) findViewById(R.id.task_main_wrapper);
taskText = (EditText) findViewById(R.id.task_text_edittext);
taskNotes = (EditText) findViewById(R.id.task_notes_edittext);
taskDifficulty = (Spinner) findViewById(R.id.task_difficulty_spinner);
taskDifficultySpinner = (Spinner) findViewById(R.id.task_difficulty_spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.task_difficulties, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
taskDifficulty.setAdapter(adapter);
taskDifficultySpinner.setAdapter(adapter);
if (taskType == habit) {
LinearLayout startDateLayout = (LinearLayout) findViewById(R.id.task_startdate_layout);
@ -78,24 +94,82 @@ public class TaskFormActivity extends AppCompatActivity {
mainWrapper.removeView(actionsLayout);
}
LinearLayout weekdayWrapper = (LinearLayout)findViewById(R.id.task_weekdays_wrapper);
if (taskType == daily) {
this.dailyFrequencySpinner = (Spinner) weekdayWrapper.findViewById(R.id.task_frequency_spinner);
ArrayAdapter<CharSequence> frequencyAdapter = ArrayAdapter.createFromResource(this,
R.array.daily_frequencies, android.R.layout.simple_spinner_item);
frequencyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
this.dailyFrequencySpinner.setAdapter(frequencyAdapter);
this.dailyFrequencySpinner.setOnItemSelectedListener(this);
this.frequencyContainer = (LinearLayout) weekdayWrapper.findViewById(R.id.task_frequency_container);
} else {
mainWrapper.removeView(weekdayWrapper);
}
if (taskId != null) {
switch (taskType) {
case todo:
ToDo todo = new Select().from(ToDo.class).byIds(taskId).querySingle();
this.task = todo;
this.populate(todo);
break;
case daily:
Daily daily = new Select().from(Daily.class).byIds(taskId).querySingle();
this.task = daily;
this.populate(daily);
break;
case habit:
Habit habit = new Select().from(Habit.class).byIds(taskId).querySingle();
this.task = habit;
this.populate(habit);
break;
}
}
}
private void setDailyFrequencyViews() {
this.frequencyContainer.removeAllViews();
if (this.dailyFrequencySpinner.getSelectedItemPosition() == 0) {
String[] weekdays = getResources().getStringArray(R.array.weekdays);
for (int i = 0; i < 7; i++) {
View weekdayRow = getLayoutInflater().inflate(R.layout.row_checklist, null);
TextView tv = (TextView) weekdayRow.findViewById(R.id.label);
CheckBox checkbox = (CheckBox) weekdayRow.findViewById(R.id.checkbox);
this.weekdayCheckboxes.add(checkbox);
tv.setText(weekdays[i]);
this.frequencyContainer.addView(weekdayRow);
}
} else {
View dayRow = getLayoutInflater().inflate(R.layout.row_number_picker, null);
this.frequencyPicker = (NumberPicker) dayRow.findViewById(R.id.numberPicker);
this.frequencyPicker.setMinValue(1);
this.frequencyPicker.setMaxValue(366);
TextView tv = (TextView) dayRow.findViewById(R.id.label);
tv.setText(getResources().getString(R.string.frequency_daily));
this.frequencyContainer.addView(dayRow);
}
if (this.task != null) {
Daily daily = (Daily) this.task;
if (this.dailyFrequencySpinner.getSelectedItemPosition() == 0) {
this.weekdayCheckboxes.get(0).setChecked(daily.getRepeat().getM());
this.weekdayCheckboxes.get(1).setChecked(daily.getRepeat().getT());
this.weekdayCheckboxes.get(2).setChecked(daily.getRepeat().getW());
this.weekdayCheckboxes.get(3).setChecked(daily.getRepeat().getTh());
this.weekdayCheckboxes.get(4).setChecked(daily.getRepeat().getF());
this.weekdayCheckboxes.get(5).setChecked(daily.getRepeat().getS());
this.weekdayCheckboxes.get(6).setChecked(daily.getRepeat().getSu());
} else {
this.frequencyPicker.setValue(daily.getEveryX());
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
@ -122,6 +196,16 @@ public class TaskFormActivity extends AppCompatActivity {
private void populate(HabitItem task) {
taskText.setText(task.text);
taskNotes.setText(task.notes);
float priority = task.getPriority();
if (priority == 0.1) {
this.taskDifficultySpinner.setSelection(0);
} else if (priority == 1.0) {
this.taskDifficultySpinner.setSelection(1);
} else if (priority == 1.5) {
this.taskDifficultySpinner.setSelection(2);
} else if (priority == 2.0) {
this.taskDifficultySpinner.setSelection(3);
}
}
private void populate(Habit task) {
@ -132,9 +216,113 @@ public class TaskFormActivity extends AppCompatActivity {
private void populate(Daily task) {
populate((HabitItem) task);
if (task.getFrequency().equals("weekly")) {
this.dailyFrequencySpinner.setSelection(0);
if (weekdayCheckboxes.size() == 7) {
this.weekdayCheckboxes.get(0).setChecked(task.getRepeat().getM());
this.weekdayCheckboxes.get(1).setChecked(task.getRepeat().getT());
this.weekdayCheckboxes.get(2).setChecked(task.getRepeat().getW());
this.weekdayCheckboxes.get(3).setChecked(task.getRepeat().getTh());
this.weekdayCheckboxes.get(4).setChecked(task.getRepeat().getF());
this.weekdayCheckboxes.get(5).setChecked(task.getRepeat().getS());
this.weekdayCheckboxes.get(6).setChecked(task.getRepeat().getSu());
}
} else {
this.dailyFrequencySpinner.setSelection(1);
if (this.frequencyPicker != null) {
this.frequencyPicker.setValue(task.getEveryX());
}
}
}
private void populate(ToDo task) {
populate((HabitItem) task);
}
private void saveTask(HabitItem task) {
task.text = taskText.getText().toString();
task.notes = taskNotes.getText().toString();
if (this.taskDifficultySpinner.getSelectedItemPosition() == 0) {
task.setPriority((float) 0.1);
} else if (this.taskDifficultySpinner.getSelectedItemPosition() == 1) {
task.setPriority((float) 1.0);
} else if (this.taskDifficultySpinner.getSelectedItemPosition() == 2) {
task.setPriority((float) 1.5);
} else if (this.taskDifficultySpinner.getSelectedItemPosition() == 3) {
task.setPriority((float) 2.0);
}
}
private void saveTask(Habit task) {
task.setUp(positiveCheckBox.isChecked());
task.setDown(negativeCheckBox.isChecked());
this.saveTask((HabitItem) task);
}
private void saveTask(Daily task) {
if (this.dailyFrequencySpinner.getSelectedItemPosition() == 0) {
task.setFrequency("weekly");
task.getRepeat().setM(this.weekdayCheckboxes.get(0).isChecked());
task.getRepeat().setT(this.weekdayCheckboxes.get(1).isChecked());
task.getRepeat().setW(this.weekdayCheckboxes.get(2).isChecked());
task.getRepeat().setTh(this.weekdayCheckboxes.get(3).isChecked());
task.getRepeat().setF(this.weekdayCheckboxes.get(4).isChecked());
task.getRepeat().setS(this.weekdayCheckboxes.get(5).isChecked());
task.getRepeat().setSu(this.weekdayCheckboxes.get(6).isChecked());
} else {
task.setFrequency("daily");
task.setEveryX(this.frequencyPicker.getValue());
}
this.saveTask((HabitItem) task);
}
private void saveTask(ToDo task) {
this.saveTask((HabitItem) task);
}
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
this.setDailyFrequencyViews();
}
public void onNothingSelected(AdapterView<?> parent) {
this.setDailyFrequencyViews();
}
private void prepareSave() {
TaskSaveEvent event = new TaskSaveEvent();
if (this.task == null) {
event.created = true;
switch (taskType) {
case todo:
this.task = new ToDo();
break;
case daily:
this.task = new Daily();
break;
case habit:
this.task = new Habit();
break;
}
}
this.saveTask(this.task);
event.task = this.task;
EventBus.getDefault().post(event);
}
@Override
public boolean onSupportNavigateUp() {
this.prepareSave();
return super.onSupportNavigateUp();
}
@Override
public void onBackPressed() {
this.prepareSave();
super.onBackPressed();
}
}

View file

@ -18,6 +18,9 @@ public class TaskCreationCallback implements Callback<HabitItem> {
public TaskCreationCallback(OnHabitCreated cb) {
callback = cb;
}
@Override
public void success(HabitItem habit, Response response) {
callback.onTaskCreated(habit);

View file

@ -0,0 +1,12 @@
package com.habitrpg.android.habitica.events;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.HabitItem;
/**
* Created by viirus on 03/08/15.
*/
public class TaskSaveEvent {
public HabitItem task;
public boolean created;
}

View file

@ -112,7 +112,7 @@ public class TaskRecyclerViewFragment extends Fragment implements View.OnClickLi
@Override
public void onClick(View v) {
AddTaskTappedEvent event = new AddTaskTappedEvent();
event.ClassType = classType;
event.ClassType = this.classType;
EventBus.getDefault().post(event);
}

View file

@ -12,6 +12,7 @@ import com.raizlabs.android.dbflow.sql.builder.Condition;
import com.raizlabs.android.dbflow.sql.language.Select;
import com.raizlabs.android.dbflow.structure.BaseModel;
import java.util.Date;
import java.util.List;
/**
@ -25,6 +26,12 @@ public class Daily extends Checklist{
@Column
private Boolean completed;
@Column
private String frequency;
@Column
private Integer everyX;
@Column
@ForeignKey(references = {@ForeignKeyReference(columnName = "days_id",
columnType = Long.class,
@ -58,11 +65,11 @@ public class Daily extends Checklist{
}
public Daily(String id, String notes, Float priority, String text,
Double value, Boolean completed, Days repeat) {
this(id, notes, priority, text, value,completed,repeat,null,null);
this(id, notes, priority, text, value, completed, repeat, null, null);
}
public Daily() {
this(null,null,null,null,null,null,null);
this(null, null, null, null, null, null, null);
}
/**
@ -78,6 +85,13 @@ public class Daily extends Checklist{
public void setCompleted(Boolean completed) {
this.completed = completed;
}
public String getFrequency() { return frequency; }
public void setFrequency(String frequency) { this.frequency = frequency; }
public Integer getEveryX() { return everyX; }
public void setEveryX(Integer everyX) { this.everyX = everyX; }
/**
* @return the repeat array.<br/>
* This array contains 7 values, one for each days, starting from monday.

View file

@ -8,6 +8,8 @@ import com.raizlabs.android.dbflow.structure.BaseModel;
import org.json.JSONObject;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
@ -15,7 +17,7 @@ import java.util.List;
* @author MagicMicky
*
*/
public abstract class HabitItem extends BaseModel {
public abstract class HabitItem extends BaseModel implements Serializable {
private String _id;
@Column
@ -124,7 +126,7 @@ public abstract class HabitItem extends BaseModel {
public void setValue(double value) {
this.setValue(Double.valueOf(value));
}
/**
* @return the tags
*/