diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt index 3a189db33..a51124bc8 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt @@ -59,6 +59,7 @@ class ConversationItem( IFilterable { private var header: GenericTextHeaderItem? = null private val chatMessage = model.lastMessage?.asModel() + var mHolder: ConversationItemViewHolder? = null constructor( conversation: ConversationModel, @@ -97,6 +98,7 @@ class ConversationItem( position: Int, payloads: List ) { + mHolder = holder val appContext = sharedApplication!!.applicationContext holder.binding.dialogName.setTextColor( ResourcesCompat.getColor( diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index 4ad332bcd..f01852456 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -392,7 +392,6 @@ class ChatActivity : private val onBackPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { val intent = Intent(this@ChatActivity, ConversationsListActivity::class.java) - intent.putExtras(Bundle()) startActivity(intent) } } diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index 07e70cca3..5a4d30ad6 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -345,6 +345,16 @@ class ConversationsListActivity : showSearchOrToolbar() } + override fun onPause() { + super.onPause() + val firstVisible = layoutManager?.findFirstVisibleItemPosition() ?: 0 + val firstItem = adapter?.getItem(firstVisible) + val firstTop = (firstItem as ConversationItem).mHolder?.itemView?.top + val firstOffset = firstTop?.minus(CONVERSATION_ITEM_HEIGHT) ?: 0 + + appPreferences.setConversationListPositionAndOffset(firstVisible, firstOffset) + } + // if edge to edge is used, add an empty item at the bottom of the list @Suppress("MagicNumber") private fun addEmptyItemForEdgeToEdgeIfNecessary() { @@ -426,6 +436,9 @@ class ConversationsListActivity : .firstOrNull { ConversationUtils.isNoteToSelfConversation(it) } val isNoteToSelfAvailable = noteToSelf != null handleNoteToSelfShortcut(isNoteToSelfAvailable, noteToSelf?.token ?: "") + + val pair = appPreferences.conversationListPositionAndOffset + layoutManager?.scrollToPositionWithOffset(pair.first, pair.second) }.collect() } @@ -1873,7 +1886,6 @@ class ConversationsListActivity : val bundle = Bundle() bundle.putString(KEY_ROOM_TOKEN, selectedConversation!!.token) - // bundle.putString(KEY_ROOM_ID, selectedConversation!!.roomId) bundle.putString(KEY_SHARED_TEXT, textToPaste) if (selectedMessageId != null) { bundle.putString(BundleKeys.KEY_MESSAGE_ID, selectedMessageId) @@ -2221,5 +2233,6 @@ class ConversationsListActivity : private const val SIXTEEN_HOURS_IN_SECONDS: Long = 57600 const val LONG_1000: Long = 1000 private const val NOTE_TO_SELF_SHORTCUT_ID = "NOTE_TO_SELF_SHORTCUT_ID" + private const val CONVERSATION_ITEM_HEIGHT = 44 } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java index 7b44022a5..e68e1291d 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferences.java @@ -13,6 +13,8 @@ import android.annotation.SuppressLint; import com.nextcloud.talk.ui.PlaybackSpeed; +import kotlin.Pair; + @SuppressLint("NonConstantResourceId") public interface AppPreferences { @@ -181,5 +183,9 @@ public interface AppPreferences { void setShowRegularNotificationWarning(boolean value); + void setConversationListPositionAndOffset(int position, int offset); + + Pair getConversationListPositionAndOffset(); + void clear(); } diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt index d11461821..61d4b7985 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/AppPreferencesImpl.kt @@ -400,6 +400,28 @@ class AppPreferencesImpl(val context: Context) : AppPreferences { } } + override fun setConversationListPositionAndOffset(position: Int, offset: Int) { + runBlocking { + async { + writeString(CONVERSATION_LIST_POSITION_OFFSET, "$position,$offset") + } + } + } + + override fun getConversationListPositionAndOffset(): Pair { + val pairString = runBlocking { + async { readString(CONVERSATION_LIST_POSITION_OFFSET).first() } + }.getCompleted() + + if (pairString.isEmpty()) return Pair(0, 0) + + val pairArr = pairString.split(',') + val position = pairArr[0].toInt() + val offset = pairArr[1].toInt() + + return Pair(position, offset) + } + override fun setPhoneBookIntegrationLastRun(currentTimeMillis: Long) = runBlocking { async { @@ -614,6 +636,7 @@ class AppPreferencesImpl(val context: Context) : AppPreferences { const val VOICE_MESSAGE_PLAYBACK_SPEEDS = "voice_message_playback_speeds" const val SHOW_REGULAR_NOTIFICATION_WARNING = "show_regular_notification_warning" const val LAST_NOTIFICATION_WARNING = "last_notification_warning" + const val CONVERSATION_LIST_POSITION_OFFSET = "CONVERSATION_LIST_POSITION_OFFSET" private fun String.convertStringToArray(): Array { var varString = this val floatList = mutableListOf()