mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-05-19 12:18:59 +00:00
Fix various issues
This commit is contained in:
parent
17c9b0b09c
commit
c2fe0297a2
24 changed files with 159 additions and 86 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ->
|
||||
|
|
|
|||
|
|
@ -146,4 +146,8 @@ class VerifyUsernameActivity: BaseActivity() {
|
|||
finish()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBackPressed() {
|
||||
moveTaskToBack(true)
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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>) {
|
||||
|
|
|
|||
|
|
@ -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?) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ?: "")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue