From 0769ddc7e98365b064da30051b5190613f6b3037 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 29 Aug 2019 12:26:38 +0200 Subject: [PATCH] Improve leaving guilds and parties. Fixes #906 --- Habitica/res/values/strings.xml | 5 ++- .../android/habitica/api/ApiService.kt | 2 +- .../android/habitica/data/ApiClient.kt | 2 +- .../android/habitica/data/SocialRepository.kt | 2 +- .../data/implementation/ApiClientImpl.kt | 6 ++-- .../implementation/SocialRepositoryImpl.kt | 4 +-- .../social/PublicGuildsRecyclerViewAdapter.kt | 2 +- .../fragments/social/GuildDetailFragment.kt | 36 ++++++++++++++----- .../ui/fragments/social/GuildFragment.kt | 8 +++-- .../social/party/PartyDetailFragment.kt | 9 +++-- .../fragments/social/party/PartyFragment.kt | 14 +------- .../habitica/ui/viewmodels/GroupViewModel.kt | 6 ++-- 12 files changed, 55 insertions(+), 41 deletions(-) diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index ee80da630..8c90508d1 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -500,7 +500,7 @@ Welcome Back Check off any Dailies you did yesterday: Start My Day - Are you sure you want to leave the Party? + Do you want to leave the party and keep or leave the challenges? Pending Accepted Declined @@ -771,6 +771,7 @@ Report Violation t Leave Guild + Do you want to leave the guild and keep or leave the challenges? You left the guild You joined the guild Cost @@ -833,4 +834,6 @@ You put themselves to the test by joining a Challenge! Invited a Friend You invited a friend (or friends) who joined you on your adventure! + Keep Challenges + Leave Challenges diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt index a908d8813..e580a128a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt @@ -187,7 +187,7 @@ interface ApiService { fun joinGroup(@Path("gid") groupId: String): Flowable> @POST("groups/{gid}/leave") - fun leaveGroup(@Path("gid") groupId: String): Flowable> + fun leaveGroup(@Path("gid") groupId: String, @Query("keepChallenges") keepChallenges: String): Flowable> @POST("groups/{gid}/chat") fun postGroupChat(@Path("gid") groupId: String, @Body message: Map): Flowable> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt index 061d4f243..e713ad9f9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt @@ -133,7 +133,7 @@ interface ApiClient { fun joinGroup(groupId: String): Flowable - fun leaveGroup(groupId: String): Flowable + fun leaveGroup(groupId: String, keepChallenges: String): Flowable fun postGroupChat(groupId: String, message: Map): Flowable diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt index ed4a2bb61..96120d514 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/SocialRepository.kt @@ -32,7 +32,7 @@ interface SocialRepository : BaseRepository { fun retrieveGroup(id: String): Flowable fun getGroup(id: String?): Flowable - fun leaveGroup(id: String?): Flowable + fun leaveGroup(id: String?, keepChallenges: Boolean): Flowable fun joinGroup(id: String?): Flowable diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index e36b57256..8261e80f3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.data.implementation import android.content.Context -import android.util.Log import com.amplitude.api.Amplitude import com.google.gson.JsonSyntaxException import com.habitrpg.android.habitica.BuildConfig @@ -124,7 +123,6 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; val request = builder.method(original.method(), original.body()) .build() lastAPICallURL = original.url().toString() - Log.d("NETWORK", lastAPICallURL) chain.proceed(request) } .readTimeout(2400, TimeUnit.SECONDS) @@ -493,8 +491,8 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; return apiService.joinGroup(groupId).compose(configureApiCallObserver()) } - override fun leaveGroup(groupId: String): Flowable { - return apiService.leaveGroup(groupId).compose(configureApiCallObserver()) + override fun leaveGroup(groupId: String, keepChallenges: String): Flowable { + return apiService.leaveGroup(groupId, keepChallenges).compose(configureApiCallObserver()) } override fun postGroupChat(groupId: String, message: Map): Flowable { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt index b7dbf3a74..15e450717 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/SocialRepositoryImpl.kt @@ -139,11 +139,11 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap return localRepository.getGroup(id) } - override fun leaveGroup(id: String?): Flowable { + override fun leaveGroup(id: String?, keepChallenges: Boolean): Flowable { if (id == null) { return Flowable.empty() } - return apiClient.leaveGroup(id) + return apiClient.leaveGroup(id, if (keepChallenges) "remain-in-challenges" else "leave-challenges") .doOnNext { localRepository.updateMembership(userID, id, false) } .flatMapMaybe { localRepository.getGroup(id).firstElement() } } 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 9e316eef2..8f5d43b81 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 @@ -42,7 +42,7 @@ class PublicGuildsRecyclerViewAdapter(data: OrderedRealmCollection?, auto val guild = v.tag as? Group ?: return@setOnClickListener val isMember = this.memberGuildIDs.contains(guild.id) if (isMember) { - this@PublicGuildsRecyclerViewAdapter.socialRepository?.leaveGroup(guild.id) + this@PublicGuildsRecyclerViewAdapter.socialRepository?.leaveGroup(guild.id, true) ?.subscribe(Consumer { if (data != null) { val indexOfGroup = data?.indexOf(guild) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildDetailFragment.kt index 9eb5c8658..e26b1691d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildDetailFragment.kt @@ -19,11 +19,10 @@ import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.models.members.Member import com.habitrpg.android.habitica.models.social.Group -import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.AvatarView import com.habitrpg.android.habitica.ui.activities.GroupFormActivity -import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.activities.GroupInviteActivity +import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.fragments.BaseFragment import com.habitrpg.android.habitica.ui.helpers.MarkdownParser import com.habitrpg.android.habitica.ui.helpers.bindView @@ -32,6 +31,7 @@ import com.habitrpg.android.habitica.ui.viewmodels.GroupViewModel import com.habitrpg.android.habitica.ui.views.HabiticaIcons import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar +import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.social.UsernameLabel import java.util.* import javax.inject.Inject @@ -77,12 +77,7 @@ class GuildDetailFragment : BaseFragment() { guildDescriptionView.movementMethod = LinkMovementMethod.getInstance() guildBankIconView.setImageBitmap(HabiticaIconsHelper.imageOfGem()) leaveGuildButton.setOnClickListener { - viewModel?.leaveGroup { - val activity = activity as? MainActivity - if (activity != null) { - HabiticaSnackbar.showSnackbar(activity.snackbarContainer, getString(R.string.left_guild), HabiticaSnackbar.SnackbarDisplayType.NORMAL) - } - } + leaveGuild() } joinGuildButton.setOnClickListener { viewModel?.joinGroup { @@ -159,6 +154,29 @@ class GuildDetailFragment : BaseFragment() { } } + internal fun leaveGuild() { + val context = context + if (context != null) { + val alert = HabiticaAlertDialog(context) + alert.setMessage(R.string.leave_guild_confirmation) + alert.addButton(R.string.keep_challenges, true) { _, _ -> + viewModel?.leaveGroup(true) { showLeaveSnackbar() } + } + alert.addButton(R.string.leave_challenges, true) { _, _ -> + viewModel?.leaveGroup(false) { showLeaveSnackbar() } + } + alert.addButton(R.string.no, false) + alert.show() + } + } + + private fun showLeaveSnackbar() { + val activity = activity as? MainActivity + if (activity != null) { + HabiticaSnackbar.showSnackbar(activity.snackbarContainer, getString(R.string.left_guild), HabiticaSnackbar.SnackbarDisplayType.NORMAL) + } + } + override fun injectFragment(component: UserComponent) { component.inject(this) } @@ -173,7 +191,7 @@ class GuildDetailFragment : BaseFragment() { } companion object { - fun newInstance(viewModel: GroupViewModel?, user: User?): GuildDetailFragment { + fun newInstance(viewModel: GroupViewModel?): GuildDetailFragment { val args = Bundle() val fragment = GuildDetailFragment() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.kt index 338462cee..668fe4c92 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/GuildFragment.kt @@ -108,13 +108,17 @@ class GuildFragment : BaseMainFragment() { return true } R.id.menu_guild_leave -> { - viewModel.leaveGroup { fragmentManager?.popBackStack() } + guildInformationFragment?.leaveGuild() return true } R.id.menu_guild_edit -> { this.displayEditForm() return true } + R.id.action_reload -> { + viewModel.retrieveGroup { } + return true + } } return super.onOptionsItemSelected(item) } @@ -130,7 +134,7 @@ class GuildFragment : BaseMainFragment() { when (position) { 0 -> { - guildInformationFragment = GuildDetailFragment.newInstance(viewModel, user) + guildInformationFragment = GuildDetailFragment.newInstance(viewModel) fragment = guildInformationFragment } 1 -> { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt index 68afa5dcf..4a70e5f62 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt @@ -279,13 +279,16 @@ class PartyDetailFragment : BaseFragment() { fragmentManager?.let { fragment.show(it, "questDialog") } } - private fun leaveParty() { + internal fun leaveParty() { val context = context if (context != null) { val alert = HabiticaAlertDialog(context) alert.setMessage(R.string.leave_party_confirmation) - alert.addButton(R.string.yes, true) { _, _ -> - viewModel?.leaveGroup { } + alert.addButton(R.string.keep_challenges, true) { _, _ -> + viewModel?.leaveGroup(true) { } + } + alert.addButton(R.string.leave_challenges, true) { _, _ -> + viewModel?.leaveGroup(false) { } } alert.addButton(R.string.no, false) alert.show() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt index abe5cfaee..7783692fb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt @@ -22,7 +22,6 @@ import com.habitrpg.android.habitica.ui.helpers.bindView import com.habitrpg.android.habitica.ui.helpers.resetViews import com.habitrpg.android.habitica.ui.viewmodels.GroupViewType import com.habitrpg.android.habitica.ui.viewmodels.PartyViewModel -import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import io.reactivex.functions.Consumer import java.util.* @@ -153,18 +152,7 @@ class PartyFragment : BaseMainFragment() { return true } R.id.menu_guild_leave -> { - context?.let { - val alert = HabiticaAlertDialog(it) - alert.setTitle(context?.getString(R.string.leave_party)) - alert.setMessage(context?.getString(R.string.leave_party_confirmation)) - alert.addButton(R.string.yes, true) { _, _ -> - viewModel.leaveGroup { - fragmentManager?.popBackStack() - } - } - alert.addButton(R.string.no, false) - alert.show() - } + (firstFragment as? PartyDetailFragment)?.leaveParty() return true } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt index 5d3dff991..70d522aaa 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/GroupViewModel.kt @@ -160,9 +160,9 @@ open class GroupViewModel : BaseViewModel() { } } - fun leaveGroup(function: (() -> Unit)? = null) { - disposable.add(socialRepository.leaveGroup(this.group.value?.id ?: "") - .flatMap { userRepository.retrieveUser(false, true) } + fun leaveGroup(keepChallenges: Boolean = true, function: (() -> Unit)? = null) { + disposable.add(socialRepository.leaveGroup(this.group.value?.id ?: "", keepChallenges) + .flatMap { userRepository.retrieveUser(withTasks = false, forced = true) } .subscribe(Consumer { function?.invoke() }, RxErrorHandler.handleEmptyError()))