WIP got archived working - still have some todos

Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
This commit is contained in:
rapterjet2004 2024-10-14 09:00:24 -05:00
parent 8eeca17d86
commit 94f33c13bc
No known key found for this signature in database
GPG key ID: 3AA5FDFED7944099
12 changed files with 121 additions and 34 deletions

View file

@ -2,7 +2,7 @@
"formatVersion": 1, "formatVersion": 1,
"database": { "database": {
"version": 11, "version": 11,
"identityHash": "bc802cadfdef41d3eb94ffbb0729eb89", "identityHash": "7edb537b6987d0de6586a6760c970958",
"entities": [ "entities": [
{ {
"tableName": "User", "tableName": "User",
@ -138,7 +138,7 @@
}, },
{ {
"tableName": "Conversations", "tableName": "Conversations",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`internalId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `token` TEXT NOT NULL, `displayName` TEXT NOT NULL, `actorId` TEXT NOT NULL, `actorType` TEXT NOT NULL, `avatarVersion` TEXT NOT NULL, `callFlag` INTEGER NOT NULL, `callRecording` INTEGER NOT NULL, `callStartTime` INTEGER NOT NULL, `canDeleteConversation` INTEGER NOT NULL, `canLeaveConversation` INTEGER NOT NULL, `canStartCall` INTEGER NOT NULL, `description` TEXT NOT NULL, `hasCall` INTEGER NOT NULL, `hasPassword` INTEGER NOT NULL, `isCustomAvatar` INTEGER NOT NULL, `isFavorite` INTEGER NOT NULL, `lastActivity` INTEGER NOT NULL, `lastCommonReadMessage` INTEGER NOT NULL, `lastMessage` TEXT, `lastPing` INTEGER NOT NULL, `lastReadMessage` INTEGER NOT NULL, `lobbyState` TEXT NOT NULL, `lobbyTimer` INTEGER NOT NULL, `messageExpiration` INTEGER NOT NULL, `name` TEXT NOT NULL, `notificationCalls` INTEGER NOT NULL, `notificationLevel` TEXT NOT NULL, `objectType` TEXT NOT NULL, `participantType` TEXT NOT NULL, `permissions` INTEGER NOT NULL, `readOnly` TEXT NOT NULL, `recordingConsent` INTEGER NOT NULL, `remoteServer` TEXT, `remoteToken` TEXT, `sessionId` TEXT NOT NULL, `status` TEXT, `statusClearAt` INTEGER, `statusIcon` TEXT, `statusMessage` TEXT, `type` TEXT NOT NULL, `unreadMention` INTEGER NOT NULL, `unreadMentionDirect` INTEGER NOT NULL, `unreadMessages` INTEGER NOT NULL, PRIMARY KEY(`internalId`), FOREIGN KEY(`accountId`) REFERENCES `User`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )", "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`internalId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `token` TEXT NOT NULL, `displayName` TEXT NOT NULL, `actorId` TEXT NOT NULL, `actorType` TEXT NOT NULL, `avatarVersion` TEXT NOT NULL, `callFlag` INTEGER NOT NULL, `callRecording` INTEGER NOT NULL, `callStartTime` INTEGER NOT NULL, `canDeleteConversation` INTEGER NOT NULL, `canLeaveConversation` INTEGER NOT NULL, `canStartCall` INTEGER NOT NULL, `description` TEXT NOT NULL, `hasCall` INTEGER NOT NULL, `hasPassword` INTEGER NOT NULL, `isCustomAvatar` INTEGER NOT NULL, `isFavorite` INTEGER NOT NULL, `lastActivity` INTEGER NOT NULL, `lastCommonReadMessage` INTEGER NOT NULL, `lastMessage` TEXT, `lastPing` INTEGER NOT NULL, `lastReadMessage` INTEGER NOT NULL, `lobbyState` TEXT NOT NULL, `lobbyTimer` INTEGER NOT NULL, `messageExpiration` INTEGER NOT NULL, `name` TEXT NOT NULL, `notificationCalls` INTEGER NOT NULL, `notificationLevel` TEXT NOT NULL, `objectType` TEXT NOT NULL, `participantType` TEXT NOT NULL, `permissions` INTEGER NOT NULL, `readOnly` TEXT NOT NULL, `recordingConsent` INTEGER NOT NULL, `remoteServer` TEXT, `remoteToken` TEXT, `sessionId` TEXT NOT NULL, `status` TEXT, `statusClearAt` INTEGER, `statusIcon` TEXT, `statusMessage` TEXT, `type` TEXT NOT NULL, `unreadMention` INTEGER NOT NULL, `unreadMentionDirect` INTEGER NOT NULL, `unreadMessages` INTEGER NOT NULL, `hasArchived` INTEGER NOT NULL, PRIMARY KEY(`internalId`), FOREIGN KEY(`accountId`) REFERENCES `User`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
"fields": [ "fields": [
{ {
"fieldPath": "internalId", "fieldPath": "internalId",
@ -409,6 +409,12 @@
"columnName": "unreadMessages", "columnName": "unreadMessages",
"affinity": "INTEGER", "affinity": "INTEGER",
"notNull": true "notNull": true
},
{
"fieldPath": "hasArchived",
"columnName": "hasArchived",
"affinity": "INTEGER",
"notNull": true
} }
], ],
"primaryKey": { "primaryKey": {
@ -713,7 +719,7 @@
"views": [], "views": [],
"setupQueries": [ "setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'bc802cadfdef41d3eb94ffbb0729eb89')" "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7edb537b6987d0de6586a6760c970958')"
] ]
} }
} }

View file

@ -179,36 +179,17 @@ class ConversationInfoActivity :
databaseStorageModule = DatabaseStorageModule(conversationUser, conversationToken) databaseStorageModule = DatabaseStorageModule(conversationUser, conversationToken)
} }
if (!spreedCapabilities.features!!.contains(ARCHIVED_CONVERSATIONS)) {
binding.archiveConversationBtn.visibility = GONE
}
binding.deleteConversationAction.setOnClickListener { showDeleteConversationDialog() } binding.deleteConversationAction.setOnClickListener { showDeleteConversationDialog() }
binding.leaveConversationAction.setOnClickListener { leaveConversation() } binding.leaveConversationAction.setOnClickListener { leaveConversation() }
binding.clearConversationHistory.setOnClickListener { showClearHistoryDialog() } binding.clearConversationHistory.setOnClickListener { showClearHistoryDialog() }
binding.addParticipantsAction.setOnClickListener { addParticipants() } binding.addParticipantsAction.setOnClickListener { addParticipants() }
binding.listBansButton.setOnClickListener { listBans() } binding.listBansButton.setOnClickListener { listBans() }
binding.archiveConversationBtn.setOnClickListener {
if (conversation!!.isArchived) {
viewModel.unarchiveConversation(conversationUser, conversationToken)
} else {
viewModel.archiveConversation(conversationUser, conversationToken)
}
}
viewModel.getRoom(conversationUser, conversationToken) viewModel.getRoom(conversationUser, conversationToken)
themeTextViews() themeTextViews()
themeSwitchPreferences() themeSwitchPreferences()
if (conversation!!.isArchived) {
binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye))
binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation)
} else {
binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24))
binding.archiveConversationText.text = resources.getString(R.string.archive_conversation)
}
binding.addParticipantsAction.visibility = GONE binding.addParticipantsAction.visibility = GONE
binding.progressBar.let { viewThemeUtils.platform.colorCircularProgressBar(it, ColorRole.PRIMARY) } binding.progressBar.let { viewThemeUtils.platform.colorCircularProgressBar(it, ColorRole.PRIMARY) }
@ -760,6 +741,26 @@ class ConversationInfoActivity :
} }
} }
if (!spreedCapabilities.features!!.contains(ARCHIVED_CONVERSATIONS)) {
binding.archiveConversationBtn.visibility = GONE
}
binding.archiveConversationBtn.setOnClickListener {
if (conversation!!.hasArchived) {
viewModel.unarchiveConversation(conversationUser, conversationToken)
} else {
viewModel.archiveConversation(conversationUser, conversationToken)
}
}
if (conversation!!.hasArchived) {
binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.ic_eye))
binding.archiveConversationText.text = resources.getString(R.string.unarchive_conversation)
} else {
binding.archiveConversationIcon.setImageDrawable(resources.getDrawable(R.drawable.outline_archive_24))
binding.archiveConversationText.text = resources.getString(R.string.archive_conversation)
}
if (!isDestroyed) { if (!isDestroyed) {
binding.dangerZoneOptions.visibility = VISIBLE binding.dangerZoneOptions.visibility = VISIBLE

View file

@ -203,11 +203,53 @@ class ConversationInfoViewModel @Inject constructor(
} }
fun archiveConversation(user: User, token: String) { fun archiveConversation(user: User, token: String) {
// TODO val apiVersion = ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1))
val url = ApiUtils.getUrlForArchive(apiVersion, user.baseUrl, token)
conversationsRepository.archiveConversation(user.getCredentials(), url)
.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(p0: Disposable) {
// unused
}
override fun onError(e: Throwable) {
Log.d("Julius", "Error in archive $e")
}
override fun onComplete() {
// unused atm
}
override fun onNext(n: GenericOverall) {
Log.d("Julius", "Archived successful")
}
})
} }
fun unarchiveConversation(user: User, token: String) { fun unarchiveConversation(user: User, token: String) {
// TODO val apiVersion = ApiUtils.getConversationApiVersion(user, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1))
val url = ApiUtils.getUrlForArchive(apiVersion, user.baseUrl, token)
conversationsRepository.unarchiveConversation(user.getCredentials(), url)
.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(p0: Disposable) {
// unused
}
override fun onError(e: Throwable) {
Log.d("Julius", "Error in unarchive $e")
}
override fun onComplete() {
// unused atm
}
override fun onNext(n: GenericOverall) {
Log.d("Julius", "unArchived successful")
}
})
} }
inner class GetRoomObserver : Observer<ConversationModel> { inner class GetRoomObserver : Observer<ConversationModel> {

View file

@ -210,7 +210,8 @@ class ConversationsListActivity :
private var filterState = private var filterState =
mutableMapOf( mutableMapOf(
FilterConversationFragment.MENTION to false, FilterConversationFragment.MENTION to false,
FilterConversationFragment.UNREAD to false FilterConversationFragment.UNREAD to false,
FilterConversationFragment.ARCHIVE to false
) )
val searchBehaviorSubject = BehaviorSubject.createDefault(false) val searchBehaviorSubject = BehaviorSubject.createDefault(false)
private lateinit var accountIconBadge: BadgeDrawable private lateinit var accountIconBadge: BadgeDrawable
@ -413,9 +414,18 @@ class ConversationsListActivity :
).blockingGet()?.value ?: "" ).blockingGet()?.value ?: ""
) == "true" ) == "true"
filterState[FilterConversationFragment.ARCHIVE] = (
arbitraryStorageManager.getStorageSetting(
accountId,
FilterConversationFragment.ARCHIVE,
""
).blockingGet()?.value ?: ""
) == "true"
val newItems: MutableList<AbstractFlexibleItem<*>> = ArrayList() val newItems: MutableList<AbstractFlexibleItem<*>> = ArrayList()
if (filterState[FilterConversationFragment.UNREAD] == false && if (filterState[FilterConversationFragment.UNREAD] == false &&
filterState[FilterConversationFragment.MENTION] == false filterState[FilterConversationFragment.MENTION] == false &&
filterState[FilterConversationFragment.ARCHIVE] == false
) { ) {
adapter!!.updateDataSet(conversationItems, true) adapter!!.updateDataSet(conversationItems, true)
} else { } else {
@ -449,6 +459,8 @@ class ConversationsListActivity :
) )
FilterConversationFragment.UNREAD -> result = result && (conversation.unreadMessages > 0) FilterConversationFragment.UNREAD -> result = result && (conversation.unreadMessages > 0)
FilterConversationFragment.ARCHIVE -> result = result && conversation.hasArchived
} }
} }
} }

View file

@ -59,7 +59,8 @@ fun ConversationModel.asEntity() =
callStartTime = callStartTime, callStartTime = callStartTime,
recordingConsentRequired = recordingConsentRequired, recordingConsentRequired = recordingConsentRequired,
remoteServer = remoteServer, remoteServer = remoteServer,
remoteToken = remoteToken remoteToken = remoteToken,
hasArchived = hasArchived
) )
fun ConversationEntity.asModel() = fun ConversationEntity.asModel() =
@ -109,7 +110,8 @@ fun ConversationEntity.asModel() =
callStartTime = callStartTime, callStartTime = callStartTime,
recordingConsentRequired = recordingConsentRequired, recordingConsentRequired = recordingConsentRequired,
remoteServer = remoteServer, remoteServer = remoteServer,
remoteToken = remoteToken remoteToken = remoteToken,
hasArchived = hasArchived
) )
fun Conversation.asEntity(accountId: Long) = fun Conversation.asEntity(accountId: Long) =
@ -158,5 +160,6 @@ fun Conversation.asEntity(accountId: Long) =
callStartTime = callStartTime, callStartTime = callStartTime,
recordingConsentRequired = recordingConsentRequired, recordingConsentRequired = recordingConsentRequired,
remoteServer = remoteServer, remoteServer = remoteServer,
remoteToken = remoteToken remoteToken = remoteToken,
hasArchived = hasArchived
) )

View file

@ -92,7 +92,8 @@ data class ConversationEntity(
@ColumnInfo(name = "type") var type: ConversationEnums.ConversationType, @ColumnInfo(name = "type") var type: ConversationEnums.ConversationType,
@ColumnInfo(name = "unreadMention") var unreadMention: Boolean = false, @ColumnInfo(name = "unreadMention") var unreadMention: Boolean = false,
@ColumnInfo(name = "unreadMentionDirect") var unreadMentionDirect: Boolean, @ColumnInfo(name = "unreadMentionDirect") var unreadMentionDirect: Boolean,
@ColumnInfo(name = "unreadMessages") var unreadMessages: Int = 0 @ColumnInfo(name = "unreadMessages") var unreadMessages: Int = 0,
@ColumnInfo(name = "hasArchived") var hasArchived: Boolean = false
// missing/not needed: attendeeId // missing/not needed: attendeeId
// missing/not needed: attendeePin // missing/not needed: attendeePin
// missing/not needed: attendeePermissions // missing/not needed: attendeePermissions

View file

@ -59,7 +59,7 @@ class ConversationModel(
var recordingConsentRequired: Int = 0, var recordingConsentRequired: Int = 0,
var remoteServer: String? = null, var remoteServer: String? = null,
var remoteToken: String? = null, var remoteToken: String? = null,
var isArchived: Boolean = false, var hasArchived: Boolean = false,
// attributes that don't come from API. This should be changed?! // attributes that don't come from API. This should be changed?!
var password: String? = null var password: String? = null
@ -122,7 +122,7 @@ class ConversationModel(
recordingConsentRequired = conversation.recordingConsentRequired, recordingConsentRequired = conversation.recordingConsentRequired,
remoteServer = conversation.remoteServer, remoteServer = conversation.remoteServer,
remoteToken = conversation.remoteToken, remoteToken = conversation.remoteToken,
isArchived = conversation.isArchived hasArchived = conversation.hasArchived
) )
} }
} }

View file

@ -162,5 +162,5 @@ data class Conversation(
var remoteToken: String? = "", var remoteToken: String? = "",
@JsonField(name = ["isArchived"]) @JsonField(name = ["isArchived"])
var isArchived: Boolean var hasArchived: Boolean = false
) : Parcelable ) : Parcelable

View file

@ -69,7 +69,8 @@ class FilterConversationFragment : DialogFragment() {
binding.run { binding.run {
listOf( listOf(
unreadFilterChip, unreadFilterChip,
mentionedFilterChip mentionedFilterChip,
archivedFilterChip
) )
}.forEach(viewThemeUtils.talk::themeChipFilter) }.forEach(viewThemeUtils.talk::themeChipFilter)
@ -89,6 +90,12 @@ class FilterConversationFragment : DialogFragment() {
processSubmit() processSubmit()
} }
binding.archivedFilterChip.setOnCheckedChangeListener { _, isChecked ->
filterState[ARCHIVE] = isChecked
binding.archivedFilterChip.isChecked = isChecked
processSubmit()
}
binding.buttonClose.setOnClickListener { binding.buttonClose.setOnClickListener {
dismiss() dismiss()
} }
@ -104,9 +111,11 @@ class FilterConversationFragment : DialogFragment() {
val accountId = UserIdUtils.getIdForUser(userManager.currentUser.blockingGet()) val accountId = UserIdUtils.getIdForUser(userManager.currentUser.blockingGet())
val mentionValue = filterState[MENTION] == true val mentionValue = filterState[MENTION] == true
val unreadValue = filterState[UNREAD] == true val unreadValue = filterState[UNREAD] == true
val archivedValue = filterState[ARCHIVE] == true
arbitraryStorageManager.storeStorageSetting(accountId, MENTION, mentionValue.toString(), "") arbitraryStorageManager.storeStorageSetting(accountId, MENTION, mentionValue.toString(), "")
arbitraryStorageManager.storeStorageSetting(accountId, UNREAD, unreadValue.toString(), "") arbitraryStorageManager.storeStorageSetting(accountId, UNREAD, unreadValue.toString(), "")
arbitraryStorageManager.storeStorageSetting(accountId, ARCHIVE, archivedValue.toString(), "")
(requireActivity() as ConversationsListActivity).filterConversation() (requireActivity() as ConversationsListActivity).filterConversation()
} }
@ -126,5 +135,6 @@ class FilterConversationFragment : DialogFragment() {
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"
const val ARCHIVE: String = "archive"
} }
} }

View file

@ -588,4 +588,8 @@ object ApiUtils {
fun getUrlForUnban(baseUrl: String, token: String, banId: Int): String { fun getUrlForUnban(baseUrl: String, token: String, banId: Int): String {
return "${getUrlForBans(baseUrl, token)}/$banId" return "${getUrlForBans(baseUrl, token)}/$banId"
} }
fun getUrlForArchive(version: Int, baseUrl: String?, token: String?): String {
return "${getUrlForRoom(version, baseUrl, token)}/archive"
}
} }

View file

@ -48,6 +48,13 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/mentioned" /> android:text="@string/mentioned" />
<com.google.android.material.chip.Chip
android:id="@+id/archived_filter_chip"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/archived" />
</com.google.android.material.chip.ChipGroup> </com.google.android.material.chip.ChipGroup>
<com.google.android.material.divider.MaterialDivider <com.google.android.material.divider.MaterialDivider

View file

@ -817,4 +817,5 @@ How to translate with transifex:
<string name="connection_lost">Connection lost</string> <string name="connection_lost">Connection lost</string>
<string name="archive_conversation">Archive Conversation</string> <string name="archive_conversation">Archive Conversation</string>
<string name="unarchive_conversation">Unarchive Conversation</string> <string name="unarchive_conversation">Unarchive Conversation</string>
<string name="archived">Archived</string>
</resources> </resources>