mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-05-18 11:49:01 +00:00
Fix various issues
This commit is contained in:
parent
e6ca51c599
commit
2fe8bc25d0
15 changed files with 200 additions and 175 deletions
|
|
@ -13,13 +13,15 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:text="@string/enter_recipient_username"
|
||||
android:textSize="12sp"
|
||||
android:textColor="@color/text_ternary"/>
|
||||
android:textColor="@color/text_ternary"
|
||||
android:labelFor="@id/uuidEditText"/>
|
||||
<EditText
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/uuidEditText" android:layout_gravity="center_horizontal"
|
||||
android:focusable="true"
|
||||
android:maxLines="1"/>
|
||||
android:maxLines="1"
|
||||
android:inputType="textNoSuggestions" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progress_circular"
|
||||
|
|
|
|||
|
|
@ -1,52 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/refreshLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<FrameLayout
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="vertical">
|
||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
android:id="@+id/refreshLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/emptyView"
|
||||
style="@style/EmptyView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="60dp"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/empty_icon_view"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="4dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/emptyViewTitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="6dp"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/text_ternary"
|
||||
android:textSize="@dimen/card_medium_text"
|
||||
tools:text="No Items" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/emptyViewDescription"
|
||||
style="@style/Body2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/text_ternary"
|
||||
tools:text="No Items" />
|
||||
</LinearLayout>
|
||||
|
||||
android:layout_height="match_parent"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
<com.habitrpg.android.habitica.ui.helpers.RecyclerViewEmptySupport
|
||||
android:id="@+id/recyclerView"
|
||||
android:layout_width="match_parent"
|
||||
|
|
@ -55,6 +18,41 @@
|
|||
android:scrollbarSize="3dp"
|
||||
android:scrollbarThumbVertical="@color/scrollbarThumb"
|
||||
android:scrollbars="vertical" />
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
|
||||
</FrameLayout>
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
<LinearLayout
|
||||
android:id="@+id/emptyView"
|
||||
style="@style/EmptyView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="60dp"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/empty_icon_view"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="4dp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/emptyViewTitle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="6dp"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/text_ternary"
|
||||
android:textSize="@dimen/card_medium_text"
|
||||
tools:text="No Items" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/emptyViewDescription"
|
||||
style="@style/Body2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:textColor="@color/text_ternary"
|
||||
tools:text="No Items" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,124 @@
|
|||
package com.habitrpg.android.habitica.api;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.habitrpg.android.habitica.models.Achievement;
|
||||
import com.habitrpg.android.habitica.models.ContentResult;
|
||||
import com.habitrpg.android.habitica.models.FAQArticle;
|
||||
import com.habitrpg.android.habitica.models.Notification;
|
||||
import com.habitrpg.android.habitica.models.Skill;
|
||||
import com.habitrpg.android.habitica.models.Tag;
|
||||
import com.habitrpg.android.habitica.models.TutorialStep;
|
||||
import com.habitrpg.android.habitica.models.WorldState;
|
||||
import com.habitrpg.android.habitica.models.inventory.Customization;
|
||||
import com.habitrpg.android.habitica.models.inventory.Equipment;
|
||||
import com.habitrpg.android.habitica.models.inventory.Quest;
|
||||
import com.habitrpg.android.habitica.models.inventory.QuestCollect;
|
||||
import com.habitrpg.android.habitica.models.inventory.QuestDropItem;
|
||||
import com.habitrpg.android.habitica.models.members.Member;
|
||||
import com.habitrpg.android.habitica.models.responses.FeedResponse;
|
||||
import com.habitrpg.android.habitica.models.social.Challenge;
|
||||
import com.habitrpg.android.habitica.models.social.ChatMessage;
|
||||
import com.habitrpg.android.habitica.models.social.FindUsernameResult;
|
||||
import com.habitrpg.android.habitica.models.social.Group;
|
||||
import com.habitrpg.android.habitica.models.tasks.Task;
|
||||
import com.habitrpg.android.habitica.models.tasks.TaskList;
|
||||
import com.habitrpg.android.habitica.models.user.OwnedItem;
|
||||
import com.habitrpg.android.habitica.models.user.OwnedMount;
|
||||
import com.habitrpg.android.habitica.models.user.OwnedPet;
|
||||
import com.habitrpg.android.habitica.models.user.Purchases;
|
||||
import com.habitrpg.android.habitica.models.user.User;
|
||||
import com.habitrpg.android.habitica.utils.AchievementListDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.BooleanAsIntAdapter;
|
||||
import com.habitrpg.android.habitica.utils.ChallengeDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.ChallengeListDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.ChatMessageDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.ContentDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.CustomizationDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.DateDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.EquipmentListDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.FAQArticleListDeserilializer;
|
||||
import com.habitrpg.android.habitica.utils.FeedResponseDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.FindUsernameResultDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.GroupSerialization;
|
||||
import com.habitrpg.android.habitica.utils.MemberSerialization;
|
||||
import com.habitrpg.android.habitica.utils.OwnedItemListDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.OwnedMountListDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.NotificationDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.OwnedPetListDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.PurchasedDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.QuestCollectDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.QuestDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.QuestDropItemsListSerialization;
|
||||
import com.habitrpg.android.habitica.utils.SkillDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.TaskListDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.TaskSerializer;
|
||||
import com.habitrpg.android.habitica.utils.TaskTagDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.TutorialStepListDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.UserDeserializer;
|
||||
import com.habitrpg.android.habitica.utils.WorldStateSerialization;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import io.realm.RealmList;
|
||||
import retrofit2.converter.gson.GsonConverterFactory;
|
||||
|
||||
public class GSonFactoryCreator {
|
||||
|
||||
public static GsonConverterFactory create() {
|
||||
Type skillListType = new TypeToken<List<Skill>>() {}.getType();
|
||||
Type taskTagClassListType = new TypeToken<RealmList<Tag>>() {}.getType();
|
||||
Type customizationListType = new TypeToken<RealmList<Customization>>() {}.getType();
|
||||
Type tutorialStepListType = new TypeToken<RealmList<TutorialStep>>() {}.getType();
|
||||
Type faqArticleListType = new TypeToken<RealmList<FAQArticle>>() {}.getType();
|
||||
Type itemDataListType = new TypeToken<RealmList<Equipment>>() {}.getType();
|
||||
Type questCollectListType = new TypeToken<RealmList<QuestCollect>>() {}.getType();
|
||||
Type chatMessageListType = new TypeToken<RealmList<ChatMessage>>() {}.getType();
|
||||
Type challengeListType = new TypeToken<List<Challenge>>() {}.getType();
|
||||
Type challengeRealmListType = new TypeToken<RealmList<Challenge>>() {}.getType();
|
||||
Type questDropItemListType = new TypeToken<RealmList<QuestDropItem>>() {}.getType();
|
||||
Type ownedItemListType = new TypeToken<RealmList<OwnedItem>>() {}.getType();
|
||||
Type ownedPetListType = new TypeToken<RealmList<OwnedPet>>() {}.getType();
|
||||
Type ownedMountListType = new TypeToken<RealmList<OwnedMount>>() {}.getType();
|
||||
Type achievementsListType = new TypeToken<List<Achievement>>() {}.getType();
|
||||
|
||||
|
||||
Gson gson = new GsonBuilder()
|
||||
.registerTypeAdapter(taskTagClassListType, new TaskTagDeserializer())
|
||||
.registerTypeAdapter(Boolean.class, new BooleanAsIntAdapter())
|
||||
.registerTypeAdapter(boolean.class, new BooleanAsIntAdapter())
|
||||
.registerTypeAdapter(skillListType, new SkillDeserializer())
|
||||
.registerTypeAdapter(TaskList.class, new TaskListDeserializer())
|
||||
.registerTypeAdapter(Purchases.class, new PurchasedDeserializer())
|
||||
.registerTypeAdapter(customizationListType, new CustomizationDeserializer())
|
||||
.registerTypeAdapter(tutorialStepListType, new TutorialStepListDeserializer())
|
||||
.registerTypeAdapter(faqArticleListType, new FAQArticleListDeserilializer())
|
||||
.registerTypeAdapter(Group.class, new GroupSerialization())
|
||||
.registerTypeAdapter(Date.class, new DateDeserializer())
|
||||
.registerTypeAdapter(itemDataListType, new EquipmentListDeserializer())
|
||||
.registerTypeAdapter(ChatMessage.class, new ChatMessageDeserializer())
|
||||
.registerTypeAdapter(Task.class, new TaskSerializer())
|
||||
.registerTypeAdapter(ContentResult.class, new ContentDeserializer())
|
||||
.registerTypeAdapter(FeedResponse.class, new FeedResponseDeserializer())
|
||||
.registerTypeAdapter(Challenge.class, new ChallengeDeserializer())
|
||||
.registerTypeAdapter(User.class, new UserDeserializer())
|
||||
.registerTypeAdapter(questCollectListType, new QuestCollectDeserializer())
|
||||
.registerTypeAdapter(challengeListType, new ChallengeListDeserializer())
|
||||
.registerTypeAdapter(challengeRealmListType, new ChallengeListDeserializer())
|
||||
.registerTypeAdapter(questDropItemListType, new QuestDropItemsListSerialization())
|
||||
.registerTypeAdapter(ownedItemListType, new OwnedItemListDeserializer())
|
||||
.registerTypeAdapter(ownedPetListType, new OwnedPetListDeserializer())
|
||||
.registerTypeAdapter(ownedMountListType, new OwnedMountListDeserializer())
|
||||
.registerTypeAdapter(achievementsListType, new AchievementListDeserializer())
|
||||
.registerTypeAdapter(Quest.class, new QuestDeserializer())
|
||||
.registerTypeAdapter(Member.class, new MemberSerialization())
|
||||
.registerTypeAdapter(WorldState.class, new WorldStateSerialization())
|
||||
.registerTypeAdapter(FindUsernameResult.class, new FindUsernameResultDeserializer())
|
||||
.registerTypeAdapter(Notification.class, new NotificationDeserializer())
|
||||
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
|
||||
.create();
|
||||
return GsonConverterFactory.create(gson);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
package com.habitrpg.android.habitica.api
|
||||
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.google.gson.reflect.TypeToken
|
||||
import com.habitrpg.android.habitica.models.*
|
||||
import com.habitrpg.android.habitica.models.inventory.*
|
||||
import com.habitrpg.android.habitica.models.members.Member
|
||||
import com.habitrpg.android.habitica.models.responses.FeedResponse
|
||||
import com.habitrpg.android.habitica.models.social.Challenge
|
||||
import com.habitrpg.android.habitica.models.social.ChatMessage
|
||||
import com.habitrpg.android.habitica.models.social.FindUsernameResult
|
||||
import com.habitrpg.android.habitica.models.social.Group
|
||||
import com.habitrpg.android.habitica.models.tasks.Task
|
||||
import com.habitrpg.android.habitica.models.tasks.TaskList
|
||||
import com.habitrpg.android.habitica.models.user.*
|
||||
import com.habitrpg.android.habitica.utils.*
|
||||
import io.realm.RealmList
|
||||
import retrofit2.converter.gson.GsonConverterFactory
|
||||
import java.util.*
|
||||
|
||||
object GSonFactoryCreator {
|
||||
fun create(): GsonConverterFactory {
|
||||
val skillListType = object : TypeToken<List<Skill>?>() {}.type
|
||||
val taskTagClassListType = object : TypeToken<RealmList<Tag?>?>() {}.type
|
||||
val customizationListType = object : TypeToken<RealmList<Customization?>?>() {}.type
|
||||
val tutorialStepListType = object : TypeToken<RealmList<TutorialStep?>?>() {}.type
|
||||
val faqArticleListType = object : TypeToken<RealmList<FAQArticle?>?>() {}.type
|
||||
val itemDataListType = object : TypeToken<RealmList<Equipment?>?>() {}.type
|
||||
val questCollectListType = object : TypeToken<RealmList<QuestCollect?>?>() {}.type
|
||||
val chatMessageListType = object : TypeToken<RealmList<ChatMessage?>?>() {}.type
|
||||
val challengeListType = object : TypeToken<List<Challenge?>?>() {}.type
|
||||
val challengeRealmListType = object : TypeToken<RealmList<Challenge?>?>() {}.type
|
||||
val questDropItemListType = object : TypeToken<RealmList<QuestDropItem?>?>() {}.type
|
||||
val ownedItemListType = object : TypeToken<RealmList<OwnedItem?>?>() {}.type
|
||||
val ownedPetListType = object : TypeToken<RealmList<OwnedPet?>?>() {}.type
|
||||
val ownedMountListType = object : TypeToken<RealmList<OwnedMount?>?>() {}.type
|
||||
val achievementsListType = object : TypeToken<List<Achievement>?>() {}.type
|
||||
|
||||
val gson = GsonBuilder()
|
||||
.registerTypeAdapter(taskTagClassListType, TaskTagDeserializer())
|
||||
.registerTypeAdapter(Boolean::class.java, BooleanAsIntAdapter())
|
||||
.registerTypeAdapter(Boolean::class.javaPrimitiveType, BooleanAsIntAdapter())
|
||||
.registerTypeAdapter(skillListType, SkillDeserializer())
|
||||
.registerTypeAdapter(TaskList::class.java, TaskListDeserializer())
|
||||
.registerTypeAdapter(Task::class.java, TaskSerializer())
|
||||
.registerTypeAdapter(Purchases::class.java, PurchasedDeserializer())
|
||||
.registerTypeAdapter(customizationListType, CustomizationDeserializer())
|
||||
.registerTypeAdapter(tutorialStepListType, TutorialStepListDeserializer())
|
||||
.registerTypeAdapter(faqArticleListType, FAQArticleListDeserilializer())
|
||||
.registerTypeAdapter(Group::class.java, GroupSerialization())
|
||||
.registerTypeAdapter(Date::class.java, DateDeserializer())
|
||||
.registerTypeAdapter(itemDataListType, EquipmentListDeserializer())
|
||||
.registerTypeAdapter(ChatMessage::class.java, ChatMessageDeserializer())
|
||||
.registerTypeAdapter(Task::class.java, TaskSerializer())
|
||||
.registerTypeAdapter(ContentResult::class.java, ContentDeserializer())
|
||||
.registerTypeAdapter(FeedResponse::class.java, FeedResponseDeserializer())
|
||||
.registerTypeAdapter(Challenge::class.java, ChallengeDeserializer())
|
||||
.registerTypeAdapter(User::class.java, UserDeserializer())
|
||||
.registerTypeAdapter(questCollectListType, QuestCollectDeserializer())
|
||||
.registerTypeAdapter(challengeListType, ChallengeListDeserializer())
|
||||
.registerTypeAdapter(challengeRealmListType, ChallengeListDeserializer())
|
||||
.registerTypeAdapter(questDropItemListType, QuestDropItemsListSerialization())
|
||||
.registerTypeAdapter(ownedItemListType, OwnedItemListDeserializer())
|
||||
.registerTypeAdapter(ownedPetListType, OwnedPetListDeserializer())
|
||||
.registerTypeAdapter(ownedMountListType, OwnedMountListDeserializer())
|
||||
.registerTypeAdapter(achievementsListType, AchievementListDeserializer())
|
||||
.registerTypeAdapter(Quest::class.java, QuestDeserializer())
|
||||
.registerTypeAdapter(Member::class.java, MemberSerialization())
|
||||
.registerTypeAdapter(WorldState::class.java, WorldStateSerialization())
|
||||
.registerTypeAdapter(FindUsernameResult::class.java, FindUsernameResultDeserializer())
|
||||
.registerTypeAdapter(Notification::class.java, NotificationDeserializer())
|
||||
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
|
||||
.create()
|
||||
return GsonConverterFactory.create(gson)
|
||||
}
|
||||
}
|
||||
|
|
@ -175,7 +175,6 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli
|
|||
stats?.lvl = res.lvl
|
||||
bgUser.party?.quest?.progress?.up = (bgUser.party?.quest?.progress?.up
|
||||
?: 0F) + (res._tmp?.quest?.progressDelta?.toFloat() ?: 0F)
|
||||
bgUser.stats = stats
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,10 +5,20 @@ import io.realm.RealmObject
|
|||
import io.realm.annotations.PrimaryKey
|
||||
import io.realm.annotations.RealmClass
|
||||
|
||||
@RealmClass(embedded = true)
|
||||
open class GroupMembership : RealmObject, BaseObject {
|
||||
@PrimaryKey
|
||||
var combinedID: String = ""
|
||||
|
||||
var userID: String = ""
|
||||
set(value) {
|
||||
field = value
|
||||
combinedID = userID + groupID
|
||||
}
|
||||
var groupID: String = ""
|
||||
set(value) {
|
||||
field = value
|
||||
combinedID = userID + groupID
|
||||
}
|
||||
|
||||
constructor(userID: String, groupID: String) : super() {
|
||||
this.userID = userID
|
||||
|
|
|
|||
|
|
@ -32,10 +32,6 @@ class ChallengeTasksRecyclerViewAdapter(taskFilterHelper: TaskFilterHelper?, lay
|
|||
component.inject(this)
|
||||
}
|
||||
|
||||
override fun loadFromDatabase(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun getItemViewType(position: Int): Int {
|
||||
val task = this.filteredContent?.get(position)
|
||||
|
||||
|
|
|
|||
|
|
@ -32,10 +32,6 @@ abstract class BaseTasksRecyclerViewAdapter<VH : BindableViewHolder<Task>>(var t
|
|||
init {
|
||||
this.filteredContent = ArrayList()
|
||||
HabiticaBaseApplication.userComponent?.let { injectThis(it) }
|
||||
|
||||
if (loadFromDatabase()) {
|
||||
this.loadContent(true)
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract fun injectThis(component: UserComponent)
|
||||
|
|
@ -88,26 +84,9 @@ abstract class BaseTasksRecyclerViewAdapter<VH : BindableViewHolder<Task>>(var t
|
|||
this.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
private fun loadContent(forced: Boolean) {
|
||||
if (this.content == null || forced) {
|
||||
taskRepository.getTasks(this.taskType)
|
||||
.flatMap { Flowable.fromIterable(it) }
|
||||
.map { task ->
|
||||
task.parseMarkdown()
|
||||
task
|
||||
}
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.toList()
|
||||
.subscribe({ this.setTasks(it) }, RxErrorHandler.handleEmptyError())
|
||||
}
|
||||
}
|
||||
|
||||
fun setTasks(tasks: List<Task>) {
|
||||
this.content = ArrayList()
|
||||
this.content?.addAll(tasks)
|
||||
filter()
|
||||
}
|
||||
|
||||
open fun loadFromDatabase(): Boolean = true
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import com.habitrpg.android.habitica.helpers.TaskFilterHelper
|
|||
import com.habitrpg.android.habitica.models.tasks.Task
|
||||
import com.habitrpg.android.habitica.ui.viewHolders.tasks.DailyViewHolder
|
||||
|
||||
class DailiesRecyclerViewHolder(data: List<Task>?, autoUpdate: Boolean, layoutResource: Int, taskFilterHelper: TaskFilterHelper) : RealmBaseTasksRecyclerViewAdapter<DailyViewHolder>(data, autoUpdate, layoutResource, taskFilterHelper) {
|
||||
class DailiesRecyclerViewHolder(layoutResource: Int, taskFilterHelper: TaskFilterHelper) : RealmBaseTasksRecyclerViewAdapter<DailyViewHolder>(layoutResource, taskFilterHelper) {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DailyViewHolder =
|
||||
DailyViewHolder(getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) },
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import com.habitrpg.android.habitica.helpers.TaskFilterHelper
|
|||
import com.habitrpg.android.habitica.models.tasks.Task
|
||||
import com.habitrpg.android.habitica.ui.viewHolders.tasks.HabitViewHolder
|
||||
|
||||
class HabitsRecyclerViewAdapter(data: List<Task>?, autoUpdate: Boolean, layoutResource: Int, taskFilterHelper: TaskFilterHelper) : RealmBaseTasksRecyclerViewAdapter<HabitViewHolder>(data, autoUpdate, layoutResource, taskFilterHelper) {
|
||||
class HabitsRecyclerViewAdapter(layoutResource: Int, taskFilterHelper: TaskFilterHelper) : RealmBaseTasksRecyclerViewAdapter<HabitViewHolder>(layoutResource, taskFilterHelper) {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HabitViewHolder =
|
||||
HabitViewHolder(getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) }, {
|
||||
|
|
|
|||
|
|
@ -16,15 +16,11 @@ import io.reactivex.rxjava3.subjects.PublishSubject
|
|||
import io.realm.OrderedRealmCollection
|
||||
|
||||
abstract class RealmBaseTasksRecyclerViewAdapter<VH : BaseTaskViewHolder>(
|
||||
private var unfilteredData: List<Task>?,
|
||||
private val hasAutoUpdates: Boolean,
|
||||
private val layoutResource: Int,
|
||||
private val taskFilterHelper: TaskFilterHelper?
|
||||
) : BaseRecyclerViewAdapter<Task, VH>(), TaskRecyclerViewAdapter {
|
||||
override var canScoreTasks = true
|
||||
|
||||
private var updateOnModification: Boolean = false
|
||||
override var ignoreUpdates: Boolean = false
|
||||
private var unfilteredData: List<Task>? = null
|
||||
|
||||
override var taskDisplayMode: String = "standard"
|
||||
set(value) {
|
||||
|
|
@ -45,16 +41,12 @@ abstract class RealmBaseTasksRecyclerViewAdapter<VH : BaseTaskViewHolder>(
|
|||
protected var brokenTaskEventsSubject: PublishSubject<Task> = PublishSubject.create()
|
||||
override val brokenTaskEvents: Flowable<Task> = brokenTaskEventsSubject.toFlowable(BackpressureStrategy.DROP)
|
||||
|
||||
init {
|
||||
this.updateOnModification = true
|
||||
filter()
|
||||
}
|
||||
|
||||
override fun getItemId(index: Int): Long = index.toLong()
|
||||
|
||||
override fun updateUnfilteredData(data: List<Task>?) {
|
||||
unfilteredData = data
|
||||
this.data = data ?: emptyList()
|
||||
filter()
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: VH, position: Int) {
|
||||
|
|
|
|||
|
|
@ -61,10 +61,6 @@ class RewardsRecyclerViewAdapter(private var customRewards: List<Task>?, private
|
|||
return customRewards?.size ?: 0
|
||||
}
|
||||
|
||||
override var ignoreUpdates: Boolean
|
||||
get() = false
|
||||
set(_) {}
|
||||
|
||||
private fun getContentView(parent: ViewGroup): View {
|
||||
return LayoutInflater.from(parent.context).inflate(layoutResource, parent, false)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ import io.reactivex.rxjava3.core.Flowable
|
|||
interface TaskRecyclerViewAdapter {
|
||||
var canScoreTasks: Boolean
|
||||
var data: List<Task>
|
||||
var ignoreUpdates: Boolean
|
||||
|
||||
val errorButtonEvents: Flowable<String>
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import com.habitrpg.android.habitica.helpers.TaskFilterHelper
|
|||
import com.habitrpg.android.habitica.models.tasks.Task
|
||||
import com.habitrpg.android.habitica.ui.viewHolders.tasks.TodoViewHolder
|
||||
|
||||
class TodosRecyclerViewAdapter(data: List<Task>?, autoUpdate: Boolean, layoutResource: Int, taskFilterHelper: TaskFilterHelper) : RealmBaseTasksRecyclerViewAdapter<TodoViewHolder>(data, autoUpdate, layoutResource, taskFilterHelper) {
|
||||
class TodosRecyclerViewAdapter(layoutResource: Int, taskFilterHelper: TaskFilterHelper) : RealmBaseTasksRecyclerViewAdapter<TodoViewHolder>(layoutResource, taskFilterHelper) {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder =
|
||||
TodoViewHolder(getContentView(parent), { task, direction -> taskScoreEventsSubject.onNext(Pair(task, direction)) },
|
||||
|
|
|
|||
|
|
@ -86,9 +86,9 @@ open class TaskRecyclerViewFragment : BaseFragment<FragmentRefreshRecyclerviewBi
|
|||
}
|
||||
recyclerSubscription = CompositeDisposable()
|
||||
val adapter: BaseRecyclerViewAdapter<*, *>? = when (this.taskType) {
|
||||
Task.TYPE_HABIT -> HabitsRecyclerViewAdapter(null, true, R.layout.habit_item_card, taskFilterHelper)
|
||||
Task.TYPE_DAILY -> DailiesRecyclerViewHolder(null, true, R.layout.daily_item_card, taskFilterHelper)
|
||||
Task.TYPE_TODO -> TodosRecyclerViewAdapter(null, true, R.layout.todo_item_card, taskFilterHelper)
|
||||
Task.TYPE_HABIT -> HabitsRecyclerViewAdapter(R.layout.habit_item_card, taskFilterHelper)
|
||||
Task.TYPE_DAILY -> DailiesRecyclerViewHolder(R.layout.daily_item_card, taskFilterHelper)
|
||||
Task.TYPE_TODO -> TodosRecyclerViewAdapter(R.layout.todo_item_card, taskFilterHelper)
|
||||
Task.TYPE_REWARD -> RewardsRecyclerViewAdapter(null, R.layout.reward_item_card)
|
||||
else -> null
|
||||
}
|
||||
|
|
@ -115,7 +115,6 @@ open class TaskRecyclerViewFragment : BaseFragment<FragmentRefreshRecyclerviewBi
|
|||
|
||||
recyclerSubscription.add(taskRepository.getTasks(this.taskType).subscribe({
|
||||
this.recyclerAdapter?.updateUnfilteredData(it)
|
||||
this.recyclerAdapter?.filter()
|
||||
}, RxErrorHandler.handleEmptyError()))
|
||||
}
|
||||
|
||||
|
|
@ -223,14 +222,12 @@ open class TaskRecyclerViewFragment : BaseFragment<FragmentRefreshRecyclerviewBi
|
|||
|
||||
private fun updateTaskInRepository(validTaskId: String?, viewHolder: RecyclerView.ViewHolder) {
|
||||
if (validTaskId != null) {
|
||||
recyclerAdapter?.ignoreUpdates = true
|
||||
compositeSubscription.add(taskRepository.updateTaskPosition(
|
||||
taskType, validTaskId, viewHolder.absoluteAdapterPosition
|
||||
)
|
||||
.delay(1, TimeUnit.SECONDS)
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe({
|
||||
recyclerAdapter?.ignoreUpdates = false
|
||||
}, RxErrorHandler.handleEmptyError()))
|
||||
}
|
||||
}
|
||||
|
|
@ -248,6 +245,15 @@ open class TaskRecyclerViewFragment : BaseFragment<FragmentRefreshRecyclerviewBi
|
|||
binding?.refreshLayout?.setOnRefreshListener(this)
|
||||
|
||||
setEmptyLabels()
|
||||
|
||||
binding?.recyclerView?.addOnScrollListener(object : RecyclerView.OnScrollListener() {
|
||||
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
|
||||
super.onScrollStateChanged(recyclerView, newState)
|
||||
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
|
||||
binding?.refreshLayout?.isEnabled = (activity as? MainActivity)?.isAppBarExpanded ?: false
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
protected fun showBrokenChallengeDialog(task: Task) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue