Browse Source

Merge pull request #2932 from nextcloud/refactoring/noid/conversationListRemoveConductor

Replace Controller with Activity for ConversationList
Andy Scherzinger 2 years ago
parent
commit
0464163c99
21 changed files with 641 additions and 683 deletions
  1. 4 0
      app/src/main/AndroidManifest.xml
  2. 37 0
      app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt
  3. 9 13
      app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt
  4. 12 26
      app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
  5. 2 17
      app/src/main/java/com/nextcloud/talk/contacts/ContactsActivity.kt
  6. 8 11
      app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt
  7. 96 101
      app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.kt
  8. 2 18
      app/src/main/java/com/nextcloud/talk/conversation/info/ConversationInfoActivity.kt
  9. 319 310
      app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt
  10. 2 18
      app/src/main/java/com/nextcloud/talk/location/GeocodingActivity.kt
  11. 2 16
      app/src/main/java/com/nextcloud/talk/location/LocationPickerActivity.kt
  12. 4 20
      app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt
  13. 2 17
      app/src/main/java/com/nextcloud/talk/profile/ProfileActivity.kt
  14. 2 17
      app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt
  15. 27 14
      app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java
  16. 2 2
      app/src/main/java/com/nextcloud/talk/ui/dialog/ConversationsListBottomDialog.kt
  17. 1 0
      app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt
  18. 0 80
      app/src/main/res/layout/activity_main.xml
  19. 108 1
      app/src/main/res/layout/controller_conversations_rv.xml
  20. 1 1
      app/src/main/res/menu/menu_contacts.xml
  21. 1 1
      app/src/main/res/values/styles.xml

+ 4 - 0
app/src/main/AndroidManifest.xml

@@ -224,6 +224,10 @@
             android:launchMode="singleInstance"
             android:launchMode="singleInstance"
             android:screenOrientation="portrait" />
             android:screenOrientation="portrait" />
 
 
+        <activity
+            android:name=".conversationlist.ConversationsListActivity"
+            android:theme="@style/AppTheme" />
+
         <receiver android:name=".receivers.PackageReplacedReceiver"
         <receiver android:name=".receivers.PackageReplacedReceiver"
             android:exported="false">
             android:exported="false">
             <intent-filter>
             <intent-filter>

+ 37 - 0
app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt

@@ -24,16 +24,19 @@ import android.annotation.SuppressLint
 import android.content.Context
 import android.content.Context
 import android.os.Bundle
 import android.os.Bundle
 import android.util.Log
 import android.util.Log
+import android.view.View
 import android.view.WindowManager
 import android.view.WindowManager
 import android.webkit.SslErrorHandler
 import android.webkit.SslErrorHandler
 import androidx.appcompat.app.AlertDialog
 import androidx.appcompat.app.AlertDialog
 import androidx.appcompat.app.AppCompatActivity
 import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.res.ResourcesCompat
 import autodagger.AutoInjector
 import autodagger.AutoInjector
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.events.CertificateEvent
 import com.nextcloud.talk.events.CertificateEvent
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
+import com.nextcloud.talk.utils.DisplayUtils
 import com.nextcloud.talk.utils.SecurityUtils
 import com.nextcloud.talk.utils.SecurityUtils
 import com.nextcloud.talk.utils.preferences.AppPreferences
 import com.nextcloud.talk.utils.preferences.AppPreferences
 import com.nextcloud.talk.utils.ssl.TrustManager
 import com.nextcloud.talk.utils.ssl.TrustManager
@@ -48,6 +51,10 @@ import javax.inject.Inject
 @AutoInjector(NextcloudTalkApplication::class)
 @AutoInjector(NextcloudTalkApplication::class)
 open class BaseActivity : AppCompatActivity() {
 open class BaseActivity : AppCompatActivity() {
 
 
+    enum class AppBarLayoutType {
+        TOOLBAR, SEARCH_BAR, EMPTY
+    }
+
     @Inject
     @Inject
     lateinit var eventBus: EventBus
     lateinit var eventBus: EventBus
 
 
@@ -60,6 +67,12 @@ open class BaseActivity : AppCompatActivity() {
     @Inject
     @Inject
     lateinit var context: Context
     lateinit var context: Context
 
 
+    open val appBarLayoutType: AppBarLayoutType
+        get() = AppBarLayoutType.TOOLBAR
+
+    open val view: View?
+        get() = null
+
     override fun onCreate(savedInstanceState: Bundle?) {
     override fun onCreate(savedInstanceState: Bundle?) {
         NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
         NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
         super.onCreate(savedInstanceState)
         super.onCreate(savedInstanceState)
@@ -79,6 +92,30 @@ open class BaseActivity : AppCompatActivity() {
         }
         }
     }
     }
 
 
+    fun setupSystemColors() {
+        colorizeStatusBar()
+        colorizeNavigationBar()
+    }
+
+    open fun colorizeStatusBar() {
+        if (resources != null) {
+            if (appBarLayoutType == AppBarLayoutType.SEARCH_BAR) {
+                viewThemeUtils.platform.resetStatusBar(this)
+            } else {
+                viewThemeUtils.platform.themeStatusBar(this)
+            }
+        }
+    }
+
+    fun colorizeNavigationBar() {
+        if (resources != null) {
+            DisplayUtils.applyColorToNavigationBar(
+                this.window,
+                ResourcesCompat.getColor(resources, R.color.bg_default, null)
+            )
+        }
+    }
+
     fun showCertificateDialog(
     fun showCertificateDialog(
         cert: X509Certificate,
         cert: X509Certificate,
         trustManager: TrustManager,
         trustManager: TrustManager,

+ 9 - 13
app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt

@@ -40,19 +40,19 @@ import com.nextcloud.talk.R
 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.chat.ChatActivity
 import com.nextcloud.talk.chat.ChatActivity
-import com.nextcloud.talk.controllers.ConversationsListController
 import com.nextcloud.talk.controllers.LockedController
 import com.nextcloud.talk.controllers.LockedController
 import com.nextcloud.talk.controllers.ServerSelectionController
 import com.nextcloud.talk.controllers.ServerSelectionController
 import com.nextcloud.talk.controllers.WebViewLoginController
 import com.nextcloud.talk.controllers.WebViewLoginController
 import com.nextcloud.talk.controllers.base.providers.ActionBarProvider
 import com.nextcloud.talk.controllers.base.providers.ActionBarProvider
+import com.nextcloud.talk.conversationlist.ConversationsListActivity
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.databinding.ActivityMainBinding
 import com.nextcloud.talk.databinding.ActivityMainBinding
 import com.nextcloud.talk.models.json.conversations.RoomOverall
 import com.nextcloud.talk.models.json.conversations.RoomOverall
-import com.nextcloud.talk.settings.SettingsActivity
 import com.nextcloud.talk.users.UserManager
 import com.nextcloud.talk.users.UserManager
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.SecurityUtils
 import com.nextcloud.talk.utils.SecurityUtils
 import com.nextcloud.talk.utils.bundle.BundleKeys
 import com.nextcloud.talk.utils.bundle.BundleKeys
+import com.nextcloud.talk.utils.bundle.BundleKeys.ADD_ACCOUNT
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ACTIVE_CONVERSATION
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ACTIVE_CONVERSATION
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_ID
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_ID
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
 import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
@@ -93,7 +93,9 @@ class MainActivity : BaseActivity(), ActionBarProvider {
 
 
         router = Conductor.attachRouter(this, binding.controllerContainer, savedInstanceState)
         router = Conductor.attachRouter(this, binding.controllerContainer, savedInstanceState)
 
 
-        if (intent.hasExtra(BundleKeys.KEY_FROM_NOTIFICATION_START_CALL)) {
+        if (intent.hasExtra(ADD_ACCOUNT) && intent.getBooleanExtra(ADD_ACCOUNT, false)) {
+            addAccount()
+        } else if (intent.hasExtra(BundleKeys.KEY_FROM_NOTIFICATION_START_CALL)) {
             onNewIntent(intent)
             onNewIntent(intent)
         } else if (!router!!.hasRootController()) {
         } else if (!router!!.hasRootController()) {
             if (!appPreferences.isDbRoomMigrated) {
             if (!appPreferences.isDbRoomMigrated) {
@@ -165,11 +167,10 @@ class MainActivity : BaseActivity(), ActionBarProvider {
     }
     }
 
 
     private fun setDefaultRootController() {
     private fun setDefaultRootController() {
-        router!!.setRoot(
-            RouterTransaction.with(ConversationsListController(Bundle()))
-                .pushChangeHandler(HorizontalChangeHandler())
-                .popChangeHandler(HorizontalChangeHandler())
-        )
+        val intent = Intent(this, ConversationsListActivity::class.java)
+        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+        intent.putExtras(Bundle())
+        startActivity(intent)
     }
     }
 
 
     fun resetConversationsList() {
     fun resetConversationsList() {
@@ -192,11 +193,6 @@ class MainActivity : BaseActivity(), ActionBarProvider {
         })
         })
     }
     }
 
 
-    fun openSettings() {
-        val intent = Intent(this, SettingsActivity::class.java)
-        startActivity(intent)
-    }
-
     fun addAccount() {
     fun addAccount() {
         router!!.pushController(
         router!!.pushController(
             RouterTransaction.with(ServerSelectionController())
             RouterTransaction.with(ServerSelectionController())

+ 12 - 26
app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt

@@ -74,7 +74,6 @@ import androidx.appcompat.view.ContextThemeWrapper
 import androidx.core.content.ContextCompat
 import androidx.core.content.ContextCompat
 import androidx.core.content.FileProvider
 import androidx.core.content.FileProvider
 import androidx.core.content.PermissionChecker
 import androidx.core.content.PermissionChecker
-import androidx.core.content.res.ResourcesCompat
 import androidx.core.graphics.drawable.toBitmap
 import androidx.core.graphics.drawable.toBitmap
 import androidx.core.widget.doAfterTextChanged
 import androidx.core.widget.doAfterTextChanged
 import androidx.emoji2.text.EmojiCompat
 import androidx.emoji2.text.EmojiCompat
@@ -121,8 +120,8 @@ import com.nextcloud.talk.adapters.messages.VoiceMessageInterface
 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.callbacks.MentionAutocompleteCallback
 import com.nextcloud.talk.callbacks.MentionAutocompleteCallback
-import com.nextcloud.talk.controllers.ConversationsListController
 import com.nextcloud.talk.conversation.info.ConversationInfoActivity
 import com.nextcloud.talk.conversation.info.ConversationInfoActivity
+import com.nextcloud.talk.conversationlist.ConversationsListActivity
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.databinding.ControllerChatBinding
 import com.nextcloud.talk.databinding.ControllerChatBinding
 import com.nextcloud.talk.events.UserMentionClickEvent
 import com.nextcloud.talk.events.UserMentionClickEvent
@@ -160,7 +159,6 @@ import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ContactUtils
 import com.nextcloud.talk.utils.ContactUtils
 import com.nextcloud.talk.utils.DateConstants
 import com.nextcloud.talk.utils.DateConstants
 import com.nextcloud.talk.utils.DateUtils
 import com.nextcloud.talk.utils.DateUtils
-import com.nextcloud.talk.utils.DisplayUtils
 import com.nextcloud.talk.utils.FileUtils
 import com.nextcloud.talk.utils.FileUtils
 import com.nextcloud.talk.utils.ImageEmojiEditText
 import com.nextcloud.talk.utils.ImageEmojiEditText
 import com.nextcloud.talk.utils.MagicCharPolicy
 import com.nextcloud.talk.utils.MagicCharPolicy
@@ -244,6 +242,9 @@ class ChatActivity :
     @Inject
     @Inject
     lateinit var dateUtils: DateUtils
     lateinit var dateUtils: DateUtils
 
 
+    override val view: View
+        get() = binding.root
+
     val disposables = DisposableSet()
     val disposables = DisposableSet()
 
 
     var sessionIdAfterRoomJoined: String? = null
     var sessionIdAfterRoomJoined: String? = null
@@ -313,8 +314,8 @@ class ChatActivity :
 
 
         binding = ControllerChatBinding.inflate(layoutInflater)
         binding = ControllerChatBinding.inflate(layoutInflater)
         setupActionBar()
         setupActionBar()
-        setupSystemColors()
         setContentView(binding.root)
         setContentView(binding.root)
+        setupSystemColors()
 
 
         handleIntent(intent)
         handleIntent(intent)
 
 
@@ -562,6 +563,8 @@ class ChatActivity :
             loadAvatarForStatusBar()
             loadAvatarForStatusBar()
             setActionBarTitle()
             setActionBarTitle()
         }
         }
+
+        viewThemeUtils.material.colorToolbarOverflowIcon(binding.chatToolbar)
     }
     }
 
 
     private fun setupActionBar() {
     private fun setupActionBar() {
@@ -573,21 +576,7 @@ class ChatActivity :
         supportActionBar?.setDisplayShowHomeEnabled(true)
         supportActionBar?.setDisplayShowHomeEnabled(true)
         supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(R.color.transparent)))
         supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(R.color.transparent)))
         setActionBarTitle()
         setActionBarTitle()
-    }
-
-    private fun setupSystemColors() {
-        DisplayUtils.applyColorToStatusBar(
-            this,
-            ResourcesCompat.getColor(
-                resources,
-                R.color.appbar,
-                null
-            )
-        )
-        DisplayUtils.applyColorToNavigationBar(
-            this.window,
-            ResourcesCompat.getColor(resources, R.color.bg_default, null)
-        )
+        viewThemeUtils.material.themeToolbar(binding.chatToolbar)
     }
     }
 
 
     private fun initAdapter() {
     private fun initAdapter() {
@@ -1763,7 +1752,7 @@ class ChatActivity :
         super.onRequestPermissionsResult(requestCode, permissions, grantResults)
         super.onRequestPermissionsResult(requestCode, permissions, grantResults)
         if (requestCode == UploadAndShareFilesWorker.REQUEST_PERMISSION) {
         if (requestCode == UploadAndShareFilesWorker.REQUEST_PERMISSION) {
             if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
             if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-                Log.d(ConversationsListController.TAG, "upload starting after permissions were granted")
+                Log.d(ConversationsListActivity.TAG, "upload starting after permissions were granted")
                 if (filesToUpload.isNotEmpty()) {
                 if (filesToUpload.isNotEmpty()) {
                     uploadFiles(filesToUpload)
                     uploadFiles(filesToUpload)
                 }
                 }
@@ -3154,12 +3143,9 @@ class ChatActivity :
         bundle.putString(BundleKeys.KEY_FORWARD_MSG_TEXT, message?.text)
         bundle.putString(BundleKeys.KEY_FORWARD_MSG_TEXT, message?.text)
         bundle.putString(BundleKeys.KEY_FORWARD_HIDE_SOURCE_ROOM, roomId)
         bundle.putString(BundleKeys.KEY_FORWARD_HIDE_SOURCE_ROOM, roomId)
 
 
-        // TODO
-        // router.pushController(
-        //     RouterTransaction.with(ConversationsListController(bundle))
-        //         .pushChangeHandler(HorizontalChangeHandler())
-        //         .popChangeHandler(HorizontalChangeHandler())
-        // )
+        val intent = Intent(this, ConversationsListActivity::class.java)
+        intent.putExtras(bundle)
+        startActivity(intent)
     }
     }
 
 
     fun markAsUnread(message: IMessage?) {
     fun markAsUnread(message: IMessage?) {

+ 2 - 17
app/src/main/java/com/nextcloud/talk/contacts/ContactsActivity.kt

@@ -66,7 +66,6 @@ import com.nextcloud.talk.models.json.participants.Participant
 import com.nextcloud.talk.ui.dialog.ContactsBottomDialog
 import com.nextcloud.talk.ui.dialog.ContactsBottomDialog
 import com.nextcloud.talk.users.UserManager
 import com.nextcloud.talk.users.UserManager
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ApiUtils
-import com.nextcloud.talk.utils.DisplayUtils
 import com.nextcloud.talk.utils.bundle.BundleKeys
 import com.nextcloud.talk.utils.bundle.BundleKeys
 import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
 import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
 import eu.davidea.flexibleadapter.FlexibleAdapter
 import eu.davidea.flexibleadapter.FlexibleAdapter
@@ -128,8 +127,8 @@ class ContactsActivity :
 
 
         binding = ControllerContactsRvBinding.inflate(layoutInflater)
         binding = ControllerContactsRvBinding.inflate(layoutInflater)
         setupActionBar()
         setupActionBar()
-        setupSystemColors()
         setContentView(binding.root)
         setContentView(binding.root)
+        setupSystemColors()
 
 
         if (savedInstanceState != null) {
         if (savedInstanceState != null) {
             if (adapter != null) {
             if (adapter != null) {
@@ -205,21 +204,7 @@ class ContactsActivity :
                 resources!!.getString(R.string.nc_app_product_name)
                 resources!!.getString(R.string.nc_app_product_name)
             }
             }
         }
         }
-    }
-
-    private fun setupSystemColors() {
-        DisplayUtils.applyColorToStatusBar(
-            this,
-            ResourcesCompat.getColor(
-                resources,
-                R.color.appbar,
-                null
-            )
-        )
-        DisplayUtils.applyColorToNavigationBar(
-            this.window,
-            ResourcesCompat.getColor(resources, R.color.bg_default, null)
-        )
+        viewThemeUtils.material.themeToolbar(binding.contactsToolbar)
     }
     }
 
 
     override fun onSaveInstanceState(bundle: Bundle) {
     override fun onSaveInstanceState(bundle: Bundle) {

+ 8 - 11
app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt

@@ -22,6 +22,7 @@
 package com.nextcloud.talk.controllers
 package com.nextcloud.talk.controllers
 
 
 import android.annotation.SuppressLint
 import android.annotation.SuppressLint
+import android.content.Intent
 import android.content.pm.ActivityInfo
 import android.content.pm.ActivityInfo
 import android.os.Bundle
 import android.os.Bundle
 import android.os.Handler
 import android.os.Handler
@@ -42,6 +43,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
 import com.nextcloud.talk.controllers.base.BaseController
 import com.nextcloud.talk.controllers.base.BaseController
 import com.nextcloud.talk.controllers.util.viewBinding
 import com.nextcloud.talk.controllers.util.viewBinding
+import com.nextcloud.talk.conversationlist.ConversationsListActivity
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.databinding.ControllerAccountVerificationBinding
 import com.nextcloud.talk.databinding.ControllerAccountVerificationBinding
 import com.nextcloud.talk.events.EventStatus
 import com.nextcloud.talk.events.EventStatus
@@ -457,17 +459,15 @@ class AccountVerificationController(args: Bundle? = null) :
             if (activity != null) {
             if (activity != null) {
                 activity!!.runOnUiThread {
                 activity!!.runOnUiThread {
                     if (userManager.users.blockingGet().size == 1) {
                     if (userManager.users.blockingGet().size == 1) {
-                        router.setRoot(
-                            RouterTransaction.with(ConversationsListController(Bundle()))
-                                .pushChangeHandler(HorizontalChangeHandler())
-                                .popChangeHandler(HorizontalChangeHandler())
-                        )
+                        val intent = Intent(context, ConversationsListActivity::class.java)
+                        startActivity(intent)
                     } else {
                     } else {
                         if (isAccountImport) {
                         if (isAccountImport) {
                             ApplicationWideMessageHolder.getInstance().messageType =
                             ApplicationWideMessageHolder.getInstance().messageType =
                                 ApplicationWideMessageHolder.MessageType.ACCOUNT_WAS_IMPORTED
                                 ApplicationWideMessageHolder.MessageType.ACCOUNT_WAS_IMPORTED
                         }
                         }
-                        router.popToRoot()
+                        val intent = Intent(context, ConversationsListActivity::class.java)
+                        startActivity(intent)
                     }
                     }
                 }
                 }
             }
             }
@@ -517,11 +517,8 @@ class AccountVerificationController(args: Bundle? = null) :
                         }
                         }
                     } else {
                     } else {
                         if (userManager.users.blockingGet().isNotEmpty()) {
                         if (userManager.users.blockingGet().isNotEmpty()) {
-                            router.setRoot(
-                                RouterTransaction.with(ConversationsListController(Bundle()))
-                                    .pushChangeHandler(HorizontalChangeHandler())
-                                    .popChangeHandler(HorizontalChangeHandler())
-                            )
+                            val intent = Intent(context, ConversationsListActivity::class.java)
+                            startActivity(intent)
                         } else {
                         } else {
                             router.setRoot(
                             router.setRoot(
                                 RouterTransaction.with(ServerSelectionController())
                                 RouterTransaction.with(ServerSelectionController())

+ 96 - 101
app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.kt

@@ -22,10 +22,7 @@
  */
  */
 package com.nextcloud.talk.controllers.base
 package com.nextcloud.talk.controllers.base
 
 
-import android.animation.AnimatorInflater
-import android.app.Activity
 import android.content.Context
 import android.content.Context
-import android.content.res.Resources
 import android.os.Build
 import android.os.Build
 import android.os.Bundle
 import android.os.Bundle
 import android.util.Log
 import android.util.Log
@@ -39,12 +36,10 @@ import android.widget.EditText
 import androidx.annotation.LayoutRes
 import androidx.annotation.LayoutRes
 import androidx.annotation.RequiresApi
 import androidx.annotation.RequiresApi
 import androidx.appcompat.app.ActionBar
 import androidx.appcompat.app.ActionBar
-import androidx.core.content.res.ResourcesCompat
 import autodagger.AutoInjector
 import autodagger.AutoInjector
 import com.bluelinelabs.conductor.Controller
 import com.bluelinelabs.conductor.Controller
 import com.bluelinelabs.conductor.ControllerChangeHandler
 import com.bluelinelabs.conductor.ControllerChangeHandler
 import com.bluelinelabs.conductor.ControllerChangeType
 import com.bluelinelabs.conductor.ControllerChangeType
-import com.google.android.material.appbar.AppBarLayout
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
 import com.nextcloud.talk.activities.MainActivity
 import com.nextcloud.talk.activities.MainActivity
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication
@@ -54,13 +49,12 @@ import com.nextcloud.talk.controllers.ServerSelectionController
 import com.nextcloud.talk.controllers.SwitchAccountController
 import com.nextcloud.talk.controllers.SwitchAccountController
 import com.nextcloud.talk.controllers.WebViewLoginController
 import com.nextcloud.talk.controllers.WebViewLoginController
 import com.nextcloud.talk.controllers.base.providers.ActionBarProvider
 import com.nextcloud.talk.controllers.base.providers.ActionBarProvider
-import com.nextcloud.talk.databinding.ActivityMainBinding
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
-import com.nextcloud.talk.utils.DisplayUtils
 import com.nextcloud.talk.utils.preferences.AppPreferences
 import com.nextcloud.talk.utils.preferences.AppPreferences
 import javax.inject.Inject
 import javax.inject.Inject
 import kotlin.jvm.internal.Intrinsics
 import kotlin.jvm.internal.Intrinsics
 
 
+// TODO: check what needs to be migrated from this class to BaseActivity etc when conductor is removed
 @AutoInjector(NextcloudTalkApplication::class)
 @AutoInjector(NextcloudTalkApplication::class)
 abstract class BaseController(@LayoutRes var layoutRes: Int, args: Bundle? = null) : Controller(args) {
 abstract class BaseController(@LayoutRes var layoutRes: Int, args: Bundle? = null) : Controller(args) {
     enum class AppBarLayoutType {
     enum class AppBarLayoutType {
@@ -120,12 +114,12 @@ abstract class BaseController(@LayoutRes var layoutRes: Int, args: Bundle? = nul
     protected open fun onViewBound(view: View) {
     protected open fun onViewBound(view: View) {
         var activity: MainActivity? = null
         var activity: MainActivity? = null
 
 
-        if (getActivity() != null && getActivity() is MainActivity) {
-            activity = getActivity() as MainActivity?
-            viewThemeUtils.material.themeCardView(activity!!.binding.searchToolbar)
-            viewThemeUtils.material.themeToolbar(activity.binding.toolbar)
-            viewThemeUtils.material.themeSearchBarText(activity.binding.searchText)
-        }
+        // if (getActivity() != null && getActivity() is MainActivity) {
+        //     activity = getActivity() as MainActivity?
+        //     viewThemeUtils.material.themeCardView(activity!!.binding.searchToolbar)
+        //     viewThemeUtils.material.themeToolbar(activity.binding.toolbar)
+        //     viewThemeUtils.material.themeSearchBarText(activity.binding.searchText)
+        // }
 
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && appPreferences.isKeyboardIncognito) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && appPreferences.isKeyboardIncognito) {
             disableKeyboardPersonalisedLearning((view as ViewGroup))
             disableKeyboardPersonalisedLearning((view as ViewGroup))
@@ -136,7 +130,7 @@ abstract class BaseController(@LayoutRes var layoutRes: Int, args: Bundle? = nul
     }
     }
 
 
     override fun onAttach(view: View) {
     override fun onAttach(view: View) {
-        showSearchOrToolbar()
+        // showSearchOrToolbar()
         setTitle()
         setTitle()
         if (actionBar != null) {
         if (actionBar != null) {
             actionBar!!.setDisplayHomeAsUpEnabled(parentController != null || router.backstackSize >= 1)
             actionBar!!.setDisplayHomeAsUpEnabled(parentController != null || router.backstackSize >= 1)
@@ -144,93 +138,93 @@ abstract class BaseController(@LayoutRes var layoutRes: Int, args: Bundle? = nul
         super.onAttach(view)
         super.onAttach(view)
     }
     }
 
 
-    open fun showSearchOrToolbar() {
-        if (isValidActivity(activity)) {
-            val showSearchBar = appBarLayoutType == AppBarLayoutType.SEARCH_BAR
-            val activity = activity as MainActivity
-
-            if (appBarLayoutType == AppBarLayoutType.EMPTY) {
-                hideBars(activity.binding)
-            } else {
-                if (showSearchBar) {
-                    showSearchBar(activity.binding)
-                } else {
-                    showToolbar(activity.binding)
-                }
-                colorizeStatusBar(showSearchBar, activity, resources)
-            }
-
-            colorizeNavigationBar(activity, resources)
-        }
-    }
-
-    private fun isValidActivity(activity: Activity?): Boolean {
-        return activity != null && activity is MainActivity
-    }
-
-    private fun showSearchBar(binding: ActivityMainBinding) {
-        val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
-        binding.searchToolbar.visibility = View.VISIBLE
-        binding.searchText.hint = searchHint
-        binding.toolbar.visibility = View.GONE
-        // layoutParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout
-        // .LayoutParams.SCROLL_FLAG_SNAP | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
-        layoutParams.scrollFlags = 0
-        binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
-            binding.appBar.context,
-            R.animator.appbar_elevation_off
-        )
-        binding.searchToolbar.layoutParams = layoutParams
-    }
-
-    private fun showToolbar(binding: ActivityMainBinding) {
-        val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
-        binding.searchToolbar.visibility = View.GONE
-        binding.toolbar.visibility = View.VISIBLE
-        viewThemeUtils.material.colorToolbarOverflowIcon(binding.toolbar)
-        layoutParams.scrollFlags = 0
-        binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
-            binding.appBar.context,
-            R.animator.appbar_elevation_on
-        )
-        binding.searchToolbar.layoutParams = layoutParams
-    }
-
-    private fun hideBars(binding: ActivityMainBinding) {
-        binding.toolbar.visibility = View.GONE
-        binding.searchToolbar.visibility = View.GONE
-    }
-
-    fun hideSearchBar() {
-        val activity = activity as MainActivity?
-        val layoutParams = activity!!.binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
-        activity.binding.searchToolbar.visibility = View.GONE
-        activity.binding.toolbar.visibility = View.VISIBLE
-        layoutParams.scrollFlags = 0
-        activity.binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
-            activity.binding.appBar.context,
-            R.animator.appbar_elevation_on
-        )
-    }
-
-    private fun colorizeStatusBar(showSearchBar: Boolean, activity: Activity?, resources: Resources?) {
-        if (activity != null && resources != null) {
-            if (showSearchBar) {
-                view?.let { viewThemeUtils.platform.resetStatusBar(activity) }
-            } else {
-                view?.let { viewThemeUtils.platform.themeStatusBar(activity, it) }
-            }
-        }
-    }
-
-    private fun colorizeNavigationBar(activity: Activity?, resources: Resources?) {
-        if (activity != null && resources != null) {
-            DisplayUtils.applyColorToNavigationBar(
-                activity.window,
-                ResourcesCompat.getColor(resources, R.color.bg_default, null)
-            )
-        }
-    }
+    // open fun showSearchOrToolbar() {
+    //     if (isValidActivity(activity)) {
+    //         val showSearchBar = appBarLayoutType == AppBarLayoutType.SEARCH_BAR
+    //         val activity = activity as MainActivity
+    //
+    //         if (appBarLayoutType == AppBarLayoutType.EMPTY) {
+    //             hideBars(activity.binding)
+    //         } else {
+    //             if (showSearchBar) {
+    //                 showSearchBar(activity.binding)
+    //             } else {
+    //                 showToolbar(activity.binding)
+    //             }
+    //             colorizeStatusBar(showSearchBar, activity, resources)
+    //         }
+    //
+    //         colorizeNavigationBar(activity, resources)
+    //     }
+    // }
+    //
+    // private fun isValidActivity(activity: Activity?): Boolean {
+    //     return activity != null && activity is MainActivity
+    // }
+    //
+    // private fun showSearchBar(binding: ActivityMainBinding) {
+    //     val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
+    //     binding.searchToolbar.visibility = View.VISIBLE
+    //     binding.searchText.hint = searchHint
+    //     binding.toolbar.visibility = View.GONE
+    //     // layoutParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout
+    //     // .LayoutParams.SCROLL_FLAG_SNAP | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
+    //     layoutParams.scrollFlags = 0
+    //     binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
+    //         binding.appBar.context,
+    //         R.animator.appbar_elevation_off
+    //     )
+    //     binding.searchToolbar.layoutParams = layoutParams
+    // }
+    //
+    // private fun showToolbar(binding: ActivityMainBinding) {
+    //     val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
+    //     binding.searchToolbar.visibility = View.GONE
+    //     binding.toolbar.visibility = View.VISIBLE
+    //     viewThemeUtils.material.colorToolbarOverflowIcon(binding.toolbar)
+    //     layoutParams.scrollFlags = 0
+    //     binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
+    //         binding.appBar.context,
+    //         R.animator.appbar_elevation_on
+    //     )
+    //     binding.searchToolbar.layoutParams = layoutParams
+    // }
+    //
+    // private fun hideBars(binding: ActivityMainBinding) {
+    //     binding.toolbar.visibility = View.GONE
+    //     binding.searchToolbar.visibility = View.GONE
+    // }
+    //
+    // fun hideSearchBar() {
+    //     val activity = activity as MainActivity?
+    //     val layoutParams = activity!!.binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
+    //     activity.binding.searchToolbar.visibility = View.GONE
+    //     activity.binding.toolbar.visibility = View.VISIBLE
+    //     layoutParams.scrollFlags = 0
+    //     activity.binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
+    //         activity.binding.appBar.context,
+    //         R.animator.appbar_elevation_on
+    //     )
+    // }
+    //
+    // private fun colorizeStatusBar(showSearchBar: Boolean, activity: Activity?, resources: Resources?) {
+    //     if (activity != null && resources != null) {
+    //         if (showSearchBar) {
+    //             view?.let { viewThemeUtils.platform.resetStatusBar(activity) }
+    //         } else {
+    //             view?.let { viewThemeUtils.platform.themeStatusBar(activity, it) }
+    //         }
+    //     }
+    // }
+    //
+    // private fun colorizeNavigationBar(activity: Activity?, resources: Resources?) {
+    //     if (activity != null && resources != null) {
+    //         DisplayUtils.applyColorToNavigationBar(
+    //             activity.window,
+    //             ResourcesCompat.getColor(resources, R.color.bg_default, null)
+    //         )
+    //     }
+    // }
 
 
     override fun onDetach(view: View) {
     override fun onDetach(view: View) {
         super.onDetach(view)
         super.onDetach(view)
@@ -277,6 +271,7 @@ abstract class BaseController(@LayoutRes var layoutRes: Int, args: Bundle? = nul
         Intrinsics.checkNotNullParameter(toolbar, "toolbar")
         Intrinsics.checkNotNullParameter(toolbar, "toolbar")
     }
     }
 
 
+    // TODO: check if this must be migrated when using activities instead of conductor
     private fun cleanTempCertPreference() {
     private fun cleanTempCertPreference() {
         val temporaryClassNames: MutableList<String> = ArrayList()
         val temporaryClassNames: MutableList<String> = ArrayList()
         temporaryClassNames.add(ServerSelectionController::class.java.name)
         temporaryClassNames.add(ServerSelectionController::class.java.name)

+ 2 - 18
app/src/main/java/com/nextcloud/talk/conversation/info/ConversationInfoActivity.kt

@@ -39,7 +39,6 @@ import android.view.View.VISIBLE
 import android.widget.Toast
 import android.widget.Toast
 import androidx.appcompat.app.AlertDialog
 import androidx.appcompat.app.AlertDialog
 import androidx.appcompat.widget.SwitchCompat
 import androidx.appcompat.widget.SwitchCompat
-import androidx.core.content.res.ResourcesCompat
 import androidx.work.Data
 import androidx.work.Data
 import androidx.work.OneTimeWorkRequest
 import androidx.work.OneTimeWorkRequest
 import androidx.work.WorkManager
 import androidx.work.WorkManager
@@ -81,7 +80,6 @@ import com.nextcloud.talk.shareditems.activities.SharedItemsActivity
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.DateConstants
 import com.nextcloud.talk.utils.DateConstants
 import com.nextcloud.talk.utils.DateUtils
 import com.nextcloud.talk.utils.DateUtils
-import com.nextcloud.talk.utils.DisplayUtils
 import com.nextcloud.talk.utils.bundle.BundleKeys
 import com.nextcloud.talk.utils.bundle.BundleKeys
 import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
 import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew
 import com.nextcloud.talk.utils.preferences.preferencestorage.DatabaseStorageModule
 import com.nextcloud.talk.utils.preferences.preferencestorage.DatabaseStorageModule
@@ -145,8 +143,8 @@ class ConversationInfoActivity :
 
 
         binding = ControllerConversationInfoBinding.inflate(layoutInflater)
         binding = ControllerConversationInfoBinding.inflate(layoutInflater)
         setupActionBar()
         setupActionBar()
-        setupSystemColors()
         setContentView(binding.root)
         setContentView(binding.root)
+        setupSystemColors()
 
 
         conversationUser = intent.getParcelableExtra(BundleKeys.KEY_USER_ENTITY)!!
         conversationUser = intent.getParcelableExtra(BundleKeys.KEY_USER_ENTITY)!!
         conversationToken = intent.getStringExtra(BundleKeys.KEY_ROOM_TOKEN)!!
         conversationToken = intent.getStringExtra(BundleKeys.KEY_ROOM_TOKEN)!!
@@ -199,21 +197,7 @@ class ConversationInfoActivity :
         } else {
         } else {
             resources!!.getString(R.string.nc_conversation_menu_conversation_info)
             resources!!.getString(R.string.nc_conversation_menu_conversation_info)
         }
         }
-    }
-
-    private fun setupSystemColors() {
-        DisplayUtils.applyColorToStatusBar(
-            this,
-            ResourcesCompat.getColor(
-                resources,
-                R.color.appbar,
-                null
-            )
-        )
-        DisplayUtils.applyColorToNavigationBar(
-            this.window,
-            ResourcesCompat.getColor(resources, R.color.bg_default, null)
-        )
+        viewThemeUtils.material.themeToolbar(binding.conversationInfoToolbar)
     }
     }
 
 
     private fun themeSwitchPreferences() {
     private fun themeSwitchPreferences() {

+ 319 - 310
app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.kt → app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt

@@ -23,7 +23,7 @@
  * You should have received a copy of the GNU General Public License
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
  */
-package com.nextcloud.talk.controllers
+package com.nextcloud.talk.conversationlist
 
 
 import android.animation.AnimatorInflater
 import android.animation.AnimatorInflater
 import android.annotation.SuppressLint
 import android.annotation.SuppressLint
@@ -31,6 +31,7 @@ import android.app.SearchManager
 import android.content.Context
 import android.content.Context
 import android.content.Intent
 import android.content.Intent
 import android.content.pm.PackageManager
 import android.content.pm.PackageManager
+import android.graphics.drawable.ColorDrawable
 import android.graphics.drawable.Drawable
 import android.graphics.drawable.Drawable
 import android.net.Uri
 import android.net.Uri
 import android.os.Build
 import android.os.Build
@@ -40,7 +41,6 @@ import android.text.InputType
 import android.text.TextUtils
 import android.text.TextUtils
 import android.util.Log
 import android.util.Log
 import android.view.Menu
 import android.view.Menu
-import android.view.MenuInflater
 import android.view.MenuItem
 import android.view.MenuItem
 import android.view.MotionEvent
 import android.view.MotionEvent
 import android.view.View
 import android.view.View
@@ -60,13 +60,12 @@ import coil.imageLoader
 import coil.request.ImageRequest
 import coil.request.ImageRequest
 import coil.target.Target
 import coil.target.Target
 import coil.transform.CircleCropTransformation
 import coil.transform.CircleCropTransformation
-import com.bluelinelabs.conductor.RouterTransaction
-import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler
+import com.google.android.material.appbar.AppBarLayout
 import com.google.android.material.button.MaterialButton
 import com.google.android.material.button.MaterialButton
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
+import com.nextcloud.talk.activities.BaseActivity
 import com.nextcloud.talk.activities.CallActivity
 import com.nextcloud.talk.activities.CallActivity
-import com.nextcloud.talk.activities.MainActivity
 import com.nextcloud.talk.adapters.items.ConversationItem
 import com.nextcloud.talk.adapters.items.ConversationItem
 import com.nextcloud.talk.adapters.items.GenericTextHeaderItem
 import com.nextcloud.talk.adapters.items.GenericTextHeaderItem
 import com.nextcloud.talk.adapters.items.LoadMoreResultsItem
 import com.nextcloud.talk.adapters.items.LoadMoreResultsItem
@@ -74,11 +73,8 @@ 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.application.NextcloudTalkApplication.Companion.sharedApplication
 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.controllers.base.BaseController
-import com.nextcloud.talk.controllers.util.viewBinding
 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
@@ -130,7 +126,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers
 import io.reactivex.disposables.Disposable
 import io.reactivex.disposables.Disposable
 import io.reactivex.schedulers.Schedulers
 import io.reactivex.schedulers.Schedulers
 import org.apache.commons.lang3.builder.CompareToBuilder
 import org.apache.commons.lang3.builder.CompareToBuilder
-import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import org.greenrobot.eventbus.ThreadMode
 import org.parceler.Parcels
 import org.parceler.Parcels
@@ -140,18 +135,16 @@ import java.util.concurrent.TimeUnit
 import javax.inject.Inject
 import javax.inject.Inject
 
 
 @AutoInjector(NextcloudTalkApplication::class)
 @AutoInjector(NextcloudTalkApplication::class)
-class ConversationsListController(bundle: Bundle) :
-    BaseController(R.layout.controller_conversations_rv, bundle),
+class ConversationsListActivity :
+    BaseActivity(),
     FlexibleAdapter.OnItemClickListener,
     FlexibleAdapter.OnItemClickListener,
     FlexibleAdapter.OnItemLongClickListener,
     FlexibleAdapter.OnItemLongClickListener,
     ConversationMenuInterface {
     ConversationMenuInterface {
-    private val bundle: Bundle
 
 
-    @Inject
-    lateinit var userManager: UserManager
+    private lateinit var binding: ControllerConversationsRvBinding
 
 
     @Inject
     @Inject
-    lateinit var eventBus: EventBus
+    lateinit var userManager: UserManager
 
 
     @Inject
     @Inject
     lateinit var ncApi: NcApi
     lateinit var ncApi: NcApi
@@ -162,11 +155,6 @@ class ConversationsListController(bundle: Bundle) :
     @Inject
     @Inject
     lateinit var platformPermissionUtil: PlatformPermissionUtil
     lateinit var platformPermissionUtil: PlatformPermissionUtil
 
 
-    private val binding: ControllerConversationsRvBinding? by viewBinding(ControllerConversationsRvBinding::bind)
-
-    override val title: String
-        get() = resources!!.getString(R.string.nc_app_product_name)
-
     override val appBarLayoutType: AppBarLayoutType
     override val appBarLayoutType: AppBarLayoutType
         get() = AppBarLayoutType.SEARCH_BAR
         get() = AppBarLayoutType.SEARCH_BAR
 
 
@@ -190,7 +178,7 @@ class ConversationsListController(bundle: Bundle) :
     private var selectedConversation: Conversation? = null
     private var selectedConversation: Conversation? = null
     private var textToPaste: String? = ""
     private var textToPaste: String? = ""
     private var selectedMessageId: String? = null
     private var selectedMessageId: String? = null
-    private var forwardMessage: Boolean
+    private var forwardMessage: Boolean = false
     private var nextUnreadConversationScrollPosition = 0
     private var nextUnreadConversationScrollPosition = 0
     private var layoutManager: SmoothScrollLinearLayoutManager? = null
     private var layoutManager: SmoothScrollLinearLayoutManager? = null
     private val callHeaderItems = HashMap<String, GenericTextHeaderItem>()
     private val callHeaderItems = HashMap<String, GenericTextHeaderItem>()
@@ -198,46 +186,98 @@ class ConversationsListController(bundle: Bundle) :
     private var searchHelper: MessageSearchHelper? = null
     private var searchHelper: MessageSearchHelper? = null
     private var searchViewDisposable: Disposable? = null
     private var searchViewDisposable: Disposable? = null
 
 
-    override fun onViewBound(view: View) {
-        super.onViewBound(view)
-        sharedApplication!!.componentApplication.inject(this)
-        actionBar?.show()
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
+
+        binding = ControllerConversationsRvBinding.inflate(layoutInflater)
+        setupActionBar()
+        setContentView(binding.root)
+        setupSystemColors()
+        viewThemeUtils.material.themeCardView(binding.searchToolbar)
+        viewThemeUtils.material.themeSearchBarText(binding.searchText)
+
+        forwardMessage = intent.getBooleanExtra(KEY_FORWARD_MSG_FLAG, false)
+    }
+
+    override fun onResume() {
+        super.onResume()
+
+        // actionBar?.show()
         if (adapter == null) {
         if (adapter == null) {
-            adapter = FlexibleAdapter(conversationItems, activity, true)
+            adapter = FlexibleAdapter(conversationItems, this, true)
         } else {
         } else {
             binding?.loadingContent?.visibility = View.GONE
             binding?.loadingContent?.visibility = View.GONE
         }
         }
         adapter!!.addListener(this)
         adapter!!.addListener(this)
         prepareViews()
         prepareViews()
+
+        showShareToScreen = hasActivityActionSendIntent()
+
+        ClosedInterfaceImpl().setUpPushTokenRegistration()
+        if (!eventBus.isRegistered(this)) {
+            eventBus.register(this)
+        }
+        currentUser = userManager.currentUser.blockingGet()
+        if (currentUser != null) {
+            if (isServerEOL(currentUser!!)) {
+                showServerEOLDialog()
+                return
+            }
+            if (isUnifiedSearchAvailable(currentUser!!)) {
+                searchHelper = MessageSearchHelper(unifiedSearchRepository)
+            }
+            credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token)
+
+            loadUserAvatar(binding.switchAccountButton)
+            viewThemeUtils.material.colorMaterialTextButton(binding.switchAccountButton)
+
+            fetchRooms()
+        } else {
+            Log.e(TAG, "userManager.currentUser.blockingGet() returned null")
+            Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show()
+        }
+
+        showSearchOrToolbar()
+    }
+
+    private fun setupActionBar() {
+        setSupportActionBar(binding.conversationListToolbar)
+        binding.conversationListToolbar.setNavigationOnClickListener {
+            onBackPressed()
+        }
+        supportActionBar?.setDisplayHomeAsUpEnabled(true)
+        supportActionBar?.setDisplayShowHomeEnabled(true)
+        supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(R.color.transparent)))
+        supportActionBar?.title = resources!!.getString(R.string.nc_app_product_name)
+        viewThemeUtils.material.themeToolbar(binding.conversationListToolbar)
     }
     }
 
 
     private fun loadUserAvatar(
     private fun loadUserAvatar(
         target: Target
         target: Target
     ) {
     ) {
-        if (activity != null) {
-            if (currentUser != null) {
-                val url = ApiUtils.getUrlForAvatar(
-                    currentUser!!.baseUrl,
-                    currentUser!!.userId,
-                    true
-                )
+        if (currentUser != null) {
+            val url = ApiUtils.getUrlForAvatar(
+                currentUser!!.baseUrl,
+                currentUser!!.userId,
+                true
+            )
 
 
-                val credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token)
-
-                context.imageLoader.enqueue(
-                    ImageRequest.Builder(context)
-                        .data(url)
-                        .addHeader("Authorization", credentials)
-                        .placeholder(R.drawable.ic_user)
-                        .transformations(CircleCropTransformation())
-                        .crossfade(true)
-                        .target(target)
-                        .build()
-                )
-            } else {
-                Log.e(TAG, "currentUser was null in loadUserAvatar")
-                Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show()
-            }
+            val credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token)
+
+            context.imageLoader.enqueue(
+                ImageRequest.Builder(context)
+                    .data(url)
+                    .addHeader("Authorization", credentials)
+                    .placeholder(R.drawable.ic_user)
+                    .transformations(CircleCropTransformation())
+                    .crossfade(true)
+                    .target(target)
+                    .build()
+            )
+        } else {
+            Log.e(TAG, "currentUser was null in loadUserAvatar")
+            Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show()
         }
         }
     }
     }
 
 
@@ -268,92 +308,44 @@ class ConversationsListController(bundle: Bundle) :
         loadUserAvatar(target)
         loadUserAvatar(target)
     }
     }
 
 
-    override fun onAttach(view: View) {
-        Log.d(
-            TAG,
-            "onAttach: Controller: " + System.identityHashCode(this) +
-                " Activity: " + System.identityHashCode(activity)
-        )
-        super.onAttach(view)
-
-        showShareToScreen = hasActivityActionSendIntent()
-
-        ClosedInterfaceImpl().setUpPushTokenRegistration()
-        if (!eventBus.isRegistered(this)) {
-            eventBus.register(this)
-        }
-        currentUser = userManager.currentUser.blockingGet()
-        if (currentUser != null) {
-            if (isServerEOL(currentUser!!)) {
-                showServerEOLDialog()
-                return
-            }
-            if (isUnifiedSearchAvailable(currentUser!!)) {
-                searchHelper = MessageSearchHelper(unifiedSearchRepository)
+    private fun initSearchView() {
+        val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager?
+        if (searchItem != null) {
+            searchView = MenuItemCompat.getActionView(searchItem) as SearchView
+            viewThemeUtils.talk.themeSearchView(searchView!!)
+            searchView!!.maxWidth = Int.MAX_VALUE
+            searchView!!.inputType = InputType.TYPE_TEXT_VARIATION_FILTER
+            var imeOptions = EditorInfo.IME_ACTION_DONE or EditorInfo.IME_FLAG_NO_FULLSCREEN
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && appPreferences.isKeyboardIncognito) {
+                imeOptions = imeOptions or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING
             }
             }
-            credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token)
-            if (activity != null && activity is MainActivity) {
-                loadUserAvatar((activity as MainActivity?)!!.binding.switchAccountButton)
-                viewThemeUtils.material
-                    .colorMaterialTextButton((activity as MainActivity?)!!.binding.switchAccountButton)
+            searchView!!.imeOptions = imeOptions
+            searchView!!.queryHint = getString(R.string.appbar_search_in, getString(R.string.nc_app_product_name))
+            if (searchManager != null) {
+                searchView!!.setSearchableInfo(searchManager.getSearchableInfo(componentName))
             }
             }
-            fetchRooms()
-        } else {
-            Log.e(TAG, "userManager.currentUser.blockingGet() returned null")
-            Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show()
-        }
-    }
-
-    override fun onDetach(view: View) {
-        Log.d(
-            TAG,
-            "onDetach: Controller: " + System.identityHashCode(this) +
-                " Activity: " + System.identityHashCode(activity)
-        )
-        super.onDetach(view)
-        eventBus.unregister(this)
-    }
-
-    private fun initSearchView() {
-        if (activity != null) {
-            val searchManager = activity!!.getSystemService(Context.SEARCH_SERVICE) as SearchManager?
-            if (searchItem != null) {
-                searchView = MenuItemCompat.getActionView(searchItem) as SearchView
-                viewThemeUtils.talk.themeSearchView(searchView!!)
-                searchView!!.maxWidth = Int.MAX_VALUE
-                searchView!!.inputType = InputType.TYPE_TEXT_VARIATION_FILTER
-                var imeOptions = EditorInfo.IME_ACTION_DONE or EditorInfo.IME_FLAG_NO_FULLSCREEN
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && appPreferences.isKeyboardIncognito) {
-                    imeOptions = imeOptions or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING
-                }
-                searchView!!.imeOptions = imeOptions
-                searchView!!.queryHint = searchHint
-                if (searchManager != null) {
-                    searchView!!.setSearchableInfo(searchManager.getSearchableInfo(activity!!.componentName))
-                }
-                searchViewDisposable = observeSearchView(searchView!!)
-                    .debounce { query: String? ->
-                        if (TextUtils.isEmpty(query)) {
-                            return@debounce Observable.empty<Long>()
-                        } else {
-                            return@debounce Observable.timer(
-                                SEARCH_DEBOUNCE_INTERVAL_MS.toLong(),
-                                TimeUnit.MILLISECONDS
-                            )
-                        }
+            searchViewDisposable = observeSearchView(searchView!!)
+                .debounce { query: String? ->
+                    if (TextUtils.isEmpty(query)) {
+                        return@debounce Observable.empty<Long>()
+                    } else {
+                        return@debounce Observable.timer(
+                            SEARCH_DEBOUNCE_INTERVAL_MS.toLong(),
+                            TimeUnit.MILLISECONDS
+                        )
                     }
                     }
-                    .distinctUntilChanged()
-                    .subscribeOn(Schedulers.io())
-                    .observeOn(AndroidSchedulers.mainThread())
-                    .subscribe { newText: String? -> onQueryTextChange(newText) }
-            }
+                }
+                .distinctUntilChanged()
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe { newText: String? -> onQueryTextChange(newText) }
         }
         }
     }
     }
 
 
-    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
-        super.onCreateOptionsMenu(menu, inflater)
+    override fun onCreateOptionsMenu(menu: Menu): Boolean {
+        super.onCreateOptionsMenu(menu)
 
 
-        inflater.inflate(R.menu.menu_conversation_plus_filter, menu)
+        menuInflater.inflate(R.menu.menu_conversation_plus_filter, menu)
         searchItem = menu.findItem(R.id.action_search)
         searchItem = menu.findItem(R.id.action_search)
         chooseAccountItem = menu.findItem(R.id.action_choose_account)
         chooseAccountItem = menu.findItem(R.id.action_choose_account)
         loadUserAvatar(chooseAccountItem!!)
         loadUserAvatar(chooseAccountItem!!)
@@ -362,17 +354,19 @@ class ConversationsListController(bundle: Bundle) :
             if (resources != null && resources!!.getBoolean(R.bool.multiaccount_support)) {
             if (resources != null && resources!!.getBoolean(R.bool.multiaccount_support)) {
                 val newFragment: DialogFragment = ChooseAccountShareToDialogFragment.newInstance()
                 val newFragment: DialogFragment = ChooseAccountShareToDialogFragment.newInstance()
                 newFragment.show(
                 newFragment.show(
-                    (activity as MainActivity?)!!.supportFragmentManager,
+                    supportFragmentManager,
                     ChooseAccountShareToDialogFragment.TAG
                     ChooseAccountShareToDialogFragment.TAG
                 )
                 )
             }
             }
             true
             true
         }
         }
         initSearchView()
         initSearchView()
+        return true
     }
     }
 
 
-    override fun onPrepareOptionsMenu(menu: Menu) {
+    override fun onPrepareOptionsMenu(menu: Menu): Boolean {
         super.onPrepareOptionsMenu(menu)
         super.onPrepareOptionsMenu(menu)
+
         searchView = MenuItemCompat.getActionView(searchItem) as SearchView
         searchView = MenuItemCompat.getActionView(searchItem) as SearchView
 
 
         val moreAccountsAvailable = userManager.users.blockingGet().size > 1
         val moreAccountsAvailable = userManager.users.blockingGet().size > 1
@@ -385,24 +379,19 @@ class ConversationsListController(bundle: Bundle) :
             hideSearchBar()
             hideSearchBar()
             actionBar?.setTitle(R.string.nc_forward_to_three_dots)
             actionBar?.setTitle(R.string.nc_forward_to_three_dots)
         } else {
         } else {
-            val activity = activity as MainActivity?
             searchItem!!.isVisible = conversationItems.size > 0
             searchItem!!.isVisible = conversationItems.size > 0
-            if (activity != null) {
-                if (adapter!!.hasFilter()) {
-                    showSearchView(activity, searchView, searchItem)
-                    searchView!!.setQuery(adapter!!.getFilter(String::class.java), false)
-                }
-                activity.binding.searchText.setOnClickListener {
-                    showSearchView(activity, searchView, searchItem)
-                    viewThemeUtils.platform.themeStatusBar(activity, searchView!!)
-                }
+            if (adapter!!.hasFilter()) {
+                showSearchView(searchView, searchItem)
+                searchView!!.setQuery(adapter!!.getFilter(String::class.java), false)
+            }
+            binding.searchText.setOnClickListener {
+                showSearchView(searchView, searchItem)
+                viewThemeUtils.platform.themeStatusBar(this, searchView!!)
             }
             }
             searchView!!.setOnCloseListener {
             searchView!!.setOnCloseListener {
                 if (TextUtils.isEmpty(searchView!!.query.toString())) {
                 if (TextUtils.isEmpty(searchView!!.query.toString())) {
                     searchView!!.onActionViewCollapsed()
                     searchView!!.onActionViewCollapsed()
-                    if (activity != null) {
-                        viewThemeUtils.platform.resetStatusBar(activity)
-                    }
+                    viewThemeUtils.platform.resetStatusBar(this)
                 } else {
                 } else {
                     searchView!!.post { searchView!!.setQuery(TAG, true) }
                     searchView!!.post { searchView!!.setQuery(TAG, true) }
                 }
                 }
@@ -428,48 +417,88 @@ class ConversationsListController(bundle: Bundle) :
                     }
                     }
                     binding?.swipeRefreshLayoutView?.isEnabled = true
                     binding?.swipeRefreshLayoutView?.isEnabled = true
                     searchView!!.onActionViewCollapsed()
                     searchView!!.onActionViewCollapsed()
-                    val mainActivity = getActivity() as MainActivity?
-                    if (mainActivity != null) {
-                        mainActivity.binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
-                            mainActivity.binding.appBar.context,
-                            R.animator.appbar_elevation_off
-                        )
-                        mainActivity.binding.toolbar.visibility = View.GONE
-                        mainActivity.binding.searchToolbar.visibility = View.VISIBLE
-                        if (resources != null) {
-                            viewThemeUtils.platform
-                                .resetStatusBar(mainActivity)
-                        }
+
+                    binding.conversationListAppbar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
+                        binding.conversationListAppbar.context,
+                        R.animator.appbar_elevation_off
+                    )
+                    binding.conversationListToolbar.visibility = View.GONE
+                    binding.searchToolbar.visibility = View.VISIBLE
+                    if (resources != null) {
+                        viewThemeUtils.platform.resetStatusBar(this@ConversationsListActivity)
                     }
                     }
+
                     val layoutManager = binding?.recyclerView?.layoutManager as SmoothScrollLinearLayoutManager?
                     val layoutManager = binding?.recyclerView?.layoutManager as SmoothScrollLinearLayoutManager?
                     layoutManager?.scrollToPositionWithOffset(0, 0)
                     layoutManager?.scrollToPositionWithOffset(0, 0)
                     return true
                     return true
                 }
                 }
             })
             })
         }
         }
+        return true
     }
     }
 
 
-    private fun hasActivityActionSendIntent(): Boolean {
-        return if (activity != null) {
-            Intent.ACTION_SEND == activity!!.intent.action || Intent.ACTION_SEND_MULTIPLE == activity!!.intent.action
-        } else {
-            false
+    private fun showSearchOrToolbar() {
+        if (TextUtils.isEmpty(searchQuery)) {
+            if (appBarLayoutType == AppBarLayoutType.SEARCH_BAR) {
+                showSearchBar()
+            } else {
+                showToolbar()
+            }
+            colorizeStatusBar()
+            colorizeNavigationBar()
         }
         }
     }
     }
 
 
-    override fun showSearchOrToolbar() {
-        if (TextUtils.isEmpty(searchQuery)) {
-            super.showSearchOrToolbar()
-        }
+    private fun showSearchBar() {
+        val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
+        binding.searchToolbar.visibility = View.VISIBLE
+        binding.searchText.hint = getString(R.string.appbar_search_in, getString(R.string.nc_app_product_name))
+        binding.conversationListToolbar.visibility = View.GONE
+        // layoutParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout
+        // .LayoutParams.SCROLL_FLAG_SNAP | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
+        layoutParams.scrollFlags = 0
+        binding.conversationListAppbar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
+            binding.conversationListAppbar.context,
+            R.animator.appbar_elevation_off
+        )
+        binding.searchToolbar.layoutParams = layoutParams
+    }
+
+    private fun showToolbar() {
+        val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
+        binding.searchToolbar.visibility = View.GONE
+        binding.conversationListToolbar.visibility = View.VISIBLE
+        viewThemeUtils.material.colorToolbarOverflowIcon(binding.conversationListToolbar)
+        layoutParams.scrollFlags = 0
+        binding.conversationListAppbar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
+            binding.conversationListAppbar.context,
+            R.animator.appbar_elevation_on
+        )
+        binding.conversationListToolbar.layoutParams = layoutParams
+    }
+
+    private fun hideSearchBar() {
+        val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
+        binding.searchToolbar.visibility = View.GONE
+        binding.conversationListToolbar.visibility = View.VISIBLE
+        layoutParams.scrollFlags = 0
+        binding.conversationListAppbar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
+            binding.conversationListAppbar.context,
+            R.animator.appbar_elevation_on
+        )
+    }
+
+    private fun hasActivityActionSendIntent(): Boolean {
+        return Intent.ACTION_SEND == intent.action || Intent.ACTION_SEND_MULTIPLE == intent.action
     }
     }
 
 
-    private fun showSearchView(activity: MainActivity, searchView: SearchView?, searchItem: MenuItem?) {
-        activity.binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
-            activity.binding.appBar.context,
+    private fun showSearchView(searchView: SearchView?, searchItem: MenuItem?) {
+        binding.conversationListAppbar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
+            binding.conversationListAppbar.context,
             R.animator.appbar_elevation_on
             R.animator.appbar_elevation_on
         )
         )
-        activity.binding.toolbar.visibility = View.VISIBLE
-        activity.binding.searchToolbar.visibility = View.GONE
+        binding.conversationListToolbar.visibility = View.VISIBLE
+        binding.searchToolbar.visibility = View.GONE
         searchItem!!.expandActionView()
         searchItem!!.expandActionView()
     }
     }
 
 
@@ -499,10 +528,11 @@ class ConversationsListController(bundle: Bundle) :
                 // This is invoked asynchronously, when server returns a response the view might have been
                 // This is invoked asynchronously, when server returns a response the view might have been
                 // unbound in the meantime. Check if the view is still there.
                 // unbound in the meantime. Check if the view is still there.
                 // FIXME - does it make sense to update internal data structures even when view has been unbound?
                 // FIXME - does it make sense to update internal data structures even when view has been unbound?
-                if (view == null) {
-                    Log.d(TAG, "fetchData - getRooms - view is not bound: $startNanoTime")
-                    return@subscribe
-                }
+                // if (view == null) {
+                //     Log.d(TAG, "fetchData - getRooms - view is not bound: $startNanoTime")
+                //     return@subscribe
+                // }
+
                 if (adapterWasNull) {
                 if (adapterWasNull) {
                     adapterWasNull = false
                     adapterWasNull = false
                     binding?.loadingContent?.visibility = View.GONE
                     binding?.loadingContent?.visibility = View.GONE
@@ -548,8 +578,8 @@ class ConversationsListController(bundle: Bundle) :
     }
     }
 
 
     private fun addToConversationItems(conversation: Conversation) {
     private fun addToConversationItems(conversation: Conversation) {
-        if (bundle.containsKey(KEY_FORWARD_HIDE_SOURCE_ROOM) && conversation.roomId ==
-            bundle.getString(KEY_FORWARD_HIDE_SOURCE_ROOM)
+        if (intent.getStringExtra(KEY_FORWARD_HIDE_SOURCE_ROOM) != null &&
+            intent.getStringExtra(KEY_FORWARD_HIDE_SOURCE_ROOM) == conversation.roomId
         ) {
         ) {
             return
             return
         }
         }
@@ -566,23 +596,22 @@ class ConversationsListController(bundle: Bundle) :
             genericTextHeaderItem = GenericTextHeaderItem(headerTitle, viewThemeUtils)
             genericTextHeaderItem = GenericTextHeaderItem(headerTitle, viewThemeUtils)
             callHeaderItems[headerTitle] = genericTextHeaderItem
             callHeaderItems[headerTitle] = genericTextHeaderItem
         }
         }
-        if (activity != null) {
-            val conversationItem = ConversationItem(
-                conversation,
-                currentUser!!,
-                activity!!,
-                viewThemeUtils
-            )
-            conversationItems.add(conversationItem)
-            val conversationItemWithHeader = ConversationItem(
-                conversation,
-                currentUser!!,
-                activity!!,
-                callHeaderItems[headerTitle],
-                viewThemeUtils
-            )
-            conversationItemsWithHeader.add(conversationItemWithHeader)
-        }
+
+        val conversationItem = ConversationItem(
+            conversation,
+            currentUser!!,
+            this,
+            viewThemeUtils
+        )
+        conversationItems.add(conversationItem)
+        val conversationItemWithHeader = ConversationItem(
+            conversation,
+            currentUser!!,
+            this,
+            callHeaderItems[headerTitle],
+            viewThemeUtils
+        )
+        conversationItemsWithHeader.add(conversationItemWithHeader)
     }
     }
 
 
     private fun showErrorDialog() {
     private fun showErrorDialog() {
@@ -639,7 +668,7 @@ class ConversationsListController(bundle: Bundle) :
                         val conversationItem = ConversationItem(
                         val conversationItem = ConversationItem(
                             conversation,
                             conversation,
                             currentUser!!,
                             currentUser!!,
-                            activity!!,
+                            this,
                             callHeaderItems[headerTitle],
                             callHeaderItems[headerTitle],
                             viewThemeUtils
                             viewThemeUtils
                         )
                         )
@@ -659,30 +688,18 @@ class ConversationsListController(bundle: Bundle) :
     private fun handleHttpExceptions(throwable: Throwable) {
     private fun handleHttpExceptions(throwable: Throwable) {
         if (throwable is HttpException) {
         if (throwable is HttpException) {
             when (throwable.code()) {
             when (throwable.code()) {
-                HTTP_UNAUTHORIZED -> if (parentController != null && parentController!!.router != null) {
-                    Log.d(TAG, "Starting reauth webview via getParentController()")
-                    parentController!!.router.pushController(
-                        RouterTransaction.with(
-                            WebViewLoginController(
-                                currentUser!!.baseUrl,
-                                true
-                            )
-                        )
-                            .pushChangeHandler(VerticalChangeHandler())
-                            .popChangeHandler(VerticalChangeHandler())
-                    )
-                } else {
-                    Log.d(TAG, "Starting reauth webview via ConversationsListController")
-                    showUnauthorizedDialog()
+                HTTP_UNAUTHORIZED -> showUnauthorizedDialog()
+                else -> {
+                    Log.e(TAG, "Http exception in ConversationListActivity", throwable)
+                    Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show()
                 }
                 }
-                else -> {}
             }
             }
         }
         }
     }
     }
 
 
     @SuppressLint("ClickableViewAccessibility")
     @SuppressLint("ClickableViewAccessibility")
     private fun prepareViews() {
     private fun prepareViews() {
-        layoutManager = SmoothScrollLinearLayoutManager(Objects.requireNonNull(activity))
+        layoutManager = SmoothScrollLinearLayoutManager(this)
         binding?.recyclerView?.layoutManager = layoutManager
         binding?.recyclerView?.layoutManager = layoutManager
         binding?.recyclerView?.setHasFixedSize(true)
         binding?.recyclerView?.setHasFixedSize(true)
         binding?.recyclerView?.adapter = adapter
         binding?.recyclerView?.adapter = adapter
@@ -695,8 +712,8 @@ class ConversationsListController(bundle: Bundle) :
             }
             }
         })
         })
         binding?.recyclerView?.setOnTouchListener { v: View, _: MotionEvent? ->
         binding?.recyclerView?.setOnTouchListener { v: View, _: MotionEvent? ->
-            if (isAttached && (!isBeingDestroyed || !isDestroyed)) {
-                val imm = activity!!.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+            if (!isDestroyed) {
+                val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                 imm.hideSoftInputFromWindow(v.windowToken, 0)
                 imm.hideSoftInputFromWindow(v.windowToken, 0)
             }
             }
             false
             false
@@ -709,21 +726,17 @@ class ConversationsListController(bundle: Bundle) :
             showNewConversationsScreen()
             showNewConversationsScreen()
         }
         }
         binding?.floatingActionButton?.let { viewThemeUtils.material.themeFAB(it) }
         binding?.floatingActionButton?.let { viewThemeUtils.material.themeFAB(it) }
-        if (activity != null && activity is MainActivity) {
-            val activity = activity as MainActivity?
-            activity!!.binding.switchAccountButton.setOnClickListener {
-                if (resources != null && resources!!.getBoolean(R.bool.multiaccount_support)) {
-                    val newFragment: DialogFragment = ChooseAccountDialogFragment.newInstance()
-                    newFragment.show(
-                        (getActivity() as MainActivity?)!!.supportFragmentManager,
-                        ChooseAccountDialogFragment.TAG
-                    )
-                } else {
-                    val intent = Intent(context, SettingsActivity::class.java)
-                    startActivity(intent)
-                }
+
+        binding.switchAccountButton.setOnClickListener {
+            if (resources != null && resources!!.getBoolean(R.bool.multiaccount_support)) {
+                val newFragment: DialogFragment = ChooseAccountDialogFragment.newInstance()
+                newFragment.show(supportFragmentManager, ChooseAccountDialogFragment.TAG)
+            } else {
+                val intent = Intent(context, SettingsActivity::class.java)
+                startActivity(intent)
             }
             }
         }
         }
+
         binding?.newMentionPopupBubble?.hide()
         binding?.newMentionPopupBubble?.hide()
         binding?.newMentionPopupBubble?.setPopupBubbleListener {
         binding?.newMentionPopupBubble?.setPopupBubbleListener {
             binding?.recyclerView?.smoothScrollToPosition(
             binding?.recyclerView?.smoothScrollToPosition(
@@ -786,17 +799,19 @@ class ConversationsListController(bundle: Bundle) :
         }
         }
     }
     }
 
 
-    public override fun onSaveViewState(view: View, outState: Bundle) {
+    override fun onSaveInstanceState(bundle: Bundle) {
+        super.onSaveInstanceState(bundle)
+
         if (searchView != null && !TextUtils.isEmpty(searchView!!.query)) {
         if (searchView != null && !TextUtils.isEmpty(searchView!!.query)) {
-            outState.putString(KEY_SEARCH_QUERY, searchView!!.query.toString())
+            bundle.putString(KEY_SEARCH_QUERY, searchView!!.query.toString())
         }
         }
-        super.onSaveViewState(view, outState)
     }
     }
 
 
-    public override fun onRestoreViewState(view: View, savedViewState: Bundle) {
-        super.onRestoreViewState(view, savedViewState)
-        if (savedViewState.containsKey(KEY_SEARCH_QUERY)) {
-            searchQuery = savedViewState.getString(KEY_SEARCH_QUERY, "")
+    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
+        super.onRestoreInstanceState(savedInstanceState)
+
+        if (savedInstanceState.containsKey(KEY_SEARCH_QUERY)) {
+            searchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY, "")
         }
         }
     }
     }
 
 
@@ -906,7 +921,7 @@ class ConversationsListController(bundle: Bundle) :
     @Suppress("Detekt.ComplexMethod")
     @Suppress("Detekt.ComplexMethod")
     private fun handleConversation(conversation: Conversation?) {
     private fun handleConversation(conversation: Conversation?) {
         selectedConversation = conversation
         selectedConversation = conversation
-        if (selectedConversation != null && activity != null) {
+        if (selectedConversation != null) {
             val hasChatPermission = ParticipantPermissions(currentUser!!, selectedConversation!!).hasChatPermission()
             val hasChatPermission = ParticipantPermissions(currentUser!!, selectedConversation!!).hasChatPermission()
             if (showShareToScreen) {
             if (showShareToScreen) {
                 if (hasChatPermission &&
                 if (hasChatPermission &&
@@ -919,7 +934,7 @@ class ConversationsListController(bundle: Bundle) :
                 }
                 }
             } else if (forwardMessage) {
             } else if (forwardMessage) {
                 if (hasChatPermission && !isReadOnlyConversation(selectedConversation!!)) {
                 if (hasChatPermission && !isReadOnlyConversation(selectedConversation!!)) {
-                    openConversation(bundle.getString(KEY_FORWARD_MSG_TEXT))
+                    openConversation(intent.getStringExtra(KEY_FORWARD_MSG_TEXT))
                     forwardMessage = false
                     forwardMessage = false
                 } else {
                 } else {
                     Toast.makeText(context, R.string.send_to_forbidden, Toast.LENGTH_LONG).show()
                     Toast.makeText(context, R.string.send_to_forbidden, Toast.LENGTH_LONG).show()
@@ -1001,7 +1016,7 @@ class ConversationsListController(bundle: Bundle) :
     }
     }
 
 
     private fun clearIntentAction() {
     private fun clearIntentAction() {
-        activity!!.intent.action = ""
+        intent.action = ""
     }
     }
 
 
     override fun onItemLongClick(position: Int) {
     override fun onItemLongClick(position: Int) {
@@ -1012,7 +1027,7 @@ class ConversationsListController(bundle: Bundle) :
             if (clickedItem != null) {
             if (clickedItem != null) {
                 val conversation = (clickedItem as ConversationItem).model
                 val conversation = (clickedItem as ConversationItem).model
                 conversationsListBottomDialog = ConversationsListBottomDialog(
                 conversationsListBottomDialog = ConversationsListBottomDialog(
-                    activity!!,
+                    this,
                     this,
                     this,
                     userManager.currentUser.blockingGet(),
                     userManager.currentUser.blockingGet(),
                     conversation
                     conversation
@@ -1025,8 +1040,7 @@ class ConversationsListController(bundle: Bundle) :
     @Suppress("Detekt.TooGenericExceptionCaught")
     @Suppress("Detekt.TooGenericExceptionCaught")
     private fun collectDataFromIntent() {
     private fun collectDataFromIntent() {
         filesToShare = ArrayList()
         filesToShare = ArrayList()
-        if (activity != null && activity!!.intent != null) {
-            val intent = activity!!.intent
+        if (intent != null) {
             if (Intent.ACTION_SEND == intent.action || Intent.ACTION_SEND_MULTIPLE == intent.action) {
             if (Intent.ACTION_SEND == intent.action || Intent.ACTION_SEND_MULTIPLE == intent.action) {
                 try {
                 try {
                     val mimeType = intent.type
                     val mimeType = intent.type
@@ -1099,6 +1113,7 @@ class ConversationsListController(bundle: Bundle) :
     }
     }
 
 
     override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
     override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
         if (requestCode == UploadAndShareFilesWorker.REQUEST_PERMISSION &&
         if (requestCode == UploadAndShareFilesWorker.REQUEST_PERMISSION &&
             grantResults.isNotEmpty() &&
             grantResults.isNotEmpty() &&
             grantResults[0] == PackageManager.PERMISSION_GRANTED
             grantResults[0] == PackageManager.PERMISSION_GRANTED
@@ -1132,13 +1147,6 @@ class ConversationsListController(bundle: Bundle) :
             bundle.putString(BundleKeys.KEY_MESSAGE_ID, selectedMessageId)
             bundle.putString(BundleKeys.KEY_MESSAGE_ID, selectedMessageId)
             selectedMessageId = null
             selectedMessageId = null
         }
         }
-        // remapChatController(
-        //     router,
-        //     currentUser!!.id!!,
-        //     selectedConversation!!.token!!,
-        //     bundle,
-        //     false
-        // )
 
 
         val intent = Intent(context, ChatActivity::class.java)
         val intent = Intent(context, ChatActivity::class.java)
         intent.putExtras(bundle)
         intent.putExtras(bundle)
@@ -1171,8 +1179,7 @@ class ConversationsListController(bundle: Bundle) :
 
 
     override fun showDeleteConversationDialog(bundle: Bundle) {
     override fun showDeleteConversationDialog(bundle: Bundle) {
         conversationMenuBundle = bundle
         conversationMenuBundle = bundle
-        if (activity != null &&
-            conversationMenuBundle != null &&
+        if (conversationMenuBundle != null &&
             isInternalUserEqualsCurrentUser(currentUser, conversationMenuBundle)
             isInternalUserEqualsCurrentUser(currentUser, conversationMenuBundle)
         ) {
         ) {
             val conversation = Parcels.unwrap<Conversation>(conversationMenuBundle!!.getParcelable(KEY_ROOM))
             val conversation = Parcels.unwrap<Conversation>(conversationMenuBundle!!.getParcelable(KEY_ROOM))
@@ -1216,53 +1223,48 @@ class ConversationsListController(bundle: Bundle) :
     }
     }
 
 
     private fun showUnauthorizedDialog() {
     private fun showUnauthorizedDialog() {
-        if (activity != null) {
-            binding?.floatingActionButton?.let {
-                val dialogBuilder = MaterialAlertDialogBuilder(it.context)
-                    .setIcon(
-                        viewThemeUtils.dialog.colorMaterialAlertDialogIcon(
-                            context,
-                            R.drawable.ic_delete_black_24dp
-                        )
+        binding?.floatingActionButton?.let {
+            val dialogBuilder = MaterialAlertDialogBuilder(it.context)
+                .setIcon(
+                    viewThemeUtils.dialog.colorMaterialAlertDialogIcon(
+                        context,
+                        R.drawable.ic_delete_black_24dp
                     )
                     )
-                    .setTitle(R.string.nc_dialog_invalid_password)
-                    .setMessage(R.string.nc_dialog_reauth_or_delete)
-                    .setCancelable(false)
-                    .setPositiveButton(R.string.nc_delete) { _, _ ->
-                        val otherUserExists = userManager
-                            .scheduleUserForDeletionWithId(currentUser!!.id!!)
-                            .blockingGet()
-                        val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build()
-                        WorkManager.getInstance().enqueue(accountRemovalWork)
-                        if (otherUserExists && view != null) {
-                            onViewBound(view!!)
-                            onAttach(view!!)
-                        } else if (!otherUserExists) {
-                            router.setRoot(
-                                RouterTransaction.with(ServerSelectionController())
-                                    .pushChangeHandler(VerticalChangeHandler())
-                                    .popChangeHandler(VerticalChangeHandler())
-                            )
-                        }
-                    }
-                    .setNegativeButton(R.string.nc_settings_reauthorize) { _, _ ->
-                        router.pushController(
-                            RouterTransaction.with(
-                                WebViewLoginController(currentUser!!.baseUrl, true)
-                            )
-                                .pushChangeHandler(VerticalChangeHandler())
-                                .popChangeHandler(VerticalChangeHandler())
-                        )
+                )
+                .setTitle(R.string.nc_dialog_invalid_password)
+                .setMessage(R.string.nc_dialog_reauth_or_delete)
+                .setCancelable(false)
+                .setPositiveButton(R.string.nc_delete) { _, _ ->
+                    val otherUserExists = userManager
+                        .scheduleUserForDeletionWithId(currentUser!!.id!!)
+                        .blockingGet()
+                    val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build()
+                    WorkManager.getInstance().enqueue(accountRemovalWork)
+                    if (otherUserExists) {
+                        finish()
+                        startActivity(intent)
+                    } else if (!otherUserExists) {
+                        Log.d(TAG, "No other users found. AccountRemovalWorker will restart the app.")
                     }
                     }
+                }
 
 
-                viewThemeUtils.dialog
-                    .colorMaterialAlertDialogBackground(it.context, dialogBuilder)
-                val dialog = dialogBuilder.show()
-                viewThemeUtils.platform.colorTextButtons(
-                    dialog.getButton(AlertDialog.BUTTON_POSITIVE),
-                    dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
-                )
-            }
+            // TODO: show negative button again when conductor is removed
+            // .setNegativeButton(R.string.nc_settings_reauthorize) { _, _ ->
+            //     // router.pushController(
+            //     //     RouterTransaction.with(
+            //     //         WebViewLoginController(currentUser!!.baseUrl, true)
+            //     //     )
+            //     //         .pushChangeHandler(VerticalChangeHandler())
+            //     //         .popChangeHandler(VerticalChangeHandler())
+            //     // )
+            // }
+
+            viewThemeUtils.dialog.colorMaterialAlertDialogBackground(it.context, dialogBuilder)
+            val dialog = dialogBuilder.show()
+            viewThemeUtils.platform.colorTextButtons(
+                dialog.getButton(AlertDialog.BUTTON_POSITIVE),
+                dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
+            )
         }
         }
     }
     }
 
 
@@ -1279,25 +1281,22 @@ class ConversationsListController(bundle: Bundle) :
                         .blockingGet()
                         .blockingGet()
                     val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build()
                     val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build()
                     WorkManager.getInstance().enqueue(accountRemovalWork)
                     WorkManager.getInstance().enqueue(accountRemovalWork)
-                    if (otherUserExists && view != null) {
-                        onViewBound(view!!)
-                        onAttach(view!!)
+                    if (otherUserExists) {
+                        finish()
+                        startActivity(intent)
                     } else if (!otherUserExists) {
                     } else if (!otherUserExists) {
-                        router.setRoot(
-                            RouterTransaction.with(
-                                ServerSelectionController()
-                            )
-                                .pushChangeHandler(VerticalChangeHandler())
-                                .popChangeHandler(VerticalChangeHandler())
-                        )
+                        restartApp(this)
                     }
                     }
                 }
                 }
                 .setNegativeButton(R.string.nc_cancel) { _, _ ->
                 .setNegativeButton(R.string.nc_cancel) { _, _ ->
                     if (userManager.users.blockingGet().isNotEmpty()) {
                     if (userManager.users.blockingGet().isNotEmpty()) {
-                        router.pushController(RouterTransaction.with(SwitchAccountController()))
+                        // TODO show SwitchAccount screen again when conductor is removed instead to close app
+                        // router.pushController(RouterTransaction.with(SwitchAccountController()))
+                        finishAffinity()
+                        finish()
                     } else {
                     } else {
-                        activity!!.finishAffinity()
-                        activity!!.finish()
+                        finishAffinity()
+                        finish()
                     }
                     }
                 }
                 }
 
 
@@ -1310,6 +1309,15 @@ class ConversationsListController(bundle: Bundle) :
         }
         }
     }
     }
 
 
+    fun restartApp(context: Context) {
+        val packageManager = context.packageManager
+        val intent = packageManager.getLaunchIntentForPackage(context.packageName)
+        val componentName = intent!!.component
+        val mainIntent = Intent.makeRestartActivityTask(componentName)
+        context.startActivity(mainIntent)
+        Runtime.getRuntime().exit(0)
+    }
+
     private fun deleteConversation(data: Data) {
     private fun deleteConversation(data: Data) {
         val deleteConversationWorker =
         val deleteConversationWorker =
             OneTimeWorkRequest.Builder(DeleteConversationWorker::class.java).setInputData(data).build()
             OneTimeWorkRequest.Builder(DeleteConversationWorker::class.java).setInputData(data).build()
@@ -1351,6 +1359,13 @@ class ConversationsListController(bundle: Bundle) :
         showErrorDialog()
         showErrorDialog()
     }
     }
 
 
+    override fun onBackPressed() {
+        super.onBackPressed()
+
+        // TODO: replace this when conductor is removed. For now it avoids to load the MainActiviy which has no UI.
+        finishAffinity()
+    }
+
     companion object {
     companion object {
         const val TAG = "ConvListController"
         const val TAG = "ConvListController"
         const val UNREAD_BUBBLE_DELAY = 2500
         const val UNREAD_BUBBLE_DELAY = 2500
@@ -1360,10 +1375,4 @@ class ConversationsListController(bundle: Bundle) :
         const val SEARCH_MIN_CHARS = 2
         const val SEARCH_MIN_CHARS = 2
         const val HTTP_UNAUTHORIZED = 401
         const val HTTP_UNAUTHORIZED = 401
     }
     }
-
-    init {
-        setHasOptionsMenu(true)
-        forwardMessage = bundle.getBoolean(KEY_FORWARD_MSG_FLAG)
-        this.bundle = bundle
-    }
 }
 }

+ 2 - 18
app/src/main/java/com/nextcloud/talk/location/GeocodingActivity.kt

@@ -34,7 +34,6 @@ import android.view.inputmethod.EditorInfo
 import android.widget.AdapterView
 import android.widget.AdapterView
 import android.widget.Toast
 import android.widget.Toast
 import androidx.appcompat.widget.SearchView
 import androidx.appcompat.widget.SearchView
-import androidx.core.content.res.ResourcesCompat
 import androidx.core.view.MenuItemCompat
 import androidx.core.view.MenuItemCompat
 import androidx.preference.PreferenceManager
 import androidx.preference.PreferenceManager
 import autodagger.AutoInjector
 import autodagger.AutoInjector
@@ -44,7 +43,6 @@ import com.nextcloud.talk.adapters.GeocodingAdapter
 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.databinding.ActivityGeocodingBinding
 import com.nextcloud.talk.databinding.ActivityGeocodingBinding
-import com.nextcloud.talk.utils.DisplayUtils
 import com.nextcloud.talk.utils.bundle.BundleKeys
 import com.nextcloud.talk.utils.bundle.BundleKeys
 import fr.dudie.nominatim.client.TalkJsonNominatimClient
 import fr.dudie.nominatim.client.TalkJsonNominatimClient
 import fr.dudie.nominatim.model.Address
 import fr.dudie.nominatim.model.Address
@@ -86,8 +84,8 @@ class GeocodingActivity :
 
 
         binding = ActivityGeocodingBinding.inflate(layoutInflater)
         binding = ActivityGeocodingBinding.inflate(layoutInflater)
         setupActionBar()
         setupActionBar()
-        setupSystemColors()
         setContentView(binding.root)
         setContentView(binding.root)
+        setupSystemColors()
 
 
         Configuration.getInstance().load(context, PreferenceManager.getDefaultSharedPreferences(context))
         Configuration.getInstance().load(context, PreferenceManager.getDefaultSharedPreferences(context))
 
 
@@ -131,21 +129,7 @@ class GeocodingActivity :
         supportActionBar?.setDisplayShowHomeEnabled(true)
         supportActionBar?.setDisplayShowHomeEnabled(true)
         supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(R.color.transparent)))
         supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(R.color.transparent)))
         supportActionBar?.title = ""
         supportActionBar?.title = ""
-    }
-
-    private fun setupSystemColors() {
-        DisplayUtils.applyColorToStatusBar(
-            this,
-            ResourcesCompat.getColor(
-                resources,
-                R.color.appbar,
-                null
-            )
-        )
-        DisplayUtils.applyColorToNavigationBar(
-            this.window,
-            ResourcesCompat.getColor(resources, R.color.bg_default, null)
-        )
+        viewThemeUtils.material.themeToolbar(binding.geocodingToolbar)
     }
     }
 
 
     private fun initAdapter(addresses: List<Address>) {
     private fun initAdapter(addresses: List<Address>) {

+ 2 - 16
app/src/main/java/com/nextcloud/talk/location/LocationPickerActivity.kt

@@ -131,8 +131,8 @@ class LocationPickerActivity :
 
 
         binding = ActivityLocationBinding.inflate(layoutInflater)
         binding = ActivityLocationBinding.inflate(layoutInflater)
         setupActionBar()
         setupActionBar()
-        setupSystemColors()
         setContentView(binding.root)
         setContentView(binding.root)
+        setupSystemColors()
 
 
         getInstance().load(context, PreferenceManager.getDefaultSharedPreferences(context))
         getInstance().load(context, PreferenceManager.getDefaultSharedPreferences(context))
     }
     }
@@ -181,21 +181,7 @@ class LocationPickerActivity :
         supportActionBar?.setDisplayShowHomeEnabled(true)
         supportActionBar?.setDisplayShowHomeEnabled(true)
         supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(android.R.color.transparent)))
         supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(android.R.color.transparent)))
         supportActionBar?.title = context.getString(R.string.nc_share_location)
         supportActionBar?.title = context.getString(R.string.nc_share_location)
-    }
-
-    private fun setupSystemColors() {
-        DisplayUtils.applyColorToStatusBar(
-            this,
-            ResourcesCompat.getColor(
-                resources,
-                R.color.appbar,
-                null
-            )
-        )
-        DisplayUtils.applyColorToNavigationBar(
-            this.window,
-            ResourcesCompat.getColor(resources, R.color.bg_default, null)
-        )
+        viewThemeUtils.material.themeToolbar(binding.locationPickerToolbar)
     }
     }
 
 
     override fun onCreateOptionsMenu(menu: Menu): Boolean {
     override fun onCreateOptionsMenu(menu: Menu): Boolean {

+ 4 - 20
app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt

@@ -30,7 +30,6 @@ import android.view.MenuItem
 import android.view.View
 import android.view.View
 import android.widget.Toast
 import android.widget.Toast
 import androidx.appcompat.widget.SearchView
 import androidx.appcompat.widget.SearchView
-import androidx.core.content.res.ResourcesCompat
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelProvider
 import autodagger.AutoInjector
 import autodagger.AutoInjector
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
@@ -38,10 +37,9 @@ import com.nextcloud.talk.activities.BaseActivity
 import com.nextcloud.talk.adapters.items.LoadMoreResultsItem
 import com.nextcloud.talk.adapters.items.LoadMoreResultsItem
 import com.nextcloud.talk.adapters.items.MessageResultItem
 import com.nextcloud.talk.adapters.items.MessageResultItem
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication
-import com.nextcloud.talk.controllers.ConversationsListController
+import com.nextcloud.talk.conversationlist.ConversationsListActivity
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.databinding.ActivityMessageSearchBinding
 import com.nextcloud.talk.databinding.ActivityMessageSearchBinding
-import com.nextcloud.talk.utils.DisplayUtils
 import com.nextcloud.talk.utils.bundle.BundleKeys
 import com.nextcloud.talk.utils.bundle.BundleKeys
 import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
 import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
 import com.nextcloud.talk.utils.rx.SearchViewObservable.Companion.observeSearchView
 import com.nextcloud.talk.utils.rx.SearchViewObservable.Companion.observeSearchView
@@ -80,8 +78,8 @@ class MessageSearchActivity : BaseActivity() {
 
 
         binding = ActivityMessageSearchBinding.inflate(layoutInflater)
         binding = ActivityMessageSearchBinding.inflate(layoutInflater)
         setupActionBar()
         setupActionBar()
-        setupSystemColors()
         setContentView(binding.root)
         setContentView(binding.root)
+        setupSystemColors()
 
 
         viewModel = ViewModelProvider(this, viewModelFactory)[MessageSearchViewModel::class.java]
         viewModel = ViewModelProvider(this, viewModelFactory)[MessageSearchViewModel::class.java]
         user = userProvider.currentUser.blockingGet()
         user = userProvider.currentUser.blockingGet()
@@ -99,21 +97,7 @@ class MessageSearchActivity : BaseActivity() {
         supportActionBar?.setDisplayHomeAsUpEnabled(true)
         supportActionBar?.setDisplayHomeAsUpEnabled(true)
         val conversationName = intent.getStringExtra(BundleKeys.KEY_CONVERSATION_NAME)
         val conversationName = intent.getStringExtra(BundleKeys.KEY_CONVERSATION_NAME)
         supportActionBar?.title = conversationName
         supportActionBar?.title = conversationName
-    }
-
-    private fun setupSystemColors() {
-        DisplayUtils.applyColorToStatusBar(
-            this,
-            ResourcesCompat.getColor(
-                resources,
-                R.color.appbar,
-                null
-            )
-        )
-        DisplayUtils.applyColorToNavigationBar(
-            this.window,
-            ResourcesCompat.getColor(resources, R.color.bg_default, null)
-        )
+        viewThemeUtils.material.themeToolbar(binding.messageSearchToolbar)
     }
     }
 
 
     private fun setupStateObserver() {
     private fun setupStateObserver() {
@@ -241,7 +225,7 @@ class MessageSearchActivity : BaseActivity() {
                 when {
                 when {
                     TextUtils.isEmpty(query) -> Observable.empty()
                     TextUtils.isEmpty(query) -> Observable.empty()
                     else -> Observable.timer(
                     else -> Observable.timer(
-                        ConversationsListController.SEARCH_DEBOUNCE_INTERVAL_MS.toLong(),
+                        ConversationsListActivity.SEARCH_DEBOUNCE_INTERVAL_MS.toLong(),
                         TimeUnit.MILLISECONDS
                         TimeUnit.MILLISECONDS
                     )
                     )
                 }
                 }

+ 2 - 17
app/src/main/java/com/nextcloud/talk/profile/ProfileActivity.kt

@@ -40,7 +40,6 @@ import android.view.View
 import android.view.ViewGroup
 import android.view.ViewGroup
 import android.widget.Toast
 import android.widget.Toast
 import androidx.annotation.DrawableRes
 import androidx.annotation.DrawableRes
-import androidx.core.content.res.ResourcesCompat
 import androidx.core.net.toFile
 import androidx.core.net.toFile
 import androidx.core.view.ViewCompat
 import androidx.core.view.ViewCompat
 import androidx.recyclerview.widget.RecyclerView
 import androidx.recyclerview.widget.RecyclerView
@@ -117,8 +116,8 @@ class ProfileActivity : BaseActivity() {
         NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
         NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
         binding = ActivityProfileBinding.inflate(layoutInflater)
         binding = ActivityProfileBinding.inflate(layoutInflater)
         setupActionBar()
         setupActionBar()
-        setupSystemColors()
         setContentView(binding.root)
         setContentView(binding.root)
+        setupSystemColors()
     }
     }
 
 
     override fun onResume() {
     override fun onResume() {
@@ -201,21 +200,7 @@ class ProfileActivity : BaseActivity() {
         supportActionBar?.setDisplayShowHomeEnabled(true)
         supportActionBar?.setDisplayShowHomeEnabled(true)
         supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(android.R.color.transparent)))
         supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(android.R.color.transparent)))
         supportActionBar?.title = context.getString(R.string.nc_profile_personal_info_title)
         supportActionBar?.title = context.getString(R.string.nc_profile_personal_info_title)
-    }
-
-    private fun setupSystemColors() {
-        DisplayUtils.applyColorToStatusBar(
-            this,
-            ResourcesCompat.getColor(
-                resources,
-                R.color.appbar,
-                null
-            )
-        )
-        DisplayUtils.applyColorToNavigationBar(
-            this.window,
-            ResourcesCompat.getColor(resources, R.color.bg_default, null)
-        )
+        viewThemeUtils.material.themeToolbar(binding.profileToolbar)
     }
     }
 
 
     override fun onCreateOptionsMenu(menu: Menu): Boolean {
     override fun onCreateOptionsMenu(menu: Menu): Boolean {

+ 2 - 17
app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt

@@ -54,7 +54,6 @@ import android.widget.LinearLayout
 import android.widget.Toast
 import android.widget.Toast
 import androidx.appcompat.app.AlertDialog
 import androidx.appcompat.app.AlertDialog
 import androidx.core.content.ContextCompat
 import androidx.core.content.ContextCompat
-import androidx.core.content.res.ResourcesCompat
 import androidx.core.view.ViewCompat
 import androidx.core.view.ViewCompat
 import androidx.work.OneTimeWorkRequest
 import androidx.work.OneTimeWorkRequest
 import androidx.work.WorkManager
 import androidx.work.WorkManager
@@ -133,8 +132,8 @@ class SettingsActivity : BaseActivity() {
 
 
         binding = ActivitySettingsBinding.inflate(layoutInflater)
         binding = ActivitySettingsBinding.inflate(layoutInflater)
         setupActionBar()
         setupActionBar()
-        setupSystemColors()
         setContentView(binding.root)
         setContentView(binding.root)
+        setupSystemColors()
 
 
         binding.avatarImage.let { ViewCompat.setTransitionName(it, "userAvatar.transitionTag") }
         binding.avatarImage.let { ViewCompat.setTransitionName(it, "userAvatar.transitionTag") }
 
 
@@ -234,21 +233,7 @@ class SettingsActivity : BaseActivity() {
         supportActionBar?.setDisplayShowHomeEnabled(true)
         supportActionBar?.setDisplayShowHomeEnabled(true)
         supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(android.R.color.transparent)))
         supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(android.R.color.transparent)))
         supportActionBar?.title = context.getString(R.string.nc_settings)
         supportActionBar?.title = context.getString(R.string.nc_settings)
-    }
-
-    private fun setupSystemColors() {
-        DisplayUtils.applyColorToStatusBar(
-            this,
-            ResourcesCompat.getColor(
-                resources,
-                R.color.appbar,
-                null
-            )
-        )
-        DisplayUtils.applyColorToNavigationBar(
-            this.window,
-            ResourcesCompat.getColor(resources, R.color.bg_default, null)
-        )
+        viewThemeUtils.material.themeToolbar(binding.settingsToolbar)
     }
     }
 
 
     private fun getCurrentUser() {
     private fun getCurrentUser() {

+ 27 - 14
app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java

@@ -26,6 +26,7 @@ package com.nextcloud.talk.ui.dialog;
 
 
 import android.annotation.SuppressLint;
 import android.annotation.SuppressLint;
 import android.app.Dialog;
 import android.app.Dialog;
+import android.content.Intent;
 import android.net.Uri;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Bundle;
 import android.util.Log;
 import android.util.Log;
@@ -38,12 +39,14 @@ import com.nextcloud.talk.activities.MainActivity;
 import com.nextcloud.talk.adapters.items.AdvancedUserItem;
 import com.nextcloud.talk.adapters.items.AdvancedUserItem;
 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.conversationlist.ConversationsListActivity;
 import com.nextcloud.talk.data.user.model.User;
 import com.nextcloud.talk.data.user.model.User;
 import com.nextcloud.talk.databinding.DialogChooseAccountBinding;
 import com.nextcloud.talk.databinding.DialogChooseAccountBinding;
 import com.nextcloud.talk.extensions.ImageViewExtensionsKt;
 import com.nextcloud.talk.extensions.ImageViewExtensionsKt;
 import com.nextcloud.talk.models.json.participants.Participant;
 import com.nextcloud.talk.models.json.participants.Participant;
 import com.nextcloud.talk.models.json.status.Status;
 import com.nextcloud.talk.models.json.status.Status;
 import com.nextcloud.talk.models.json.status.StatusOverall;
 import com.nextcloud.talk.models.json.status.StatusOverall;
+import com.nextcloud.talk.settings.SettingsActivity;
 import com.nextcloud.talk.ui.StatusDrawable;
 import com.nextcloud.talk.ui.StatusDrawable;
 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;
@@ -68,6 +71,8 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.Disposable;
 import io.reactivex.disposables.Disposable;
 import io.reactivex.schedulers.Schedulers;
 import io.reactivex.schedulers.Schedulers;
 
 
+import static com.nextcloud.talk.utils.bundle.BundleKeys.ADD_ACCOUNT;
+
 @AutoInjector(NextcloudTalkApplication.class)
 @AutoInjector(NextcloudTalkApplication.class)
 public class ChooseAccountDialogFragment extends DialogFragment {
 public class ChooseAccountDialogFragment extends DialogFragment {
     public static final String TAG = ChooseAccountDialogFragment.class.getSimpleName();
     public static final String TAG = ChooseAccountDialogFragment.class.getSimpleName();
@@ -178,16 +183,20 @@ public class ChooseAccountDialogFragment extends DialogFragment {
         // Creating listeners for quick-actions
         // Creating listeners for quick-actions
         binding.currentAccount.getRoot().setOnClickListener(v -> dismiss());
         binding.currentAccount.getRoot().setOnClickListener(v -> dismiss());
 
 
-        if (getActivity() instanceof MainActivity) {
-            binding.addAccount.setOnClickListener(v -> {
-                dismiss();
-                ((MainActivity) getActivity()).addAccount();
-            });
-            binding.manageSettings.setOnClickListener(v -> {
-                dismiss();
-                ((MainActivity) getActivity()).openSettings();
-            });
-        }
+
+        binding.addAccount.setOnClickListener(v -> {
+            // TODO: change this when conductor is removed
+            Intent intent = new Intent(getContext(), MainActivity.class);
+            intent.putExtra(ADD_ACCOUNT, true);
+            startActivity(intent);
+            dismiss();
+        });
+        binding.manageSettings.setOnClickListener(v -> {
+            Intent intent = new Intent(getContext(), SettingsActivity.class);
+            startActivity(intent);
+            dismiss();
+        });
+
 
 
         binding.setStatus.setOnClickListener(v -> {
         binding.setStatus.setOnClickListener(v -> {
             dismiss();
             dismiss();
@@ -294,10 +303,14 @@ public class ChooseAccountDialogFragment extends DialogFragment {
 
 
                     if (userManager.setUserAsActive(user).blockingGet()) {
                     if (userManager.setUserAsActive(user).blockingGet()) {
                         cookieManager.getCookieStore().removeAll();
                         cookieManager.getCookieStore().removeAll();
-                        if (getActivity() != null) {
-                            getActivity().runOnUiThread(
-                                () -> ((MainActivity) getActivity()).resetConversationsList());
-                        }
+
+                        Intent intent = new Intent(getContext(), ConversationsListActivity.class);
+                        // TODO: might be better with FLAG_ACTIVITY_SINGLE_TOP instead than FLAG_ACTIVITY_CLEAR_TOP to
+                        // have a smoother transition. However the handling in onNewIntent() in
+                        // ConversationListActivity must be improved for this.
+                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                        startActivity(intent);
+
                         dismiss();
                         dismiss();
                     }
                     }
                 }
                 }

+ 2 - 2
app/src/main/java/com/nextcloud/talk/ui/dialog/ConversationsListBottomDialog.kt

@@ -38,7 +38,6 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
 import com.nextcloud.talk.R
 import com.nextcloud.talk.R
 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.controllers.ConversationsListController
 import com.nextcloud.talk.controllers.bottomsheet.ConversationOperationEnum
 import com.nextcloud.talk.controllers.bottomsheet.ConversationOperationEnum
 import com.nextcloud.talk.controllers.bottomsheet.ConversationOperationEnum.OPS_CODE_ADD_FAVORITE
 import com.nextcloud.talk.controllers.bottomsheet.ConversationOperationEnum.OPS_CODE_ADD_FAVORITE
 import com.nextcloud.talk.controllers.bottomsheet.ConversationOperationEnum.OPS_CODE_MARK_AS_READ
 import com.nextcloud.talk.controllers.bottomsheet.ConversationOperationEnum.OPS_CODE_MARK_AS_READ
@@ -47,6 +46,7 @@ import com.nextcloud.talk.controllers.bottomsheet.ConversationOperationEnum.OPS_
 import com.nextcloud.talk.controllers.bottomsheet.ConversationOperationEnum.OPS_CODE_RENAME_ROOM
 import com.nextcloud.talk.controllers.bottomsheet.ConversationOperationEnum.OPS_CODE_RENAME_ROOM
 import com.nextcloud.talk.controllers.bottomsheet.EntryMenuController
 import com.nextcloud.talk.controllers.bottomsheet.EntryMenuController
 import com.nextcloud.talk.controllers.bottomsheet.OperationsMenuController
 import com.nextcloud.talk.controllers.bottomsheet.OperationsMenuController
+import com.nextcloud.talk.conversationlist.ConversationsListActivity
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.databinding.DialogConversationOperationsBinding
 import com.nextcloud.talk.databinding.DialogConversationOperationsBinding
 import com.nextcloud.talk.jobs.LeaveConversationWorker
 import com.nextcloud.talk.jobs.LeaveConversationWorker
@@ -64,7 +64,7 @@ import javax.inject.Inject
 @AutoInjector(NextcloudTalkApplication::class)
 @AutoInjector(NextcloudTalkApplication::class)
 class ConversationsListBottomDialog(
 class ConversationsListBottomDialog(
     val activity: Activity,
     val activity: Activity,
-    val controller: ConversationsListController,
+    val controller: ConversationsListActivity,
     val currentUser: User,
     val currentUser: User,
     val conversation: Conversation
     val conversation: Conversation
 ) : BottomSheetDialog(activity) {
 ) : BottomSheetDialog(activity) {

+ 1 - 0
app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt

@@ -87,4 +87,5 @@ object BundleKeys {
     const val KEY_DISMISS_RECORDING_URL = "KEY_DISMISS_RECORDING_URL"
     const val KEY_DISMISS_RECORDING_URL = "KEY_DISMISS_RECORDING_URL"
     const val KEY_SHARE_RECORDING_TO_CHAT_URL = "KEY_SHARE_RECORDING_TO_CHAT_URL"
     const val KEY_SHARE_RECORDING_TO_CHAT_URL = "KEY_SHARE_RECORDING_TO_CHAT_URL"
     const val KEY_GEOCODING_RESULT = "KEY_GEOCODING_RESULT"
     const val KEY_GEOCODING_RESULT = "KEY_GEOCODING_RESULT"
+    const val ADD_ACCOUNT = "ADD_ACCOUNT" // temp workaround until conductor is removed
 }
 }

+ 0 - 80
app/src/main/res/layout/activity_main.xml

@@ -40,87 +40,7 @@
         android:windowContentOverlay="@null"
         android:windowContentOverlay="@null"
         app:elevation="0dp">
         app:elevation="0dp">
 
 
-        <com.google.android.material.card.MaterialCardView
-            android:id="@+id/search_toolbar"
-            android:layout_width="match_parent"
-            android:layout_height="50dp"
-            android:layout_marginStart="16dp"
-            android:layout_marginTop="5dp"
-            android:layout_marginEnd="16dp"
-            android:layout_marginBottom="1dp"
-            android:visibility="gone"
-            app:cardCornerRadius="25dp"
-            app:cardElevation="2dp"
-            app:strokeWidth="0dp"
-            tools:visibility="visible">
-
-            <androidx.constraintlayout.widget.ConstraintLayout
-                android:layout_width="match_parent"
-                android:layout_height="match_parent">
-
-                <com.google.android.material.button.MaterialButton
-                    android:id="@+id/menu_button"
-                    style="@style/Widget.AppTheme.Button.IconButton"
-                    android:layout_width="3dp"
-                    android:layout_height="1dp"
-                    android:layout_marginStart="5dp"
-                    android:contentDescription="@string/nc_action_open_main_menu"
-                    android:visibility="gone"
-                    app:cornerRadius="@dimen/button_corner_radius"
-                    app:icon="@drawable/ic_menu"
-                    app:iconTint="@color/fontAppbar"
-                    app:layout_constraintBottom_toBottomOf="parent"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toTopOf="parent" />
-
-                <com.google.android.material.textview.MaterialTextView
-                    android:id="@+id/search_text"
-                    android:layout_width="0dp"
-                    android:layout_height="48dp"
-                    android:layout_marginStart="20dp"
-                    android:layout_marginEnd="18dp"
-                    android:ellipsize="end"
-                    android:gravity="start|center_vertical"
-                    android:lines="1"
-                    android:textAlignment="viewStart"
-                    android:textColor="@color/fontSecondaryAppbar"
-                    android:textSize="16sp"
-                    app:layout_constraintBottom_toBottomOf="parent"
-                    app:layout_constraintStart_toEndOf="@id/menu_button"
-                    app:layout_constraintEnd_toStartOf="@id/rightContainer"
-                    app:layout_constraintTop_toTopOf="parent"
-                    tools:text="Search in Nextcloud" />
-
-                <FrameLayout
-                    android:id="@+id/rightContainer"
-                    android:layout_width="wrap_content"
-                    android:layout_height="match_parent"
-                    android:layout_alignParentEnd="true"
-                    android:minWidth="48dp"
-                    android:layout_centerVertical="true"
-                    app:layout_constraintBottom_toBottomOf="parent"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintTop_toTopOf="parent">
-
-                    <com.google.android.material.button.MaterialButton
-                        android:id="@+id/switch_account_button"
-                        style="@style/Widget.AppTheme.Button.IconButton"
-                        android:layout_width="48dp"
-                        android:layout_height="48dp"
-                        android:layout_gravity="center"
-                        android:contentDescription="@string/nc_settings"
-                        android:scaleType="fitCenter"
-                        android:transitionName="userAvatar.transitionTag"
-                        app:cornerRadius="@dimen/button_corner_radius"
-                        app:iconSize="@dimen/avatar_size_app_bar"
-                        app:iconTint="@null"
-                        tools:icon="@drawable/ic_user" />
-
-                </FrameLayout>
-
-            </androidx.constraintlayout.widget.ConstraintLayout>
 
 
-        </com.google.android.material.card.MaterialCardView>
 
 
         <com.google.android.material.appbar.MaterialToolbar
         <com.google.android.material.appbar.MaterialToolbar
             android:id="@+id/toolbar"
             android:id="@+id/toolbar"

+ 108 - 1
app/src/main/res/layout/controller_conversations_rv.xml

@@ -25,11 +25,118 @@
     android:layout_width="match_parent"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
     android:layout_height="match_parent">
 
 
+    <com.google.android.material.appbar.AppBarLayout
+        android:id="@+id/conversation_list_appbar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/bg_default"
+        android:elevation="0dp"
+        android:clipChildren="true"
+        android:clipToPadding="false"
+        android:windowContentOverlay="@null"
+        app:elevation="0dp">
+
+        <com.google.android.material.card.MaterialCardView
+            android:id="@+id/search_toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="50dp"
+            android:layout_marginStart="16dp"
+            android:layout_marginTop="5dp"
+            android:layout_marginEnd="16dp"
+            android:layout_marginBottom="1dp"
+            android:visibility="gone"
+            app:cardCornerRadius="25dp"
+            app:cardElevation="2dp"
+            app:strokeWidth="0dp"
+            tools:visibility="visible">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+                <com.google.android.material.button.MaterialButton
+                    android:id="@+id/menu_button"
+                    style="@style/Widget.AppTheme.Button.IconButton"
+                    android:layout_width="3dp"
+                    android:layout_height="1dp"
+                    android:layout_marginStart="5dp"
+                    android:contentDescription="@string/nc_action_open_main_menu"
+                    android:visibility="gone"
+                    app:cornerRadius="@dimen/button_corner_radius"
+                    app:icon="@drawable/ic_menu"
+                    app:iconTint="@color/fontAppbar"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <com.google.android.material.textview.MaterialTextView
+                    android:id="@+id/search_text"
+                    android:layout_width="0dp"
+                    android:layout_height="48dp"
+                    android:layout_marginStart="20dp"
+                    android:layout_marginEnd="18dp"
+                    android:ellipsize="end"
+                    android:gravity="start|center_vertical"
+                    android:lines="1"
+                    android:textAlignment="viewStart"
+                    android:textColor="@color/fontSecondaryAppbar"
+                    android:textSize="16sp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/menu_button"
+                    app:layout_constraintEnd_toStartOf="@id/rightContainer"
+                    app:layout_constraintTop_toTopOf="parent"
+                    tools:text="Search in Nextcloud" />
+
+                <FrameLayout
+                    android:id="@+id/rightContainer"
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:layout_alignParentEnd="true"
+                    android:minWidth="48dp"
+                    android:layout_centerVertical="true"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent">
+
+                    <com.google.android.material.button.MaterialButton
+                        android:id="@+id/switch_account_button"
+                        style="@style/Widget.AppTheme.Button.IconButton"
+                        android:layout_width="48dp"
+                        android:layout_height="48dp"
+                        android:layout_gravity="center"
+                        android:contentDescription="@string/nc_settings"
+                        android:scaleType="fitCenter"
+                        android:transitionName="userAvatar.transitionTag"
+                        app:cornerRadius="@dimen/button_corner_radius"
+                        app:iconSize="@dimen/avatar_size_app_bar"
+                        app:iconTint="@null"
+                        tools:icon="@drawable/ic_user" />
+
+                </FrameLayout>
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+        </com.google.android.material.card.MaterialCardView>
+
+        <com.google.android.material.appbar.MaterialToolbar
+            android:id="@+id/conversation_list_toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="?attr/actionBarSize"
+            android:background="@color/appbar"
+            android:theme="?attr/actionBarPopupTheme"
+            app:layout_scrollFlags="enterAlwaysCollapsed|noScroll"
+            app:navigationIconTint="@color/fontAppbar"
+            app:popupTheme="@style/appActionBarPopupMenu"
+            app:titleTextColor="@color/fontAppbar"
+            tools:title="@string/nc_app_product_name" />
+    </com.google.android.material.appbar.AppBarLayout>
+
     <LinearLayout
     <LinearLayout
         android:id="@+id/loading_content"
         android:id="@+id/loading_content"
         android:layout_width="match_parent"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_height="wrap_content"
-        android:orientation="vertical">
+        android:orientation="vertical"
+        android:layout_marginTop="50dp">
 
 
         <include layout="@layout/rv_item_conversation_with_last_message_shimmer" />
         <include layout="@layout/rv_item_conversation_with_last_message_shimmer" />
 
 

+ 1 - 1
app/src/main/res/menu/menu_contacts.xml

@@ -27,7 +27,7 @@
         android:icon="@drawable/ic_search_white_24dp"
         android:icon="@drawable/ic_search_white_24dp"
         android:title="@string/nc_search"
         android:title="@string/nc_search"
         app:actionViewClass="androidx.appcompat.widget.SearchView"
         app:actionViewClass="androidx.appcompat.widget.SearchView"
-        app:showAsAction="collapseActionView|always" />
+        app:showAsAction="collapseActionView|ifRoom" />
 
 
     <item
     <item
         android:id="@+id/contacts_selection_done"
         android:id="@+id/contacts_selection_done"

+ 1 - 1
app/src/main/res/values/styles.xml

@@ -43,6 +43,7 @@
         <item name="bottomSheetDialogTheme">@style/ThemeOverlay.App.BottomSheetDialog</item>
         <item name="bottomSheetDialogTheme">@style/ThemeOverlay.App.BottomSheetDialog</item>
         <item name="popupMenuStyle">@style/ChatSendButtonMenu</item>
         <item name="popupMenuStyle">@style/ChatSendButtonMenu</item>
         <item name="dialogCornerRadius">@dimen/dialogBorderRadius</item>
         <item name="dialogCornerRadius">@dimen/dialogBorderRadius</item>
+        <item name="android:windowBackground">@color/bg_default</item>
     </style>
     </style>
 
 
     <style name="ThemeOverlay.AppTheme.PopupMenu" parent="ThemeOverlay.Material3.Dark">
     <style name="ThemeOverlay.AppTheme.PopupMenu" parent="ThemeOverlay.Material3.Dark">
@@ -294,5 +295,4 @@
         <item name="cornerSize">50%</item>
         <item name="cornerSize">50%</item>
     </style>
     </style>
 
 
-
 </resources>
 </resources>