Fix various issues

This commit is contained in:
Phillip Thelen 2021-06-21 13:39:00 +02:00
parent e6ca51c599
commit 2fe8bc25d0
15 changed files with 200 additions and 175 deletions

View file

@ -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"

View file

@ -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>

View file

@ -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);
}
}

View file

@ -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)
}
}

View file

@ -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
}
}

View file

@ -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

View file

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

View file

@ -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
}

View file

@ -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)) },

View file

@ -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)) }, {

View file

@ -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) {

View file

@ -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)
}

View file

@ -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>

View file

@ -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)) },

View file

@ -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) {