diff --git a/Habitica/build.gradle b/Habitica/build.gradle
index 1702f34fe..b4037fc01 100644
--- a/Habitica/build.gradle
+++ b/Habitica/build.gradle
@@ -153,7 +153,7 @@ android {
buildConfigField "String", "TESTING_LEVEL", "\"production\""
multiDexEnabled true
- versionCode 2105
+ versionCode 2110
versionName "1.9"
}
diff --git a/Habitica/res/layout/task_form_task_scheduling.xml b/Habitica/res/layout/task_form_task_scheduling.xml
index 31d20cf5d..0696fc951 100644
--- a/Habitica/res/layout/task_form_task_scheduling.xml
+++ b/Habitica/res/layout/task_form_task_scheduling.xml
@@ -130,7 +130,7 @@
android:layout_weight="1"
android:layout_height="28dp"
android:text="@string/repeatables_frequency_day_of_month"
- android:layout_marginRight="@dimen/spacing_medium"/>
+ android:layout_marginEnd="@dimen/spacing_medium"/>
+ android:layout_marginStart="@dimen/spacing_medium"/>
+ android:textSize="12sp"
+ android:layout_marginTop="@dimen/spacing_medium"/>
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.kt
index c0f185e71..a4f32f4ed 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PublicGuildsRecyclerViewAdapter.kt
@@ -1,22 +1,19 @@
package com.habitrpg.android.habitica.ui.adapter.social
-import androidx.recyclerview.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.Filter
import android.widget.Filterable
import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.R
-import com.habitrpg.android.habitica.data.ApiClient
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.models.social.Group
-import com.habitrpg.android.habitica.ui.fragments.social.GuildFragment
-import com.habitrpg.android.habitica.ui.fragments.social.GuildsOverviewFragmentDirections
import com.habitrpg.android.habitica.ui.fragments.social.PublicGuildsFragmentDirections
import com.habitrpg.android.habitica.ui.helpers.MarkdownParser
import com.habitrpg.android.habitica.ui.helpers.bindView
@@ -24,14 +21,13 @@ import io.reactivex.functions.Consumer
import io.realm.Case
import io.realm.OrderedRealmCollection
import io.realm.RealmRecyclerViewAdapter
-import org.greenrobot.eventbus.EventBus
class PublicGuildsRecyclerViewAdapter(data: OrderedRealmCollection?, autoUpdate: Boolean) : RealmRecyclerViewAdapter(data, autoUpdate), Filterable {
var socialRepository: SocialRepository? = null
- private var memberGuildIDs: MutableList = mutableListOf()
+ private var memberGuildIDs: List = listOf()
- fun setMemberGuildIDs(memberGuildIDs: MutableList) {
+ fun setMemberGuildIDs(memberGuildIDs: List) {
this.memberGuildIDs = memberGuildIDs
}
@@ -49,7 +45,6 @@ class PublicGuildsRecyclerViewAdapter(data: OrderedRealmCollection?, auto
if (isMember) {
this@PublicGuildsRecyclerViewAdapter.socialRepository?.leaveGroup(guild.id)
?.subscribe(Consumer {
- memberGuildIDs.remove(guild.id)
if (data != null) {
val indexOfGroup = data?.indexOf(guild)
notifyItemChanged(indexOfGroup ?: 0)
@@ -58,7 +53,6 @@ class PublicGuildsRecyclerViewAdapter(data: OrderedRealmCollection?, auto
} else {
this@PublicGuildsRecyclerViewAdapter.socialRepository?.joinGroup(guild.id)
?.subscribe(Consumer { group ->
- memberGuildIDs.add(group.id)
if (data != null) {
val indexOfGroup = data?.indexOf(group)
notifyItemChanged(indexOfGroup ?: 0)
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.kt
index 9fe707b58..0d2b7b307 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/PublicGuildsFragment.kt
@@ -9,6 +9,7 @@ import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.SocialRepository
import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.notNull
+import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.ui.adapter.social.PublicGuildsRecyclerViewAdapter
import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment
@@ -24,8 +25,6 @@ class PublicGuildsFragment : BaseMainFragment(), SearchView.OnQueryTextListener
@Inject
lateinit var socialRepository: SocialRepository
- var memberGuildIDs: List? = null
-
private val recyclerView: androidx.recyclerview.widget.RecyclerView? by bindView(R.id.recyclerView)
private var viewAdapter = PublicGuildsRecyclerViewAdapter(null, true)
@@ -44,10 +43,12 @@ class PublicGuildsFragment : BaseMainFragment(), SearchView.OnQueryTextListener
resetViews()
- recyclerView?.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this.activity)
- recyclerView?.addItemDecoration(androidx.recyclerview.widget.DividerItemDecoration(getActivity()!!, androidx.recyclerview.widget.DividerItemDecoration.VERTICAL))
+ recyclerView?.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(activity)
+ recyclerView?.addItemDecoration(androidx.recyclerview.widget.DividerItemDecoration(activity, androidx.recyclerview.widget.DividerItemDecoration.VERTICAL))
viewAdapter = PublicGuildsRecyclerViewAdapter(null, true)
- viewAdapter.setMemberGuildIDs(this.memberGuildIDs?.toMutableList() ?: mutableListOf())
+ compositeSubscription.add(socialRepository.getGroupMemberships()
+ .map { it.map { membership -> membership.groupID } }
+ .subscribeWithErrorHandler(Consumer { viewAdapter.setMemberGuildIDs(it) }))
viewAdapter.socialRepository = socialRepository
recyclerView?.adapter = viewAdapter
recyclerView?.itemAnimator = SafeDefaultItemAnimator()
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/TaskSchedulingControls.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/TaskSchedulingControls.kt
index f33a92071..2d24d7eeb 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/TaskSchedulingControls.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/tasks/form/TaskSchedulingControls.kt
@@ -3,6 +3,7 @@ package com.habitrpg.android.habitica.ui.views.tasks.form
import android.app.DatePickerDialog
import android.content.Context
import android.content.DialogInterface
+import android.text.TextUtils
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
@@ -52,6 +53,7 @@ class TaskSchedulingControls @JvmOverloads constructor(
field = value
startDateTextView.text = dateFormatter.format(value)
startDateCalendar.time = value
+ generateSummary()
}
private var startDateCalendar = Calendar.getInstance()
var dueDate: Date? = null
@@ -69,6 +71,7 @@ class TaskSchedulingControls @JvmOverloads constructor(
else -> 0
})
configureViewsForFrequency()
+ generateSummary()
}
var everyX
get() = (repeatsEveryEdittext.text ?: "1").toString().toIntOrNull() ?: 1
@@ -78,22 +81,26 @@ class TaskSchedulingControls @JvmOverloads constructor(
} catch (e: NumberFormatException) {
repeatsEveryEdittext.setText("1")
}
+ generateSummary()
}
var weeklyRepeat: Days = Days()
set(value) {
field = value
createWeeklyRepeatViews()
+ generateSummary()
}
var daysOfMonth: List? = null
set(value) {
field = value
configureMonthlyRepeatViews()
+ generateSummary()
}
var weeksOfMonth: List? = null
set(value) {
field = value
configureMonthlyRepeatViews()
+ generateSummary()
}
private val weekdays: Array by lazy {
@@ -152,10 +159,12 @@ class TaskSchedulingControls @JvmOverloads constructor(
monthlyRepeatDaysButton.setOnClickListener {
daysOfMonth = mutableListOf(startDateCalendar.get(Calendar.DATE))
weeksOfMonth = null
+ generateSummary()
}
monthlyRepeatWeeksButton.setOnClickListener {
weeksOfMonth = mutableListOf(startDateCalendar.get(Calendar.WEEK_OF_MONTH))
daysOfMonth = null
+ generateSummary()
}
orientation = VERTICAL
@@ -166,6 +175,7 @@ class TaskSchedulingControls @JvmOverloads constructor(
private fun configureViewsForType() {
startDateTitleView.text = context.getString(if (taskType == Task.TYPE_DAILY) R.string.start_date else R.string.due_date)
repeatsEveryWrapper.visibility = if (taskType == Task.TYPE_DAILY) View.VISIBLE else View.GONE
+ summaryTextView.visibility = if (taskType == Task.TYPE_DAILY) View.VISIBLE else View.GONE
}
override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
@@ -272,4 +282,57 @@ class TaskSchedulingControls @JvmOverloads constructor(
monthlyRepeatWeeksButton.background.mutate().setTint(unselectedBackground)
}
}
+
+ private fun generateSummary() {
+ var frequencyQualifier = ""
+
+ when (frequency) {
+ "daily" -> frequencyQualifier = "day(s)"
+ "weekly" -> frequencyQualifier = "week(s)"
+ "monthly" -> frequencyQualifier = "month(s)"
+ "yearly" -> frequencyQualifier = "year(s)"
+ }
+
+ var weekdays: String
+ val weekdayStrings = ArrayList()
+ if (weeklyRepeat.m) {
+ weekdayStrings.add("Monday")
+ }
+ if (weeklyRepeat.t) {
+ weekdayStrings.add("Tuesday")
+ }
+ if (weeklyRepeat.w) {
+ weekdayStrings.add("Wednesday")
+ }
+ if (weeklyRepeat.th) {
+ weekdayStrings.add("Thursday")
+ }
+ if (weeklyRepeat.f) {
+ weekdayStrings.add("Friday")
+ }
+ if (weeklyRepeat.s) {
+ weekdayStrings.add("Saturday")
+ }
+ if (weeklyRepeat.su) {
+ weekdayStrings.add("Sunday")
+ }
+ weekdays = " on " + TextUtils.join(", ", weekdayStrings)
+ if (frequency != "weekly") {
+ weekdays = ""
+ }
+
+ if (frequency == "monthly") {
+ weekdays = if (daysOfMonth != null) {
+ val date = startDateCalendar.get(Calendar.DATE)
+ " on the $date"
+ } else {
+ val week = startDateCalendar.get(Calendar.WEEK_OF_MONTH)
+ val dayLongName = startDateCalendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault())
+ " on the $week week on $dayLongName"
+ }
+ }
+
+ val summary = resources.getString(R.string.repeat_summary, frequency, everyX.toString(), frequencyQualifier, weekdays)
+ summaryTextView.text = summary
+ }
}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 2a044e186..721569bba 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,7 +1,8 @@
android.enableJetifier=true
android.useAndroidX=true
+android.enableR8=false
android.debug.obsoleteApi=true
org.gradle.configureondemand=true
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx6656M
-org.gradle.warning.mode=all
\ No newline at end of file
+org.gradle.warning.mode=all