diff --git a/Habitica/res/layout/activity_create_challenge.xml b/Habitica/res/layout/activity_create_challenge.xml
index 9ab665c22..1f1a091b5 100644
--- a/Habitica/res/layout/activity_create_challenge.xml
+++ b/Habitica/res/layout/activity_create_challenge.xml
@@ -81,6 +81,11 @@
android:orientation="vertical"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin">
+
+
Tasks
Create Challenge
Edit
- You need at least 1 gem to create a challenge in Tavern.
+ You need at least 1 gem to create a public challenge.
You don\'t have enough gems to create a challenge.
Identify your challenge with a short name
You need a short name to create this Challenge.
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ChallengeRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ChallengeRepositoryImpl.kt
index 715dde7d7..087eb72a9 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ChallengeRepositoryImpl.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ChallengeRepositoryImpl.kt
@@ -91,7 +91,9 @@ class ChallengeRepositoryImpl(localRepository: ChallengeLocalRepository, apiClie
var flowable: Flowable<*> = Flowable.just("")
- updatedTaskList.forEach { task ->
+ updatedTaskList
+ .map { localRepository.getUnmanagedCopy(it) }
+ .forEach { task ->
flowable = flowable.flatMap { apiClient.updateTask(task.id ?: "", task) }
}
@@ -105,6 +107,7 @@ class ChallengeRepositoryImpl(localRepository: ChallengeLocalRepository, apiClie
challenge.tasksOrder = getTaskOrders(fullTaskList)
return flowable.flatMap { apiClient.updateChallenge(challenge) }
+ .doOnNext { localRepository.save(challenge) }
}
override fun deleteChallenge(challengeId: String): Flowable {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Challenge.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Challenge.kt
index 70a1c172e..ef2385f46 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Challenge.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/social/Challenge.kt
@@ -64,6 +64,10 @@ open class Challenge : RealmObject() {
} else super.equals(other)
}
+ override fun hashCode(): Int {
+ return id?.hashCode() ?: 0
+ }
+
companion object {
const val TASK_ORDER_HABITS = "habits"
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt
index cbad133ef..0f1f2d34f 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt
@@ -54,6 +54,7 @@ class ChallengeFormActivity : BaseActivity() {
private val challengeRemoveGemBtn: Button by bindView(R.id.challenge_remove_gem_btn)
private val createChallengeTaskList: RecyclerView by bindView(R.id.create_challenge_task_list)
private val gemIconView: ImageView by bindView(R.id.gem_icon)
+ private val challengeCreationViews: ViewGroup by bindView(R.id.challenge_creation_views)
@Inject
internal lateinit var challengeRepository: ChallengeRepository
@@ -68,6 +69,7 @@ class ChallengeFormActivity : BaseActivity() {
private lateinit var locationAdapter: GroupArrayAdapter
private var challengeId: String? = null
+ private var groupID: String? = null
private var editMode: Boolean = false
private val addedTasks = HashMap()
@@ -88,14 +90,18 @@ class ChallengeFormActivity : BaseActivity() {
val c = Challenge()
val locationPos = challengeLocationSpinner.selectedItemPosition
- val locationGroup = locationAdapter.getItem(locationPos)
if (challengeId != null) {
c.id = challengeId
}
- if (locationGroup != null) {
- c.groupId = locationGroup.id
+ if (groupID != null) {
+ c.groupId = groupID
+ } else {
+ val locationGroup = locationAdapter.getItem(locationPos)
+ if (locationGroup != null) {
+ c.groupId = locationGroup.id
+ }
}
c.name = createChallengeTitle.text.toString()
c.description = createChallengeDescription.text.toString()
@@ -318,15 +324,16 @@ class ChallengeFormActivity : BaseActivity() {
locationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
socialRepository.getGroups("guild").subscribe(Consumer { groups ->
- if (groups.first { it.id == "00000000-0000-4000-A000-000000000000" } == null) {
+ val mutableGroups = groups.toMutableList()
+ if (groups.firstOrNull { it.id == "00000000-0000-4000-A000-000000000000" } == null) {
val tavern = Group()
tavern.id = "00000000-0000-4000-A000-000000000000"
tavern.name = getString(R.string.public_challenge)
- locationAdapter.add(tavern)
+ mutableGroups.add(0, tavern)
}
locationAdapter.clear()
- locationAdapter.addAll(groups)
+ locationAdapter.addAll(mutableGroups)
}, RxErrorHandler.handleEmptyError())
challengeLocationSpinner.adapter = locationAdapter
@@ -380,10 +387,13 @@ class ChallengeFormActivity : BaseActivity() {
private fun fillControlsByChallenge() {
challengeId.notNull {
challengeRepository.getChallenge(it).subscribe(Consumer { challenge ->
+ groupID = challenge.groupId
+ editMode = true
createChallengeTitle.setText(challenge.name)
createChallengeDescription.setText(challenge.description)
createChallengeTag.setText(challenge.shortName)
createChallengePrize.setText(challenge.prize.toString())
+ challengeCreationViews.visibility = View.GONE
for (i in 0 until locationAdapter.count) {
val group = locationAdapter.getItem(i)
@@ -397,7 +407,7 @@ class ChallengeFormActivity : BaseActivity() {
}, RxErrorHandler.handleEmptyError())
challengeRepository.getChallengeTasks(it).subscribe(Consumer { tasks ->
tasks.forEach { task ->
- addOrUpdateTaskInList(task)
+ addOrUpdateTaskInList(task, true)
}
}, RxErrorHandler.handleEmptyError())
}
@@ -454,7 +464,7 @@ class ChallengeFormActivity : BaseActivity() {
)
}
- private fun addOrUpdateTaskInList(task: Task) {
+ private fun addOrUpdateTaskInList(task: Task, isExistingTask: Boolean = false) {
if (!challengeTasks.replaceTask(task)) {
val taskAbove: Task? = when (task.type) {
Task.TYPE_HABIT -> addHabit
@@ -465,7 +475,7 @@ class ChallengeFormActivity : BaseActivity() {
challengeTasks.addTaskUnder(task, taskAbove)
- if (editMode) {
+ if (editMode && !isExistingTask) {
addedTasks[task.id ?: ""] = task
}
} else {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt
index 688a73cae..82b330b4b 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengeDetailFragment.kt
@@ -87,6 +87,7 @@ class ChallengeDetailFragment: BaseMainFragment() {
.map {
return@map (it.leaderId ?: "")
}
+ .filter { it.isNotEmpty() }
.flatMap { creatorID ->
return@flatMap socialRepository.getMember(creatorID)
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ChallengeDeserializer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ChallengeDeserializer.kt
index f3969bc9b..15658b338 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ChallengeDeserializer.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/ChallengeDeserializer.kt
@@ -24,7 +24,7 @@ class ChallengeDeserializer : JsonDeserializer, JsonSerializer