Fix various issues

This commit is contained in:
Phillip Thelen 2018-11-12 13:39:00 +01:00
parent 17c9b0b09c
commit c2fe0297a2
24 changed files with 159 additions and 86 deletions

View file

@ -70,10 +70,24 @@
<com.habitrpg.android.habitica.ui.views.ValueBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/hpBar"
android:id="@+id/hp_bar"
app:barForegroundColor="@color/hpColor"
app:description="@string/HP_default"
app:lightBackground="true"/>
<com.habitrpg.android.habitica.ui.views.ValueBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/exp_bar"
app:barForegroundColor="@color/xpColor"
app:description="@string/XP_default"
app:lightBackground="true"/>
<com.habitrpg.android.habitica.ui.views.ValueBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/mp_bar"
app:barForegroundColor="@color/mpColor"
app:description="@string/MP_default"
app:lightBackground="true"/>
</LinearLayout>
</LinearLayout>

View file

@ -173,40 +173,27 @@
android:layout_height="wrap_content"
style="@style/CardContent"
android:divider="?android:listDivider"
android:dividerPadding="@dimen/spacing_medium"
android:showDividers="middle"
android:orientation="vertical">
<net.pherth.android.emoji_library.EmojiTextView
android:id="@+id/groupSummaryView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/spacing_medium" />
<net.pherth.android.emoji_library.EmojiTextView
android:id="@+id/groupDescriptionView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/leadernameWrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/leadernameTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/leaderMessageWrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<net.pherth.android.emoji_library.EmojiTextView
android:id="@+id/leaderMessageTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
android:padding="@dimen/spacing_medium"/>
<LinearLayout
android:id="@+id/gemCountWrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:orientation="horizontal"
android:padding="@dimen/spacing_medium">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"

View file

@ -68,6 +68,20 @@
app:barForegroundColor="@color/hpColor"
app:description="@string/HP_default"
app:lightBackground="true"/>
<com.habitrpg.android.habitica.ui.views.ValueBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/exp_bar"
app:barForegroundColor="@color/xpColor"
app:description="@string/XP_default"
app:lightBackground="true"/>
<com.habitrpg.android.habitica.ui.views.ValueBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/mp_bar"
app:barForegroundColor="@color/mpColor"
app:description="@string/MP_default"
app:lightBackground="true"/>
</LinearLayout>
</LinearLayout>

View file

@ -115,8 +115,8 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap
return Flowable.empty()
}
return apiClient.leaveGroup(id)
.doOnNext { _ -> localRepository.updateMembership(userID, id, false) }
.flatMapMaybe { localRepository.getGroup(id).firstElement() }
.doOnNext { _ -> localRepository.executeTransaction { localRepository.updateMembership(userID, id, false) } }
}
override fun joinGroup(id: String?): Flowable<Group> {
@ -150,7 +150,7 @@ class SocialRepositoryImpl(localRepository: SocialLocalRepository, apiClient: Ap
val memberships = groups.map {
GroupMembership(userID, it.id)
}
localRepository.save(memberships)
localRepository.saveGroupMemberships(userID, memberships)
}
localRepository.save(groups)
}

View file

@ -44,4 +44,5 @@ interface SocialLocalRepository : BaseLocalRepository {
fun getInboxMessages(userId: String, replyToUserID: String?): Flowable<RealmResults<ChatMessage>>
fun getInboxOverviewList(userId: String): Flowable<RealmResults<ChatMessage>>
fun saveGroupMemberships(userID: String?, memberships: List<GroupMembership>)
}

View file

@ -45,6 +45,23 @@ class RealmSocialLocalRepository(realm: Realm) : RealmBaseLocalRepository(realm)
}
}
override fun saveGroupMemberships(userID: String?, memberships: List<GroupMembership>) {
realm.executeTransaction { realm.insertOrUpdate(memberships) }
if (userID != null) {
val existingMemberships = realm.where(GroupMembership::class.java).equalTo("userID", userID).findAll()
val membersToRemove = ArrayList<GroupMembership>()
for (existingMembership in existingMemberships) {
val isStillMember = memberships.any { existingMembership.combinedID == it.combinedID }
if (!isStillMember) {
membersToRemove.add(existingMembership)
}
}
realm.executeTransaction {
membersToRemove.forEach { it.deleteFromRealm() }
}
}
}
override fun getPublicGuilds(): Flowable<RealmResults<Group>> = realm.where(Group::class.java)
.equalTo("type", "guild")
.equalTo("privacy", "public")

View file

@ -18,6 +18,8 @@ open class Group : RealmObject() {
var description: String? = null
var summary: String? = null
var leaderID: String? = null
var leaderName: String? = null
@ -44,13 +46,8 @@ open class Group : RealmObject() {
if (this === other) {
return true
}
if (other == null || javaClass != other.javaClass) {
return false
}
val group = other as Group
return id == group.id
val group = other as? Group
return id == group?.id
}

View file

@ -69,8 +69,7 @@ open class Task : RealmObject, Parcelable {
var isDue: Boolean? = null
var nextDue: Date? = null
var yesterDaily: Boolean? = null
var nextDue: RealmList<Date>? = null
//Needed for offline creating/updating
var isSaving: Boolean = false
@ -171,14 +170,15 @@ open class Task : RealmObject, Parcelable {
today.add(Calendar.DAY_OF_MONTH, -1)
}
if (nextDue != null && !isDisplayedActive) {
val nextDate = nextDue?.firstOrNull()
if (nextDate != null && !isDisplayedActive) {
val nextDueCalendar = GregorianCalendar()
nextDueCalendar.time = nextDue
nextDueCalendar.time = nextDate
newTime.set(nextDueCalendar.get(Calendar.YEAR), nextDueCalendar.get(Calendar.MONTH), nextDueCalendar.get(Calendar.DAY_OF_MONTH))
return newTime.time
}
return newTime.time
return if (isDisplayedActive) newTime.time else null
}
fun parseMarkdown() {
@ -198,7 +198,7 @@ open class Task : RealmObject, Parcelable {
fun markdownText(callback: (CharSequence) -> Unit): CharSequence {
if (this.parsedText != null) {
return this.parsedText as CharSequence
return this.parsedText ?: ""
}
MarkdownParser.parseMarkdownAsync(this.text, Consumer { parsedText ->

View file

@ -146,4 +146,8 @@ class VerifyUsernameActivity: BaseActivity() {
finish()
}
}
override fun onBackPressed() {
moveTaskToBack(true)
}
}

View file

@ -31,7 +31,12 @@ import io.realm.OrderedRealmCollection
import io.realm.RealmRecyclerViewAdapter
import net.pherth.android.emoji_library.EmojiTextView
class ChatRecyclerViewAdapter(data: OrderedRealmCollection<ChatMessage>?, autoUpdate: Boolean, internal var user: User?, private val isTavern: Boolean, private val releasedUsernames: Boolean) : RealmRecyclerViewAdapter<ChatMessage, RecyclerView.ViewHolder>(data, autoUpdate) {
class ChatRecyclerViewAdapter(data: OrderedRealmCollection<ChatMessage>?, autoUpdate: Boolean, user: User?, private val isTavern: Boolean, private val releasedUsernames: Boolean) : RealmRecyclerViewAdapter<ChatMessage, RecyclerView.ViewHolder>(data, autoUpdate) {
internal var user = user
set(value) {
field = value
uuid = user?.id ?: ""
}
private var uuid: String = ""
private var expandedMessageId: String? = null

View file

@ -1,7 +1,5 @@
package com.habitrpg.android.habitica.ui.adapter.social
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
@ -13,7 +11,6 @@ import com.habitrpg.android.habitica.models.members.Member
import com.habitrpg.android.habitica.models.user.Stats
import com.habitrpg.android.habitica.ui.AvatarView
import com.habitrpg.android.habitica.ui.AvatarWithBarsViewModel
import com.habitrpg.android.habitica.ui.helpers.ViewHelper
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.android.habitica.ui.views.ValueBar
@ -26,6 +23,8 @@ import io.realm.RealmRecyclerViewAdapter
class PartyMemberRecyclerViewAdapter(data: OrderedRealmCollection<Member>?, autoUpdate: Boolean) : RealmRecyclerViewAdapter<Member, PartyMemberRecyclerViewAdapter.MemberViewHolder>(data, autoUpdate) {
var leaderID: String? = null
private val userClickedEvents = PublishSubject.create<String>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MemberViewHolder {
@ -49,11 +48,18 @@ class PartyMemberRecyclerViewAdapter(data: OrderedRealmCollection<Member>?, auto
private val sublineTextView: TextView by bindView(R.id.subline_textview)
private val buffIconView: ImageView by bindView(R.id.buff_icon_view)
private val classIconView: ImageView by bindView(R.id.class_icon_view)
private val hpBar: ValueBar by bindView(R.id.hpBar)
private val hpBar: ValueBar by bindView(R.id.hp_bar)
private val expBar: ValueBar by bindView(R.id.exp_bar)
private val mpBar: ValueBar by bindView(R.id.mp_bar)
private val leaderTextView: TextView by bindView(R.id.leader_textview)
init {
hpBar.setLightBackground(true)
hpBar.setIcon(HabiticaIconsHelper.imageOfHeartLightBg())
expBar.setLightBackground(true)
expBar.setIcon(HabiticaIconsHelper.imageOfExperience())
mpBar.setLightBackground(true)
mpBar.setIcon(HabiticaIconsHelper.imageOfMagic())
buffIconView.setImageBitmap(HabiticaIconsHelper.imageOfBuffIcon())
}
@ -61,7 +67,11 @@ class PartyMemberRecyclerViewAdapter(data: OrderedRealmCollection<Member>?, auto
fun bind(user: Member) {
avatarView.setAvatar(user)
user.stats.notNull { AvatarWithBarsViewModel.setHpBarData(hpBar, it) }
user.stats.notNull {
AvatarWithBarsViewModel.setHpBarData(hpBar, it)
expBar.set(it.exp ?: 0.0, it.toNextLevel?.toDouble() ?: 0.0)
mpBar.set(it.mp ?: 0.0, it.maxMP?.toDouble() ?: 0.0)
}
displayNameTextView.username = user.profile?.name
displayNameTextView.tier = user.contributor?.level ?: 0
@ -98,6 +108,8 @@ class PartyMemberRecyclerViewAdapter(data: OrderedRealmCollection<Member>?, auto
itemView.isClickable = true
itemView.setOnClickListener { userClickedEvents.onNext(user.id ?: "") }
leaderTextView.visibility = if (user.id == leaderID) View.VISIBLE else View.GONE
}
}
}

View file

@ -115,7 +115,7 @@ class PublicGuildsRecyclerViewAdapter(data: OrderedRealmCollection<Group>?, auto
fun bind(guild: Group, isInGroup: Boolean) {
this.nameTextView.text = guild.name
this.memberCountTextView.text = guild.memberCount.toString()
this.descriptionTextView.text = MarkdownParser.parseMarkdown(guild.description)
this.descriptionTextView.text = MarkdownParser.parseMarkdown(guild.summary)
if (isInGroup) {
this.joinLeaveButton.setText(R.string.leave)
} else {

View file

@ -92,8 +92,6 @@ class ChatFragment constructor(private val viewModel: PartyViewModel) : BaseFrag
compositeSubscription.add(viewModel.getChatMessages().firstElement().subscribe(Consumer<RealmResults<ChatMessage>> { this.setChatMessages(it) }, RxErrorHandler.handleEmptyError()))
viewModel.getUserData().observe(viewLifecycleOwner, Observer {
chatAdapter?.user = it
if (it?.flags?.isCommunityGuidelinesAccepted == true) {

View file

@ -9,6 +9,7 @@ import android.graphics.Shader
import android.graphics.drawable.BitmapDrawable
import android.net.Uri
import android.os.Bundle
import android.text.method.LinkMovementMethod
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -119,6 +120,9 @@ class GroupInformationFragment : BaseFragment() {
}, RxErrorHandler.handleEmptyError())
}
}
groupDescriptionView.movementMethod = LinkMovementMethod.getInstance()
groupSummaryView.movementMethod = LinkMovementMethod.getInstance()
}
private fun refresh() {
@ -170,12 +174,9 @@ class GroupInformationFragment : BaseFragment() {
groupDescriptionWrapper.visibility = groupItemVisibility
groupDescriptionView.text = MarkdownParser.parseMarkdown(group?.description)
leadernameWrapper.visibility = if (group?.leaderName != null) View.VISIBLE else View.GONE
leadernameTextView.text = group?.leaderName
leaderMessageWrapper.visibility = if (group?.leaderMessage != null) View.VISIBLE else View.GONE
leaderMessageTextView.text = group?.leaderMessage
leadernameWrapper.visibility = if (group?.balance != null && group.balance > 0) View.VISIBLE else View.GONE
leadernameTextView.text = (group?.balance ?: 0 * 4.0).toString()
groupSummaryView.text = MarkdownParser.parseMarkdown(group?.summary)
gemCountWrapper.visibility = if (group?.balance != null && group.balance > 0) View.VISIBLE else View.GONE
gemCountTextView.text = (group?.balance ?: 0 * 4.0).toInt().toString()
}
companion object {

View file

@ -76,10 +76,10 @@ class GuildsOverviewFragment : BaseMainFragment(), View.OnClickListener, android
}
private fun fetchGuilds() {
this.socialRepository.retrieveGroups("guilds")
compositeSubscription.add(this.socialRepository.retrieveGroups("guilds")
.subscribe(Consumer {
swipeRefreshLayout?.isRefreshing = false
}, RxErrorHandler.handleEmptyError())
}, RxErrorHandler.handleEmptyError()))
}
private fun setGuilds(guilds: RealmResults<Group>) {

View file

@ -49,9 +49,9 @@ class PublicGuildsFragment : BaseMainFragment(), SearchView.OnQueryTextListener
recyclerView?.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this.activity)
recyclerView?.addItemDecoration(androidx.recyclerview.widget.DividerItemDecoration(getActivity()!!, androidx.recyclerview.widget.DividerItemDecoration.VERTICAL))
viewAdapter = PublicGuildsRecyclerViewAdapter(null, true)
viewAdapter.setMemberGuildIDs(this.memberGuildIDs?.toMutableList() ?: mutableListOf<String>())
viewAdapter.apiClient = this.apiClient
viewAdapter = PublicGuildsRecyclerViewAdapter(null, true)
recyclerView?.adapter = viewAdapter
recyclerView?.itemAnimator = SafeDefaultItemAnimator()
this.fetchGuilds()
@ -63,12 +63,12 @@ class PublicGuildsFragment : BaseMainFragment(), SearchView.OnQueryTextListener
}
private fun fetchGuilds() {
this.socialRepository.getPublicGuilds()
compositeSubscription.add(this.socialRepository.getPublicGuilds()
.firstElement()
.subscribe(Consumer { groups ->
this@PublicGuildsFragment.viewAdapter.updateData(groups)
}, RxErrorHandler.handleEmptyError())
this.socialRepository.retrieveGroups("publicGuilds").subscribe(Consumer { }, RxErrorHandler.handleEmptyError())
}, RxErrorHandler.handleEmptyError()))
compositeSubscription.add(this.socialRepository.retrieveGroups("publicGuilds").subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
}
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {

View file

@ -175,9 +175,9 @@ class PartyDetailFragment constructor(private val viewModel: PartyViewModel) : B
}
if (viewModel.isQuestActive) {
questProgressView?.visibility = View.VISIBLE
questProgressView?.setData(questContent, viewModel.getQuestData().value?.progress)
questProgressView?.setData(questContent, viewModel.getGroupData().value?.quest?.progress)
questParticipationView?.text = getString(R.string.number_participants, viewModel.getQuestData().value?.members?.size)
questParticipationView?.text = getString(R.string.number_participants, viewModel.getGroupData().value?.quest?.members?.size)
} else {
questProgressView?.visibility = View.GONE
}

View file

@ -219,7 +219,7 @@ class PartyFragment : BaseMainFragment() {
}
2 -> {
if (partyMemberListFragment == null) {
partyMemberListFragment = PartyMemberListFragment()
partyMemberListFragment = PartyMemberListFragment(viewModel)
if (user?.hasParty() == true) {
partyMemberListFragment?.setPartyId(user?.party?.id ?: "")
}

View file

@ -1,5 +1,6 @@
package com.habitrpg.android.habitica.ui.fragments.social.party
import android.annotation.SuppressLint
import android.os.Bundle
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import androidx.recyclerview.widget.LinearLayoutManager
@ -7,6 +8,7 @@ import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.Observer
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.AppComponent
import com.habitrpg.android.habitica.data.SocialRepository
@ -18,13 +20,15 @@ import com.habitrpg.android.habitica.ui.adapter.social.PartyMemberRecyclerViewAd
import com.habitrpg.android.habitica.ui.fragments.BaseFragment
import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator
import com.habitrpg.android.habitica.ui.helpers.bindView
import com.habitrpg.android.habitica.ui.viewmodels.PartyViewModel
import io.reactivex.functions.Consumer
import javax.inject.Inject
/**
* Created by Negue on 15.09.2015.
*/
class PartyMemberListFragment : BaseFragment() {
@SuppressLint("ValidFragment")
class PartyMemberListFragment constructor(private val viewModel: PartyViewModel) : BaseFragment() {
@Inject
lateinit var socialRepository: SocialRepository
@ -59,9 +63,18 @@ class PartyMemberListFragment : BaseFragment() {
getUsers()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel.getGroupData().observe(viewLifecycleOwner, Observer {
adapter?.leaderID = it?.leaderID
adapter?.notifyDataSetChanged()
})
}
private fun refreshMembers() {
setRefreshing(true)
socialRepository.retrieveGroupMembers(partyId ?: "", true).doOnComplete { setRefreshing(false) }.subscribe(Consumer { }, RxErrorHandler.handleEmptyError())
compositeSubscription.add(socialRepository.retrieveGroupMembers(partyId ?: "", true).doOnComplete { setRefreshing(false) }.subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
}
private fun setRefreshing(isRefreshing: Boolean) {
@ -76,8 +89,8 @@ class PartyMemberListFragment : BaseFragment() {
if (partyId == null) {
return
}
socialRepository.getGroupMembers(partyId ?: "").firstElement().subscribe(Consumer { users ->
compositeSubscription.add(socialRepository.getGroupMembers(partyId ?: "").firstElement().subscribe(Consumer { users ->
adapter?.updateData(users)
}, RxErrorHandler.handleEmptyError())
}, RxErrorHandler.handleEmptyError()))
}
}

View file

@ -18,6 +18,7 @@ import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.TaskRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.events.commands.AddNewTaskCommand
import com.habitrpg.android.habitica.extensions.notNull
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.helpers.TaskFilterHelper
import com.habitrpg.android.habitica.models.tasks.Task
@ -88,12 +89,13 @@ open class TaskRecyclerViewFragment : BaseFragment(), View.OnClickListener, andr
recyclerAdapter?.errorButtonEvents?.subscribe(Consumer {
taskRepository.syncErroredTasks().subscribe(Consumer {}, RxErrorHandler.handleEmptyError())
}, RxErrorHandler.handleEmptyError())
}, RxErrorHandler.handleEmptyError()).notNull { compositeSubscription.add(it) }
if (this.classType != null) {
taskRepository.getTasks(this.classType ?: "", userID).firstElement().subscribe(Consumer { this.recyclerAdapter?.updateUnfilteredData(it)
compositeSubscription.add(taskRepository.getTasks(this.classType ?: "", userID).firstElement().subscribe(Consumer {
this.recyclerAdapter?.updateUnfilteredData(it)
this.recyclerAdapter?.filter()
}, RxErrorHandler.handleEmptyError())
}, RxErrorHandler.handleEmptyError()))
}
}
@ -157,11 +159,11 @@ open class TaskRecyclerViewFragment : BaseFragment(), View.OnClickListener, andr
val movingTaskID = movingTaskID
if (fromPosition != null && movingTaskID != null) {
recyclerAdapter?.ignoreUpdates = true
taskRepository.updateTaskPosition(classType ?: "", movingTaskID, viewHolder.adapterPosition)
compositeSubscription.add(taskRepository.updateTaskPosition(classType ?: "", movingTaskID, viewHolder.adapterPosition)
.delay(1, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer { recyclerAdapter?.ignoreUpdates = false
recyclerAdapter?.notifyDataSetChanged()}, RxErrorHandler.handleEmptyError())
recyclerAdapter?.notifyDataSetChanged()}, RxErrorHandler.handleEmptyError()))
}
this.fromPosition = null
this.movingTaskID = null
@ -260,10 +262,10 @@ open class TaskRecyclerViewFragment : BaseFragment(), View.OnClickListener, andr
override fun onRefresh() {
refreshLayout.isRefreshing = true
userRepository.retrieveUser(true, true)
compositeSubscription.add(userRepository.retrieveUser(true, true)
.doOnTerminate {
refreshLayout?.isRefreshing = false
}.subscribe(Consumer { }, RxErrorHandler.handleEmptyError())
}.subscribe(Consumer { }, RxErrorHandler.handleEmptyError()))
}
fun setActiveFilter(activeFilter: String) {

View file

@ -27,7 +27,6 @@ object MarkdownParser {
private val processor = AndDown()
private val regex = Pattern.compile("(?!\\b)@[\\w-]+")
private val colorSpan = ForegroundColorSpan(Color.parseColor("#6133b4"))
/**
* Parses formatted markdown and returns it as styled CharSequence
@ -48,6 +47,7 @@ object MarkdownParser {
val matcher = regex.matcher(output)
while (matcher.find()) {
val colorSpan = ForegroundColorSpan(Color.parseColor("#6133b4"))
output.setSpan(colorSpan, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}

View file

@ -12,10 +12,8 @@ import kotlinx.android.synthetic.main.fragment_chat.*
class PartyViewModel: GroupViewModel() {
private val quest = Transformations.map(getGroupData()) { it?.quest }
internal val isQuestActive: Boolean
get() = quest.value?.active == true
get() = getGroupData().value?.quest?.active == true
init {
groupViewType = GroupViewType.PARTY
@ -37,8 +35,6 @@ class PartyViewModel: GroupViewModel() {
}
}
fun getQuestData(): LiveData<Quest?> = quest
fun showParticipantButtons(): Boolean {
val user = getUserData().value
return !(user?.party == null || user.party?.quest == null) && !isQuestActive && user.party?.quest?.RSVPNeeded == true

View file

@ -19,12 +19,16 @@ public class DateDeserializer implements JsonDeserializer<Date>, JsonSerializer<
private final DateFormat dateFormat;
private final DateFormat alternativeFormat;
private final DateFormat nextDueFormat;
public DateDeserializer() {
dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
alternativeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
alternativeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
nextDueFormat = new SimpleDateFormat("E MMM dd yyyy HH:mm:ss zzzz", Locale.US);
nextDueFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
}
@Override
@ -45,14 +49,18 @@ public class DateDeserializer implements JsonDeserializer<Date>, JsonSerializer<
return alternativeFormat.parse(jsonElement.getAsString());
} catch (ParseException e1) {
try {
Long timestamp = jsonElement.getAsLong();
if (timestamp > 0) {
return new Date(timestamp);
} else {
return nextDueFormat.parse(jsonElement.getAsString());
} catch (ParseException e2) {
try {
Long timestamp = jsonElement.getAsLong();
if (timestamp > 0) {
return new Date(timestamp);
} else {
return null;
}
} catch (NumberFormatException e3) {
return null;
}
} catch (NumberFormatException e2) {
return null;
}
}
}

View file

@ -29,6 +29,9 @@ class GroupSerialization : JsonDeserializer<Group>, JsonSerializer<Group> {
if (obj.has("description") && !obj.get("description").isJsonNull) {
group.description = obj.get("description").asString
}
if (obj.has("summary") && !obj.get("summary").isJsonNull) {
group.summary = obj.get("summary").asString
}
if (obj.has("leaderMessage") && !obj.get("leaderMessage").isJsonNull) {
group.leaderMessage = obj.get("leaderMessage").asString
}
@ -110,6 +113,7 @@ class GroupSerialization : JsonDeserializer<Group>, JsonSerializer<Group> {
val obj = JsonObject()
obj.addProperty("name", src.name)
obj.addProperty("description", src.description)
obj.addProperty("summary", src.summary)
obj.addProperty("logo", src.logo)
obj.addProperty("type", src.type)
obj.addProperty("type", src.type)