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()))