From 8fe091e83031860ace49e4aaa5e1a5b35aebaa75 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 7 Aug 2018 12:39:58 +0200 Subject: [PATCH] fix challenge editing --- .../res/layout/activity_create_challenge.xml | 6 ++++ Habitica/res/values/strings.xml | 2 +- .../implementation/ChallengeRepositoryImpl.kt | 5 +++- .../habitica/models/social/Challenge.kt | 4 +++ .../ui/activities/ChallengeFormActivity.kt | 28 +++++++++++++------ .../challenges/ChallengeDetailFragment.kt | 1 + .../habitica/utils/ChallengeDeserializer.kt | 2 +- 7 files changed, 36 insertions(+), 12 deletions(-) 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