mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-28 16:09:39 +01:00
Save filter state
Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
This commit is contained in:
parent
28ec0bae63
commit
91260ac9cb
@ -79,8 +79,10 @@ import com.nextcloud.talk.adapters.items.MessageResultItem
|
|||||||
import com.nextcloud.talk.adapters.items.MessagesTextHeaderItem
|
import com.nextcloud.talk.adapters.items.MessagesTextHeaderItem
|
||||||
import com.nextcloud.talk.api.NcApi
|
import com.nextcloud.talk.api.NcApi
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication
|
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||||
|
import com.nextcloud.talk.arbitrarystorage.ArbitraryStorageManager
|
||||||
import com.nextcloud.talk.chat.ChatActivity
|
import com.nextcloud.talk.chat.ChatActivity
|
||||||
import com.nextcloud.talk.contacts.ContactsActivity
|
import com.nextcloud.talk.contacts.ContactsActivity
|
||||||
|
import com.nextcloud.talk.data.storage.model.ArbitraryStorage
|
||||||
import com.nextcloud.talk.data.user.model.User
|
import com.nextcloud.talk.data.user.model.User
|
||||||
import com.nextcloud.talk.databinding.ControllerConversationsRvBinding
|
import com.nextcloud.talk.databinding.ControllerConversationsRvBinding
|
||||||
import com.nextcloud.talk.events.ConversationsListFetchDataEvent
|
import com.nextcloud.talk.events.ConversationsListFetchDataEvent
|
||||||
@ -106,6 +108,7 @@ import com.nextcloud.talk.utils.ClosedInterfaceImpl
|
|||||||
import com.nextcloud.talk.utils.FileUtils
|
import com.nextcloud.talk.utils.FileUtils
|
||||||
import com.nextcloud.talk.utils.Mimetype
|
import com.nextcloud.talk.utils.Mimetype
|
||||||
import com.nextcloud.talk.utils.ParticipantPermissions
|
import com.nextcloud.talk.utils.ParticipantPermissions
|
||||||
|
import com.nextcloud.talk.utils.UserIdUtils
|
||||||
import com.nextcloud.talk.utils.bundle.BundleKeys
|
import com.nextcloud.talk.utils.bundle.BundleKeys
|
||||||
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FORWARD_HIDE_SOURCE_ROOM
|
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FORWARD_HIDE_SOURCE_ROOM
|
||||||
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FORWARD_MSG_FLAG
|
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FORWARD_MSG_FLAG
|
||||||
@ -120,6 +123,7 @@ import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isServerEOL
|
|||||||
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isUnifiedSearchAvailable
|
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isUnifiedSearchAvailable
|
||||||
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isUserStatusAvailable
|
import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isUserStatusAvailable
|
||||||
import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil
|
import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil
|
||||||
|
import com.nextcloud.talk.utils.preferences.AppPreferences
|
||||||
import com.nextcloud.talk.utils.rx.SearchViewObservable.Companion.observeSearchView
|
import com.nextcloud.talk.utils.rx.SearchViewObservable.Companion.observeSearchView
|
||||||
import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder
|
import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
@ -272,6 +276,50 @@ class ConversationsListActivity :
|
|||||||
|
|
||||||
showSearchOrToolbar()
|
showSearchOrToolbar()
|
||||||
}
|
}
|
||||||
|
fun filterConversation() {
|
||||||
|
filterState[FilterConversationFragment.UNREAD] = appPreferences.isUnreadFilterEnabled
|
||||||
|
filterState[FilterConversationFragment.MENTION] = appPreferences.isMentionFilterEnabled
|
||||||
|
|
||||||
|
val newItems: MutableList<AbstractFlexibleItem<*>> = ArrayList()
|
||||||
|
if (filterState[FilterConversationFragment.UNREAD] == false &&
|
||||||
|
filterState[FilterConversationFragment.MENTION] == false) {
|
||||||
|
adapter!!.updateDataSet(conversationItems, true)
|
||||||
|
} else {
|
||||||
|
val items = conversationItems
|
||||||
|
for (i in items) {
|
||||||
|
val conversation = (i as ConversationItem).model
|
||||||
|
if (filter(conversation)) {
|
||||||
|
newItems.add(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
adapter!!.updateDataSet(newItems, true)
|
||||||
|
setFilterableItems(newItems)
|
||||||
|
}
|
||||||
|
|
||||||
|
updateFilterConversationButtonColor()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun filter(conversation: Conversation): Boolean {
|
||||||
|
var result = true
|
||||||
|
for ((k, v) in filterState) {
|
||||||
|
if (v) {
|
||||||
|
when (k) {
|
||||||
|
FilterConversationFragment.MENTION -> result = (result && conversation.unreadMention) ||
|
||||||
|
(
|
||||||
|
result &&
|
||||||
|
(
|
||||||
|
conversation.type == Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL ||
|
||||||
|
conversation.type == Conversation.ConversationType.FORMER_ONE_TO_ONE
|
||||||
|
) &&
|
||||||
|
(conversation.unreadMessages > 0)
|
||||||
|
)
|
||||||
|
FilterConversationFragment.UNREAD -> result = result && (conversation.unreadMessages > 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
private fun setupActionBar() {
|
private fun setupActionBar() {
|
||||||
setSupportActionBar(binding.conversationListToolbar)
|
setSupportActionBar(binding.conversationListToolbar)
|
||||||
@ -578,6 +626,7 @@ class ConversationsListActivity :
|
|||||||
sortConversations(conversationItems)
|
sortConversations(conversationItems)
|
||||||
sortConversations(conversationItemsWithHeader)
|
sortConversations(conversationItemsWithHeader)
|
||||||
if (!filterState.containsValue(true)) filterableConversationItems = conversationItems
|
if (!filterState.containsValue(true)) filterableConversationItems = conversationItems
|
||||||
|
filterConversation()
|
||||||
adapter!!.updateDataSet(filterableConversationItems, false)
|
adapter!!.updateDataSet(filterableConversationItems, false)
|
||||||
Handler().postDelayed({ checkToShowUnreadBubble() }, UNREAD_BUBBLE_DELAY.toLong())
|
Handler().postDelayed({ checkToShowUnreadBubble() }, UNREAD_BUBBLE_DELAY.toLong())
|
||||||
fetchOpenConversations(apiVersion)
|
fetchOpenConversations(apiVersion)
|
||||||
@ -788,8 +837,6 @@ class ConversationsListActivity :
|
|||||||
|
|
||||||
binding.filterConversationsButton.setOnClickListener {
|
binding.filterConversationsButton.setOnClickListener {
|
||||||
val newFragment: DialogFragment = FilterConversationFragment.newInstance(
|
val newFragment: DialogFragment = FilterConversationFragment.newInstance(
|
||||||
adapter!!,
|
|
||||||
conversationItems,
|
|
||||||
filterState,
|
filterState,
|
||||||
this
|
this
|
||||||
)
|
)
|
||||||
|
@ -30,26 +30,26 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|||||||
import com.nextcloud.talk.R
|
import com.nextcloud.talk.R
|
||||||
import com.nextcloud.talk.adapters.items.ConversationItem
|
import com.nextcloud.talk.adapters.items.ConversationItem
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication
|
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||||
|
import com.nextcloud.talk.arbitrarystorage.ArbitraryStorageManager
|
||||||
import com.nextcloud.talk.conversationlist.ConversationsListActivity
|
import com.nextcloud.talk.conversationlist.ConversationsListActivity
|
||||||
import com.nextcloud.talk.databinding.DialogFilterConversationBinding
|
import com.nextcloud.talk.databinding.DialogFilterConversationBinding
|
||||||
import com.nextcloud.talk.models.json.conversations.Conversation
|
import com.nextcloud.talk.models.json.conversations.Conversation
|
||||||
import com.nextcloud.talk.ui.theme.ViewThemeUtils
|
import com.nextcloud.talk.ui.theme.ViewThemeUtils
|
||||||
import com.nextcloud.talk.users.UserManager
|
import com.nextcloud.talk.users.UserManager
|
||||||
|
import com.nextcloud.talk.utils.UserIdUtils
|
||||||
|
import com.nextcloud.talk.utils.UserIdUtils.getIdForUser
|
||||||
|
import com.nextcloud.talk.utils.preferences.AppPreferences
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
|
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@AutoInjector(NextcloudTalkApplication::class)
|
@AutoInjector(NextcloudTalkApplication::class)
|
||||||
class FilterConversationFragment(
|
class FilterConversationFragment(
|
||||||
adapter: FlexibleAdapter<AbstractFlexibleItem<*>>,
|
|
||||||
currentConversations: MutableList<AbstractFlexibleItem<*>>,
|
|
||||||
savedFilterState: MutableMap<String, Boolean>,
|
savedFilterState: MutableMap<String, Boolean>,
|
||||||
conversationsListActivity: ConversationsListActivity
|
conversationsListActivity: ConversationsListActivity
|
||||||
) : DialogFragment() {
|
) : DialogFragment() {
|
||||||
lateinit var binding: DialogFilterConversationBinding
|
lateinit var binding: DialogFilterConversationBinding
|
||||||
private var dialogView: View? = null
|
private var dialogView: View? = null
|
||||||
private var currentAdapter: FlexibleAdapter<AbstractFlexibleItem<*>> = adapter
|
|
||||||
private var currentItems = currentConversations
|
|
||||||
private var filterState = savedFilterState
|
private var filterState = savedFilterState
|
||||||
private var conversationsList = conversationsListActivity
|
private var conversationsList = conversationsListActivity
|
||||||
|
|
||||||
@ -58,6 +58,9 @@ class FilterConversationFragment(
|
|||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var viewThemeUtils: ViewThemeUtils
|
lateinit var viewThemeUtils: ViewThemeUtils
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var appPreferences: AppPreferences
|
||||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||||
binding = DialogFilterConversationBinding.inflate(LayoutInflater.from(context))
|
binding = DialogFilterConversationBinding.inflate(LayoutInflater.from(context))
|
||||||
dialogView = binding.root
|
dialogView = binding.root
|
||||||
@ -119,57 +122,19 @@ class FilterConversationFragment(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun processSubmit() {
|
private fun processSubmit() {
|
||||||
val newItems: MutableList<AbstractFlexibleItem<*>> = ArrayList()
|
// store
|
||||||
if (!filterState.containsValue(true)) {
|
appPreferences.setMentionFilter(filterState[MENTION] == true)
|
||||||
currentAdapter.updateDataSet(currentItems, true)
|
appPreferences.setUnreadFilter(filterState[UNREAD] == true)
|
||||||
} else {
|
|
||||||
val items = currentItems
|
|
||||||
for (i in items) {
|
|
||||||
val conversation = (i as ConversationItem).model
|
|
||||||
if (filter(conversation)) {
|
|
||||||
newItems.add(i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
currentAdapter.updateDataSet(newItems, true)
|
|
||||||
conversationsList.setFilterableItems(newItems)
|
|
||||||
}
|
|
||||||
conversationsList.updateFilterState(
|
|
||||||
filterState[MENTION]!!,
|
|
||||||
filterState[UNREAD]!!
|
|
||||||
)
|
|
||||||
|
|
||||||
conversationsList.updateFilterConversationButtonColor()
|
conversationsList.filterConversation()
|
||||||
}
|
|
||||||
private fun filter(conversation: Conversation): Boolean {
|
|
||||||
var result = true
|
|
||||||
for ((k, v) in filterState) {
|
|
||||||
if (v) {
|
|
||||||
when (k) {
|
|
||||||
MENTION -> result = (result && conversation.unreadMention) ||
|
|
||||||
(
|
|
||||||
result &&
|
|
||||||
(
|
|
||||||
conversation.type == Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL ||
|
|
||||||
conversation.type == Conversation.ConversationType.FORMER_ONE_TO_ONE
|
|
||||||
) &&
|
|
||||||
(conversation.unreadMessages > 0)
|
|
||||||
)
|
|
||||||
UNREAD -> result = result && (conversation.unreadMessages > 0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun newInstance(
|
fun newInstance(
|
||||||
adapter: FlexibleAdapter<AbstractFlexibleItem<*>>,
|
|
||||||
currentConversations: MutableList<AbstractFlexibleItem<*>>,
|
|
||||||
savedFilterState: MutableMap<String, Boolean>,
|
savedFilterState: MutableMap<String, Boolean>,
|
||||||
conversationsListActivity: ConversationsListActivity
|
conversationsListActivity: ConversationsListActivity
|
||||||
) = FilterConversationFragment(adapter, currentConversations, savedFilterState, conversationsListActivity)
|
) = FilterConversationFragment(savedFilterState, conversationsListActivity)
|
||||||
val TAG: String = FilterConversationFragment::class.java.simpleName
|
val TAG: String = FilterConversationFragment::class.java.simpleName
|
||||||
const val MENTION: String = "mention"
|
const val MENTION: String = "mention"
|
||||||
const val UNREAD: String = "unread"
|
const val UNREAD: String = "unread"
|
||||||
|
@ -344,6 +344,20 @@ public interface AppPreferences {
|
|||||||
@KeyByResource(R.string.nc_file_browser_sort_by_key)
|
@KeyByResource(R.string.nc_file_browser_sort_by_key)
|
||||||
@DefaultValue(R.string.nc_file_browser_sort_by_default)
|
@DefaultValue(R.string.nc_file_browser_sort_by_default)
|
||||||
String getSorting();
|
String getSorting();
|
||||||
|
|
||||||
|
@KeyByResource(R.string.nc_filter_unread)
|
||||||
|
@DefaultValue(R.bool.value_false)
|
||||||
|
boolean isUnreadFilterEnabled();
|
||||||
|
|
||||||
|
@KeyByResource(R.string.nc_filter_unread)
|
||||||
|
void setUnreadFilter(boolean value);
|
||||||
|
|
||||||
|
@KeyByResource(R.string.nc_filter_mention)
|
||||||
|
@DefaultValue(R.bool.value_false)
|
||||||
|
boolean isMentionFilterEnabled();
|
||||||
|
|
||||||
|
@KeyByResource(R.string.nc_filter_mention)
|
||||||
|
void setMentionFilter(boolean value);
|
||||||
|
|
||||||
@KeyByResource(R.string.nc_file_browser_sort_by_key)
|
@KeyByResource(R.string.nc_file_browser_sort_by_key)
|
||||||
@RegisterChangeListenerMethod
|
@RegisterChangeListenerMethod
|
||||||
|
@ -416,6 +416,9 @@ How to translate with transifex:
|
|||||||
<string name="nc_user">User</string>
|
<string name="nc_user">User</string>
|
||||||
<string name="nc_guest">Guest</string>
|
<string name="nc_guest">Guest</string>
|
||||||
<string name="nc_following_link">User following a public link</string>
|
<string name="nc_following_link">User following a public link</string>
|
||||||
|
|
||||||
|
<string name="nc_filter_unread" translatable="false">nc_filter_unread</string>
|
||||||
|
<string name="nc_filter_mention" translatable="false">nc_filter_mention</string>
|
||||||
|
|
||||||
<!-- Browser component -->
|
<!-- Browser component -->
|
||||||
<string name="nc_file_browser_back">Back</string>
|
<string name="nc_file_browser_back">Back</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user