Begin building new task form

This commit is contained in:
Phillip Thelen 2019-03-28 14:45:16 +01:00
parent dddfd57705
commit b84657007e
27 changed files with 1318 additions and 414 deletions

View file

@ -110,6 +110,15 @@
android:name=".ui.activities.AboutActivity"
android:theme="@style/AppThemeWithActionBarBlackText"
android:screenOrientation="portrait"/>
<activity
android:name=".ui.activities.TaskFormActivity"
android:parentActivityName=".ui.activities.MainActivity"
android:screenOrientation="portrait"
tools:ignore="UnusedAttribute">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.activities.MainActivity" />
</activity>
<activity
android:name=".ui.activities.OldTaskFormActivity"
android:theme="@style/AppThemeWithActionBarBlackText"

View file

@ -64,7 +64,7 @@ dependencies {
compileOnly 'javax.annotation:javax.annotation-api:1.3.2'
//App Compatibility and Material Design
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'com.google.android.material:material:1.1.0-alpha04'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
//QR Code
@ -134,8 +134,8 @@ dependencies {
implementation 'androidx.core:core-ktx:1.0.1'
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
kapt "androidx.lifecycle:lifecycle-compiler:2.0.0"
implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0-rc02'
implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0-rc02'
implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0'
implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0'
implementation 'com.plattysoft.leonids:LeonidsLib:1.3.2'
}

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android:width="32dp" android:height="32dp" />
<stroke android:width="2dp" android:color="@color/gray_500" />
</shape>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android:width="32dp" android:height="32dp" />
<solid android:color="@color/white" />
</shape>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white" />
<corners android:radius="4dp" />
</shape>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<size
android:height="@dimen/spacing_medium"
android:width="0dp"/>
</shape>

View file

@ -1,390 +1,199 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/scrollView"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/task_main_wrapper"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.habitrpg.android.habitica.ui.activities.FixCharacterValuesActivity"
android:background="@color/white">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:theme="@style/Toolbar"
android:background="@color/brand_300"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"/>
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:orientation="vertical"
android:padding="@dimen/abc_action_bar_content_inset_material">
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/task_task_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/abc_action_bar_content_inset_material"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/TextAppearance.AppCompat">
<com.habitrpg.android.habitica.ui.views.HabiticaAutocompleteTextView
android:id="@+id/task_text_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:hint="@string/text"
android:textColor="@android:color/black"
android:inputType="textCapSentences|textMultiLine"
android:maxLines="3"/>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/TextAppearance.AppCompat">
<com.habitrpg.android.habitica.ui.views.HabiticaAutocompleteTextView
android:id="@+id/task_notes_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:hint="@string/notes"
android:textColor="@android:color/black"
android:inputType="textCapSentences|textMultiLine" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/task_value_layout"
android:layout_width="match_parent"
android:layout_height="72dp"
app:hintTextAppearance="@style/TextAppearance.AppCompat">
<EditText
android:id="@+id/task_value_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:hint="@string/task_value"
android:textColor="@android:color/black"
android:inputType="numberDecimal" />
</com.google.android.material.textfield.TextInputLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/task_difficulty_wrapper">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/difficulty"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Spinner
android:id="@+id/task_difficulty_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="20dp"
android:id="@+id/task_attribute_wrapper">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/attributes"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Spinner
android:id="@+id/task_attribute_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/task_reset_frequency_wrapper"
android:layout_marginTop="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/reset_streak"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Spinner
android:id="@+id/task_reset_frequency_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/task_actions_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/actions"
android:textAppearance="?android:attr/textAppearanceLarge" />
<CheckBox
android:id="@+id/task_positive_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="11dp"
android:text="@string/positive_habit_form"
android:textAppearance="?android:attr/textAppearanceMedium" />
<CheckBox
android:id="@+id/task_negative_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="11dp"
android:text="@string/negative_habit_form"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
<LinearLayout
android:id="@+id/task_checklist_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/checklist"
android:textAppearance="?android:attr/textAppearanceLarge" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/checklist_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageButton
android:id="@+id/emoji.toggle.btn2"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/ic_emoticon_grey600_24dp"
android:background="@drawable/md_transparent"
android:contentDescription="Toogle Emoji" />
<com.habitrpg.android.habitica.ui.views.HabiticaAutocompleteTextView
android:id="@+id/new_checklist"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/new_checklist_item"
android:inputType="textCapSentences" />
<Button
android:id="@+id/add_checklist_button"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/add_checklist_item" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/task_duedate_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:orientation="vertical">
<include layout="@layout/tasks_duedate" />
</LinearLayout>
<LinearLayout
android:id="@+id/repeatables"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/frequency"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/start_date"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/repeatables_startdate_text_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:hint="@string/start_date"
android:textColor="@android:color/black"
android:focusable="false" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repeatables_title"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Spinner
android:id="@+id/task_repeatables_frequency_spinner"
android:layout_width="match_parent"
android:layout_height="72dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repeatables_on_title"
android:id="@+id/repeatables_on_title"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Spinner
android:id="@+id/task_repeatables_on_spinner"
android:layout_width="match_parent"
android:layout_height="72dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repeatEvery"
android:textAppearance="?android:attr/textAppearanceMedium" />
<NumberPicker
android:id="@+id/task_repeatables_every_x_spinner"
android:layout_width="match_parent"
android:layout_height="72dp" />
<LinearLayout
android:id="@+id/task_repeatables_frequency_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:id="@+id/summaryTitle"
android:text="@string/repeatables_summary_title"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:id="@+id/summary"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<LinearLayout
android:id="@+id/task_reminders_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/reminders"
android:textAppearance="?android:attr/textAppearanceLarge" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/reminders_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/new_reminder_edittext"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:hint="@string/add_reminder"
android:textColor="@android:color/black"
android:focusable="false" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="20dp"
android:id="@+id/task_tags_wrapper">
<TextView
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:paddingBottom="@dimen/spacing_large">
<LinearLayout
android:id="@+id/upper_text_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/tags"
android:textAppearance="?android:attr/textAppearanceLarge" />
tools:background="@color/brand_300"
android:orientation="vertical"
android:paddingStart="@dimen/spacing_large"
android:paddingEnd="@dimen/spacing_large"
android:paddingBottom="@dimen/spacing_large">
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TaskFormTextInputLayoutAppearance">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/text_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/task_title"/>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
style="@style/TaskFormTextInputLayoutAppearance"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/notes_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/notes"
android:minLines="3"
android:gravity="top"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/task_tags_checklist">
android:layout_marginStart="@dimen/spacing_large"
android:layout_marginEnd="@dimen/spacing_large">
<com.habitrpg.android.habitica.ui.views.tasks.form.HabitScoringButtonsView
android:id="@+id/habit_scoring_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/difficulty"
style="@style/TaskFormSectionheader"/>
<com.habitrpg.android.habitica.ui.views.tasks.form.TaskDifficultyButtons
android:id="@+id/task_difficulty_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/habit_reset_streak_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/reset_streak"
style="@style/TaskFormSectionheader"/>
<com.habitrpg.android.habitica.ui.views.tasks.form.HabitResetStreakButtons
android:id="@+id/habit_reset_streak_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/adjust_streak_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/adjust_streak"
style="@style/TaskFormSectionheader"/>
<LinearLayout
android:id="@+id/adjust_streak_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputLayout
style="@style/TextInputLayoutAppearance"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/habit_adjust_positive_streak"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/positive_habit_form"
android:inputType="number" />
</com.google.android.material.textfield.TextInputLayout>
<Space
android:layout_width="22dp"
android:layout_height="wrap_content" />
<com.google.android.material.textfield.TextInputLayout
style="@style/TextInputLayoutAppearance"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/habit_adjust_negative_streak"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/negative_habit_form"
android:inputType="number"/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/stat_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/assigned_stat"
style="@style/TaskFormSectionheader"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/spacing_large">
<TextView
android:id="@+id/stat_strength_button"
style="@style/TaskFormToggle"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/strength"
android:layout_marginRight="@dimen/spacing_large"/>
<TextView
android:id="@+id/stat_constitution_button"
style="@style/TaskFormToggle"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/constitution"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/stat_intelligence_button"
style="@style/TaskFormToggle"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/intelligence"
android:layout_marginRight="@dimen/spacing_large"/>
<TextView
android:id="@+id/stat_perception_button"
style="@style/TaskFormToggle"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="@string/perception"/>
</LinearLayout>
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/tags"
style="@style/TaskFormSectionheader"/>
<LinearLayout
android:id="@+id/tags_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:showDividers="middle"
android:divider="@drawable/tag_divider"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/task_delete_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/abc_action_bar_content_inset_material"
android:orientation="vertical">
<Button
android:id="@+id/btn.delete.task"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="@drawable/ic_action_delete_white_24"
android:drawableEnd="@drawable/ic_action_delete_white_24"
android:text="@string/action_delete"
android:textColor="@color/white" />
</LinearLayout>
</LinearLayout>
</ScrollView>
</androidx.core.widget.NestedScrollView>
</LinearLayout>

View file

@ -0,0 +1,390 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/task_main_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/abc_action_bar_content_inset_material">
<LinearLayout
android:id="@+id/task_task_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/abc_action_bar_content_inset_material"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/TextAppearance.AppCompat">
<com.habitrpg.android.habitica.ui.views.HabiticaAutocompleteTextView
android:id="@+id/task_text_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:hint="@string/text"
android:textColor="@android:color/black"
android:inputType="textCapSentences|textMultiLine"
android:maxLines="3"/>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:hintTextAppearance="@style/TextAppearance.AppCompat">
<com.habitrpg.android.habitica.ui.views.HabiticaAutocompleteTextView
android:id="@+id/task_notes_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:hint="@string/notes"
android:textColor="@android:color/black"
android:inputType="textCapSentences|textMultiLine" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/task_value_layout"
android:layout_width="match_parent"
android:layout_height="72dp"
app:hintTextAppearance="@style/TextAppearance.AppCompat">
<EditText
android:id="@+id/task_value_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:hint="@string/task_value"
android:textColor="@android:color/black"
android:inputType="numberDecimal" />
</com.google.android.material.textfield.TextInputLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/task_difficulty_wrapper">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/difficulty"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Spinner
android:id="@+id/task_difficulty_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="20dp"
android:id="@+id/task_attribute_wrapper">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/attributes"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Spinner
android:id="@+id/task_attribute_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/task_reset_frequency_wrapper"
android:layout_marginTop="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/reset_streak"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Spinner
android:id="@+id/task_reset_frequency_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/task_actions_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/actions"
android:textAppearance="?android:attr/textAppearanceLarge" />
<CheckBox
android:id="@+id/task_positive_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="11dp"
android:text="@string/positive_habit_form"
android:textAppearance="?android:attr/textAppearanceMedium" />
<CheckBox
android:id="@+id/task_negative_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="11dp"
android:text="@string/negative_habit_form"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
<LinearLayout
android:id="@+id/task_checklist_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/checklist"
android:textAppearance="?android:attr/textAppearanceLarge" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/checklist_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageButton
android:id="@+id/emoji.toggle.btn2"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/ic_emoticon_grey600_24dp"
android:background="@drawable/md_transparent"
android:contentDescription="Toogle Emoji" />
<com.habitrpg.android.habitica.ui.views.HabiticaAutocompleteTextView
android:id="@+id/new_checklist"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/new_checklist_item"
android:inputType="textCapSentences" />
<Button
android:id="@+id/add_checklist_button"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/add_checklist_item" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/task_duedate_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:orientation="vertical">
<include layout="@layout/tasks_duedate" />
</LinearLayout>
<LinearLayout
android:id="@+id/repeatables"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/frequency"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/start_date"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/repeatables_startdate_text_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:hint="@string/start_date"
android:textColor="@android:color/black"
android:focusable="false" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repeatables_title"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Spinner
android:id="@+id/task_repeatables_frequency_spinner"
android:layout_width="match_parent"
android:layout_height="72dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repeatables_on_title"
android:id="@+id/repeatables_on_title"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Spinner
android:id="@+id/task_repeatables_on_spinner"
android:layout_width="match_parent"
android:layout_height="72dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repeatEvery"
android:textAppearance="?android:attr/textAppearanceMedium" />
<NumberPicker
android:id="@+id/task_repeatables_every_x_spinner"
android:layout_width="match_parent"
android:layout_height="72dp" />
<LinearLayout
android:id="@+id/task_repeatables_frequency_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:id="@+id/summaryTitle"
android:text="@string/repeatables_summary_title"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:id="@+id/summary"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
<LinearLayout
android:id="@+id/task_reminders_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/reminders"
android:textAppearance="?android:attr/textAppearanceLarge" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/reminders_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/new_reminder_edittext"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:hint="@string/add_reminder"
android:textColor="@android:color/black"
android:focusable="false" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="20dp"
android:id="@+id/task_tags_wrapper">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tags"
android:textAppearance="?android:attr/textAppearanceLarge" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/task_tags_checklist">
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/task_delete_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/abc_action_bar_content_inset_material"
android:orientation="vertical">
<Button
android:id="@+id/btn.delete.task"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="@drawable/ic_action_delete_white_24"
android:drawableEnd="@drawable/ic_action_delete_white_24"
android:text="@string/action_delete"
android:textColor="@color/white" />
</LinearLayout>
</LinearLayout>
</ScrollView>

View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
tools:parentTag="android.widget.LinearLayout">
<LinearLayout
android:id="@+id/positive_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:layout_margin="@dimen/spacing_large">
<ImageView
android:id="@+id/positive_image_view"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginBottom="@dimen/spacing_medium"
tools:src="@drawable/plus"
tools:background="@drawable/habit_scoring_circle_selected"/>
<TextView
android:id="@+id/positive_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/positive_habit_form"/>
</LinearLayout>
<LinearLayout
android:id="@+id/negative_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:layout_margin="@dimen/spacing_large">
<ImageView
android:id="@+id/negative_image_view"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginBottom="@dimen/spacing_medium"
tools:src="@drawable/minus"
tools:background="@drawable/habit_scoring_circle"/>
<TextView
android:id="@+id/negative_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/negative_habit_form"
android:textSize="14sp"/>
</LinearLayout>
</merge>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:id="@+id/image_view"
android:layout_width="57dp"
android:layout_height="57dp"
android:background="@drawable/layout_rounded_bg_task_form"
android:scaleType="center"
android:layout_marginBottom="@dimen/spacing_medium"/>
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/trivial"/>
</LinearLayout>

View file

@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".ui.activities.OldTaskFormActivity">
xmlns:tools="http://schemas.android.com/tools">
<item android:id="@+id/private_message"
android:title="@string/profile_private_message"
android:icon="@drawable/ic_action_chat"

View file

@ -1,7 +1,6 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".ui.activities.OldTaskFormActivity">
xmlns:tools="http://schemas.android.com/tools">
<item android:id="@+id/action_send_invites" android:title="@string/invite"
android:orderInCategory="100" app:showAsAction="always" />
</menu>

View file

@ -102,8 +102,8 @@
<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>
<string name="positive_habit_form">Positive</string>
<string name="negative_habit_form">Negative</string>
<string name="checklist">Checklist</string>
<string name="reminders">Reminders</string>
<string name="actions">Actions</string>
@ -866,8 +866,13 @@
<string name="only_leader_create_challenge">Only leader can create Challenges</string>
<string name="create_party">Create Party</string>
<string name="add_local_authentication">Add Local Authentication</string>
<string name="task_title">Task Title</string>
<string name="old_password">Old Password</string>
<string name="new_password">New Password</string>
<string name="new_password_repeat">Repeat new Password</string>
<string name="adjust_streak">Adjust Streak</string>
<string name="assigned_stat">Assigned Stat</string>
<string name="monthly">Monthly</string>
<string name="weekly">Weekly</string>
</resources>

View file

@ -33,9 +33,14 @@
<item name="windowNoTitle">false</item>
</style>
<style name="AppTheme.ActionBar.Transparent">
<style name="AppTheme.ActionBar.Transparent" parent="AppTheme.ActionBar">
<item name="actionBarStyle">@style/ActionBarTransparent</item>
</style>
<style name="ActionBarTransparent">
<item name="android:background">@color/transparent</item>
</style>
<style name="AppTheme.NoActionBar" parent="AppTheme">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
@ -470,4 +475,48 @@
<style name="BB_BottomBarBadge_Text" parent="TextAppearance.AppCompat.Body2">
<item name="android:textColor">#FFFFFF</item>
</style>
<style name="ErrorText" parent="TextAppearance.AppCompat">
<item name="android:textColor">@color/red_100</item>
<item name="android:textSize">16sp</item>
</style>
<style name="HintText" parent="TextAppearance.AppCompat">
<item name="android:textColor">@color/white</item>
<item name="android:textSize">14sp</item>
</style>
<style name="TaskFormTextInputLayoutAppearance" parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
<!-- reference our hint & error styles -->
<item name="boxBackgroundColor">@color/white_50_alpha</item>
<item name="android:textColor">@color/textColorLight</item>
<item name="android:textColorHint">@color/textColorLight</item>
<item name="colorControlNormal">@color/white</item>
</style>
<style name="TextInputLayoutAppearance" parent="Widget.MaterialComponents.TextInputLayout.FilledBox">
<!-- reference our hint & error styles -->
<item name="android:gravity">top</item>
<item name="boxBackgroundColor">@color/taskform_gray</item>
<item name="android:textColor">@color/textColorLight</item>
<item name="android:textColorHint">@color/gray_300</item>
<item name="colorControlNormal">@color/white</item>
</style>
<style name="TaskFormSectionheader">
<item name="android:textSize">16sp</item>
<item name="android:textColor">@color/gray_10</item>
<item name="android:layout_marginTop">@dimen/spacing_large</item>
<item name="android:layout_marginBottom">@dimen/spacing_medium</item>
</style>
<style name="TaskFormToggle">
<item name="android:background">@drawable/layout_rounded_bg_white</item>
<item name="android:gravity">center</item>
<item name="android:paddingTop">@dimen/spacing_small</item>
<item name="android:paddingBottom">@dimen/spacing_small</item>
<item name="android:height">28dp</item>
</style>
<color name="taskform_gray">#99edecee</color>
</resources>

View file

@ -34,6 +34,7 @@ import com.habitrpg.android.habitica.ui.activities.SetupActivity;
import com.habitrpg.android.habitica.ui.activities.SkillMemberActivity;
import com.habitrpg.android.habitica.ui.activities.SkillTasksActivity;
import com.habitrpg.android.habitica.ui.activities.OldTaskFormActivity;
import com.habitrpg.android.habitica.ui.activities.TaskFormActivity;
import com.habitrpg.android.habitica.ui.activities.VerifyUsernameActivity;
import com.habitrpg.android.habitica.ui.adapter.social.challenges.ChallengeTasksRecyclerViewAdapter;
import com.habitrpg.android.habitica.ui.adapter.tasks.DailiesRecyclerViewHolder;
@ -311,4 +312,6 @@ public interface AppComponent {
void inject(@NotNull AboutFragment aboutFragment);
void inject(@NotNull ChatBarView chatBarView);
void inject(@NotNull TaskFormActivity taskFormActivity);
}

View file

@ -8,6 +8,7 @@ import io.realm.RealmResults
interface TagRepository : BaseRepository {
fun getTags(): Flowable<RealmResults<Tag>>
fun getTags(userId: String): Flowable<RealmResults<Tag>>
fun createTag(tag: Tag): Flowable<Tag>

View file

@ -11,6 +11,10 @@ import io.realm.RealmResults
class TagRepositoryImpl(localRepository: TagLocalRepository, apiClient: ApiClient, userID: String) : BaseRepositoryImpl<TagLocalRepository>(localRepository, apiClient, userID), TagRepository {
override fun getTags(): Flowable<RealmResults<Tag>> {
return getTags(userID)
}
override fun getTags(userId: String): Flowable<RealmResults<Tag>> {
return localRepository.getTags(userId)
}

View file

@ -140,29 +140,6 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
return Flowable.empty()
}
lastTaskAction = now
task.tags?.let {
if (it.size > 0) {
val tags = RealmList<Tag>()
tags.addAll(localRepository.getUnmanagedCopy(it))
task.tags = tags
}
}
task.checklist?.let {
if (it.size > 0) {
val checklist = RealmList<ChecklistItem>()
checklist.addAll(localRepository.getUnmanagedCopy(it))
task.checklist = checklist
}
}
task.reminders?.let {
if (it.size > 0) {
val reminders = RealmList<RemindersItem>()
reminders.addAll(localRepository.getUnmanagedCopy(it))
task.reminders = reminders
}
}
task.isSaving = true
task.isCreating = true

View file

@ -0,0 +1,11 @@
package com.habitrpg.android.habitica.extensions
import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
fun Bitmap.asDrawable(resources: Resources): Drawable {
return BitmapDrawable(resources, this)
}

View file

@ -0,0 +1,10 @@
package com.habitrpg.android.habitica.models.tasks
import androidx.annotation.StringRes
import com.habitrpg.android.habitica.R
enum class HabitResetOption(val value: String, @StringRes val nameRes: Int) {
DAILY("daily", R.string.daily),
WEEKLY("weekly", R.string.weekly),
MONTHLY("monthly", R.string.monthly)
}

View file

@ -0,0 +1,10 @@
package com.habitrpg.android.habitica.models.tasks
import com.habitrpg.android.habitica.R
enum class TaskDifficulty(val value: Float, val nameRes: Int) {
TRIVIAL(0.1f, R.string.trivial),
EASY(1f, R.string.easy),
MEDIUM(1.5f, R.string.medium),
HARD(2f, R.string.hard)
}

View file

@ -0,0 +1,298 @@
package com.habitrpg.android.habitica.ui.activities
import android.content.Context
import android.os.Bundle
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
import android.widget.EditText
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.TagRepository
import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.Tag
import com.habitrpg.android.habitica.models.tasks.HabitResetOption
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.views.tasks.form.HabitResetStreakButtons
import com.habitrpg.android.habitica.ui.views.tasks.form.HabitScoringButtonsView
import com.habitrpg.android.habitica.ui.views.tasks.form.TaskDifficultyButtons
import io.reactivex.functions.Consumer
import javax.inject.Inject
import android.content.res.ColorStateList
import android.graphics.drawable.ColorDrawable
import android.view.MenuItem
import android.view.inputmethod.InputMethodManager
import androidx.appcompat.widget.AppCompatCheckBox
import androidx.core.view.children
import androidx.core.view.forEach
import androidx.core.view.forEachIndexed
import com.habitrpg.android.habitica.extensions.dpToPx
import io.realm.RealmList
class TaskFormActivity : BaseActivity() {
@Inject
lateinit var userRepository: UserRepository
@Inject
lateinit var taskRepository: TaskRepository
@Inject
lateinit var tagRepository: TagRepository
private val toolbar: Toolbar by bindView(R.id.toolbar)
private val upperTextWrapper: LinearLayout by bindView(R.id.upper_text_wrapper)
private val textEditText: EditText by bindView(R.id.text_edit_text)
private val notesEditText: EditText by bindView(R.id.notes_edit_text)
private val habitScoringButtons: HabitScoringButtonsView by bindView(R.id.habit_scoring_buttons)
private val habitResetStreakTitleView: TextView by bindView(R.id.habit_reset_streak_title)
private val habitResetStreakButtons: HabitResetStreakButtons by bindView(R.id.habit_reset_streak_buttons)
private val adjustStreakWrapper: ViewGroup by bindView(R.id.adjust_streak_wrapper)
private val adjustStreakTitleView: TextView by bindView(R.id.adjust_streak_title)
private val habitAdjustPositiveStreakView: EditText by bindView(R.id.habit_adjust_positive_streak)
private val habitAdjustNegativeStreakView: EditText by bindView(R.id.habit_adjust_negative_streak)
private val taskDifficultyButtons: TaskDifficultyButtons by bindView(R.id.task_difficulty_buttons)
private val statWrapper: ViewGroup by bindView(R.id.stat_wrapper)
private val statStrengthButton: TextView by bindView(R.id.stat_strength_button)
private val statIntelligenceButton: TextView by bindView(R.id.stat_intelligence_button)
private val statConstitutionButton: TextView by bindView(R.id.stat_constitution_button)
private val statPerceptionButton: TextView by bindView(R.id.stat_perception_button)
private val tagsWrapper: LinearLayout by bindView(R.id.tags_wrapper)
private var isCreating = true
private var usesTaskAttributeStats = false
private var task: Task? = null
private var taskType: String = ""
private var tags = listOf<Tag>()
private var selectedStat = Stats.STRENGTH
set(value) {
field = value
setSelectedAttribute(value)
}
private var tintColor: Int = 0
set(value) {
field = value
upperTextWrapper.setBackgroundColor(value)
taskDifficultyButtons.tintColor = value
habitScoringButtons.tintColor = value
habitResetStreakButtons.tintColor = value
supportActionBar?.setBackgroundDrawable(ColorDrawable(value))
updateTagViewsColors()
}
override fun getLayoutResId(): Int {
return R.layout.activity_task_form
}
override fun injectActivity(component: AppComponent?) {
component?.inject(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
title = ""
tintColor = ContextCompat.getColor(this, R.color.brand_300)
val bundle = intent.extras ?: return
taskType = bundle.getString(OldTaskFormActivity.TASK_TYPE_KEY) ?: Task.TYPE_HABIT
val taskId = bundle.getString(OldTaskFormActivity.TASK_ID_KEY)
if (taskId != null) {
isCreating = false
compositeSubscription.add(taskRepository.getUnmanagedTask(taskId).subscribe(Consumer {
task = it
//tintColor = ContextCompat.getColor(this, it.mediumTaskColor)
fillForm(it)
}, RxErrorHandler.handleEmptyError()))
}
compositeSubscription.add(tagRepository.getTags()
.map { tagRepository.getUnmanagedCopy(it) }
.subscribe(Consumer {
tags = it
setTagViews()
}, RxErrorHandler.handleEmptyError()))
compositeSubscription.add(userRepository.getUser().subscribe(Consumer {
usesTaskAttributeStats = it.preferences?.allocationMode == "taskbased"
configureForm()
}, RxErrorHandler.handleEmptyError()))
statStrengthButton.setOnClickListener { selectedStat = Stats.STRENGTH }
statIntelligenceButton.setOnClickListener { selectedStat = Stats.INTELLIGENCE }
statConstitutionButton.setOnClickListener { selectedStat = Stats.CONSTITUTION }
statPerceptionButton.setOnClickListener { selectedStat = Stats.PERCEPTION }
configureForm()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
if (isCreating) {
menuInflater.inflate(R.menu.menu_task_create, menu)
} else {
menuInflater.inflate(R.menu.menu_task_edit, menu)
}
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item?.itemId) {
R.id.action_create -> saveTask()
R.id.action_save_changes -> saveTask()
R.id.action_delete -> deleteTask()
}
return super.onOptionsItemSelected(item)
}
private fun configureForm() {
val habitViewsVisibility = if (taskType == Task.TYPE_HABIT) View.VISIBLE else View.GONE
habitScoringButtons.visibility = habitViewsVisibility
habitResetStreakTitleView.visibility = habitViewsVisibility
habitResetStreakButtons.visibility = habitViewsVisibility
habitAdjustPositiveStreakView.visibility = habitViewsVisibility
habitAdjustNegativeStreakView.visibility = habitViewsVisibility
val dailyViewsVisibility = if (taskType == Task.TYPE_DAILY) View.VISIBLE else View.GONE
val todoViewsVisibility = if (taskType == Task.TYPE_TODO) View.VISIBLE else View.GONE
statWrapper.visibility = if (usesTaskAttributeStats) View.VISIBLE else View.GONE
if (isCreating) {
adjustStreakTitleView.visibility = View.GONE
adjustStreakWrapper.visibility = View.GONE
}
}
private fun setTagViews() {
tagsWrapper.removeAllViews()
val padding = 20.dpToPx(this)
for (tag in tags) {
val view = CheckBox(this)
view.setPadding(padding, view.paddingTop, view.paddingRight, view.paddingBottom)
view.text = tag.name
tagsWrapper.addView(view)
}
setAllTagSelections()
updateTagViewsColors()
}
private fun setAllTagSelections() {
tags.forEachIndexed { index, tag ->
val view = tagsWrapper.getChildAt(index) as? CheckBox
view?.isChecked = task?.tags?.find { it.id == tag.id } != null
}
}
private fun fillForm(task: Task) {
textEditText.setText(task.text)
notesEditText.setText(task.notes)
taskDifficultyButtons.selectedDifficulty = task.priority
if (taskType == Task.TYPE_HABIT) {
habitScoringButtons.isPositive = task.up ?: false
habitScoringButtons.isNegative = task.down ?: false
task.frequency?.let { habitResetStreakButtons.selectedResetOption = HabitResetOption.valueOf(it.toUpperCase()) }
habitAdjustPositiveStreakView.setText((task.counterUp ?: 0).toString())
habitAdjustNegativeStreakView.setText((task.counterDown ?: 0).toString())
}
task.attribute?.let { setSelectedAttribute(it) }
setAllTagSelections()
}
private fun setSelectedAttribute(attributeName: String) {
if (!usesTaskAttributeStats) return
configureStatsButton(statStrengthButton, attributeName == Stats.STRENGTH )
configureStatsButton(statIntelligenceButton, attributeName == Stats.INTELLIGENCE )
configureStatsButton(statConstitutionButton, attributeName == Stats.CONSTITUTION )
configureStatsButton(statPerceptionButton, attributeName == Stats.PERCEPTION )
}
private fun configureStatsButton(button: TextView, isSelected: Boolean) {
button.background.setTint(if (isSelected) tintColor else ContextCompat.getColor(this, R.color.taskform_gray))
val textColorID = if (isSelected) R.color.white else R.color.gray_100
button.setTextColor(ContextCompat.getColor(this, textColorID))
}
private fun updateTagViewsColors() {
tagsWrapper.children.forEach { view ->
val tagView = view as? AppCompatCheckBox
val colorStateList = ColorStateList(
arrayOf(intArrayOf(-android.R.attr.state_checked), // unchecked
intArrayOf(android.R.attr.state_checked) // checked
),
intArrayOf(ContextCompat.getColor(this, R.color.gray_400), tintColor)
)
tagView?.buttonTintList = colorStateList
}
}
private fun saveTask() {
var thisTask = task
if (thisTask == null) {
thisTask = Task()
thisTask.type = taskType
}
thisTask.text = textEditText.text.toString()
thisTask.notes = notesEditText.text.toString()
thisTask.priority = taskDifficultyButtons.selectedDifficulty
if (taskType == Task.TYPE_HABIT) {
thisTask.up = habitScoringButtons.isPositive
thisTask.down = habitScoringButtons.isNegative
thisTask.frequency = habitResetStreakButtons.selectedResetOption.value
if (habitAdjustPositiveStreakView.text.isNotEmpty()) thisTask.counterUp = habitAdjustPositiveStreakView.text.toString().toInt()
if (habitAdjustNegativeStreakView.text.isNotEmpty()) thisTask.counterDown = habitAdjustNegativeStreakView.text.toString().toInt()
}
thisTask.tags = RealmList()
tagsWrapper.forEachIndexed { index, view ->
val tagView = view as? CheckBox
if (tagView?.isChecked == true) {
thisTask.tags?.add(tags[index])
}
}
if (isCreating) {
taskRepository.createTaskInBackground(thisTask)
} else {
taskRepository.updateTaskInBackground(thisTask)
}
dismissKeyboard()
finish()
}
private fun deleteTask() {
task?.id?.let { taskRepository.deleteTask(it).subscribe(Consumer { }, RxErrorHandler.handleEmptyError()) }
dismissKeyboard()
finish()
}
private fun dismissKeyboard() {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
val currentFocus = currentFocus
if (currentFocus != null) {
imm?.hideSoftInputFromWindow(currentFocus.windowToken, 0)
}
}
companion object {
const val TASK_ID_KEY = "taskId"
const val TASK_TYPE_KEY = "type"
const val SHOW_TAG_SELECTION = "show_tag_selection"
// in order to disable the event handler in MainActivity
const val SET_IGNORE_FLAG = "ignoreFlag"
}
}

View file

@ -17,6 +17,7 @@ import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.helpers.TaskFilterHelper
import com.habitrpg.android.habitica.models.tasks.Task
import com.habitrpg.android.habitica.ui.activities.OldTaskFormActivity
import com.habitrpg.android.habitica.ui.activities.TaskFormActivity
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
import com.habitrpg.android.habitica.ui.views.tasks.TaskFilterDialog
import io.reactivex.functions.Consumer
@ -293,7 +294,7 @@ class TasksFragment : BaseMainFragment() {
bundle.putBoolean(OldTaskFormActivity.ALLOCATION_MODE_KEY, allocationMode)
bundle.putBoolean(OldTaskFormActivity.SAVE_TO_DB, true)
val intent = Intent(activity, OldTaskFormActivity::class.java)
val intent = Intent(activity, TaskFormActivity::class.java)
intent.putExtras(bundle)
intent.flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
if (this.isAdded) {
@ -317,7 +318,7 @@ class TasksFragment : BaseMainFragment() {
bundle.putBoolean(OldTaskFormActivity.ALLOCATION_MODE_KEY, allocationMode)
bundle.putBoolean(OldTaskFormActivity.SAVE_TO_DB, true)
val intent = Intent(activity, OldTaskFormActivity::class.java)
val intent = Intent(activity, TaskFormActivity::class.java)
intent.putExtras(bundle)
this.displayingTaskForm = true
if (isAdded) {

View file

@ -706,4 +706,34 @@ public class HabiticaIconsHelper {
return imageOfBuffIcon;
}
public static Bitmap imageOfTaskDifficultyStars(int taskTintColor, float difficulty, boolean isActive) {
int size = scaleSize(36);
Bitmap imageOfTaskDifficultyStars = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfTaskDifficultyStars);
canvas.scale(displayDensity, displayDensity);
HabiticaIcons.drawTaskDifficultyStars(canvas, taskTintColor, difficulty, isActive);
return imageOfTaskDifficultyStars;
}
public static Bitmap imageOfHabitControlPlus(int taskTintColor, boolean isActive) {
int size = scaleSize(34);
Bitmap imageOfHabitControlPlus = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfHabitControlPlus);
canvas.scale(displayDensity, displayDensity);
HabiticaIcons.drawHabitControlPlus(canvas, taskTintColor, isActive);
return imageOfHabitControlPlus;
}
public static Bitmap imageOfHabitControlMinus(int taskTintColor, boolean isActive) {
int size = scaleSize(34);
Bitmap imageOfHabitControlMinus = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfHabitControlMinus);
canvas.scale(displayDensity, displayDensity);
HabiticaIcons.drawHabitControlMinus(canvas, taskTintColor, isActive);
return imageOfHabitControlMinus;
}
}

View file

@ -0,0 +1,65 @@
package com.habitrpg.android.habitica.ui.views.tasks.form
import android.content.Context
import android.util.AttributeSet
import android.view.Gravity
import android.view.View
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.dpToPx
import com.habitrpg.android.habitica.models.tasks.HabitResetOption
class HabitResetStreakButtons @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
var tintColor: Int = ContextCompat.getColor(context, R.color.brand_300)
var selectedResetOption: HabitResetOption = HabitResetOption.DAILY
set(value) {
field = value
removeAllViews()
addAllButtons()
}
init {
addAllButtons()
}
private fun addAllButtons() {
val lastResetOption = HabitResetOption.values().last()
val margin = 16.dpToPx(context)
val height = 28.dpToPx(context)
for (resetOption in HabitResetOption.values()) {
val button = createButton(resetOption)
val layoutParams = LinearLayout.LayoutParams(0, height)
layoutParams.weight = 1f
if (resetOption != lastResetOption) {
layoutParams.marginEnd = margin
}
button.textAlignment = View.TEXT_ALIGNMENT_GRAVITY
button.gravity = Gravity.CENTER
button.layoutParams = layoutParams
addView(button)
}
}
private fun createButton(resetOption: HabitResetOption): TextView {
val button = TextView(context)
button.text = context.getString(resetOption.nameRes)
button.background = ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_white)
if (selectedResetOption == resetOption) {
button.background.setTint(tintColor)
button.setTextColor(ContextCompat.getColor(context, R.color.white))
} else {
button.background.setTint(ContextCompat.getColor(context, R.color.taskform_gray))
button.setTextColor(ContextCompat.getColor(context, R.color.gray_100))
}
button.setOnClickListener {
selectedResetOption = resetOption
}
return button
}
}

View file

@ -0,0 +1,69 @@
package com.habitrpg.android.habitica.ui.views.tasks.form
import android.content.Context
import android.util.AttributeSet
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.asDrawable
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
class HabitScoringButtonsView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
private val positiveVew: ViewGroup by bindView(R.id.positive_view)
private val negativeView: ViewGroup by bindView(R.id.negative_view)
private val positiveImageView: ImageView by bindView(R.id.positive_image_view)
private val negativeImageView: ImageView by bindView(R.id.negative_image_view)
private val positiveTextView: TextView by bindView(R.id.positive_text_view)
private val negativeTextView: TextView by bindView(R.id.negative_text_view)
var tintColor: Int = ContextCompat.getColor(context, R.color.brand_300)
var isPositive = true
set(value) {
field = value
positiveImageView.setImageDrawable(HabiticaIconsHelper.imageOfHabitControlPlus(tintColor, value).asDrawable(resources))
if (value) {
positiveTextView.setTextColor(tintColor)
} else {
positiveTextView.setTextColor(ContextCompat.getColor(context, R.color.gray_100))
}
}
var isNegative = true
set(value) {
field = value
negativeImageView.setImageDrawable(HabiticaIconsHelper.imageOfHabitControlMinus(tintColor, value).asDrawable(resources))
if (value) {
negativeTextView.setTextColor(tintColor)
} else {
negativeTextView.setTextColor(ContextCompat.getColor(context, R.color.gray_100))
}
}
init {
View.inflate(context, R.layout.task_form_habit_scoring, this)
gravity = Gravity.CENTER
positiveVew.setOnClickListener {
isPositive = !isPositive
}
negativeView.setOnClickListener {
isNegative = !isNegative
}
isPositive = true
isNegative = true
}
}

View file

@ -0,0 +1,70 @@
package com.habitrpg.android.habitica.ui.views.tasks.form
import android.content.Context
import android.graphics.drawable.BitmapDrawable
import android.util.AttributeSet
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.Space
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.core.view.children
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.asDrawable
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.models.tasks.TaskDifficulty
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
class TaskDifficultyButtons @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
var tintColor: Int = ContextCompat.getColor(context, R.color.brand_300)
var selectedDifficulty: Float = 1f
set(value) {
field = value
removeAllViews()
addAllButtons()
}
init {
addAllButtons()
}
private fun addAllButtons() {
val lastDifficulty = TaskDifficulty.values().last()
for (difficulty in TaskDifficulty.values()) {
val button = createButton(difficulty)
addView(button)
if (difficulty != lastDifficulty) {
val space = Space(context)
val layoutParams = LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT)
layoutParams.weight = 1f
space.layoutParams = layoutParams
addView(space)
}
}
}
private fun createButton(difficulty: TaskDifficulty): View {
val view = inflate(R.layout.task_form_task_difficulty, false)
val isActive = selectedDifficulty == difficulty.value
var difficultyColor = ContextCompat.getColor(context, R.color.white)
if (isActive) {
view.findViewById<ImageView>(R.id.image_view).background.setTint(tintColor)
view.findViewById<TextView>(R.id.text_view).setTextColor(tintColor)
} else {
view.findViewById<ImageView>(R.id.image_view).background.setTint(ContextCompat.getColor(context, R.color.taskform_gray))
view.findViewById<TextView>(R.id.text_view).setTextColor(ContextCompat.getColor(context, R.color.gray_100))
difficultyColor = ContextCompat.getColor(context, R.color.gray_400)
}
val drawable = HabiticaIconsHelper.imageOfTaskDifficultyStars(difficultyColor, difficulty.value, true).asDrawable(resources)
view.findViewById<ImageView>(R.id.image_view).setImageDrawable(drawable)
view.findViewById<TextView>(R.id.text_view).text = context.getText(difficulty.nameRes)
view.setOnClickListener {
selectedDifficulty = difficulty.value
}
return view
}
}