mirror of
https://github.com/nextcloud/talk-android
synced 2025-03-06 14:27:24 +00:00
Merge pull request #2932 from nextcloud/refactoring/noid/conversationListRemoveConductor
Replace Controller with Activity for ConversationList
This commit is contained in:
commit
0464163c99
@ -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>
|
||||||
|
@ -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,
|
||||||
|
@ -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(
|
val intent = Intent(this, ConversationsListActivity::class.java)
|
||||||
RouterTransaction.with(ConversationsListController(Bundle()))
|
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
|
||||||
.pushChangeHandler(HorizontalChangeHandler())
|
intent.putExtras(Bundle())
|
||||||
.popChangeHandler(HorizontalChangeHandler())
|
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())
|
||||||
|
@ -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()
|
||||||
}
|
viewThemeUtils.material.themeToolbar(binding.chatToolbar)
|
||||||
|
|
||||||
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)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
val intent = Intent(this, ConversationsListActivity::class.java)
|
||||||
// router.pushController(
|
intent.putExtras(bundle)
|
||||||
// RouterTransaction.with(ConversationsListController(bundle))
|
startActivity(intent)
|
||||||
// .pushChangeHandler(HorizontalChangeHandler())
|
|
||||||
// .popChangeHandler(HorizontalChangeHandler())
|
|
||||||
// )
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun markAsUnread(message: IMessage?) {
|
fun markAsUnread(message: IMessage?) {
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
viewThemeUtils.material.themeToolbar(binding.contactsToolbar)
|
||||||
|
|
||||||
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)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSaveInstanceState(bundle: Bundle) {
|
override fun onSaveInstanceState(bundle: Bundle) {
|
||||||
|
@ -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(
|
val intent = Intent(context, ConversationsListActivity::class.java)
|
||||||
RouterTransaction.with(ConversationsListController(Bundle()))
|
startActivity(intent)
|
||||||
.pushChangeHandler(HorizontalChangeHandler())
|
|
||||||
.popChangeHandler(HorizontalChangeHandler())
|
|
||||||
)
|
|
||||||
} 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(
|
val intent = Intent(context, ConversationsListActivity::class.java)
|
||||||
RouterTransaction.with(ConversationsListController(Bundle()))
|
startActivity(intent)
|
||||||
.pushChangeHandler(HorizontalChangeHandler())
|
|
||||||
.popChangeHandler(HorizontalChangeHandler())
|
|
||||||
)
|
|
||||||
} else {
|
} else {
|
||||||
router.setRoot(
|
router.setRoot(
|
||||||
RouterTransaction.with(ServerSelectionController())
|
RouterTransaction.with(ServerSelectionController())
|
||||||
|
@ -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) {
|
// if (getActivity() != null && getActivity() is MainActivity) {
|
||||||
activity = getActivity() as MainActivity?
|
// activity = getActivity() as MainActivity?
|
||||||
viewThemeUtils.material.themeCardView(activity!!.binding.searchToolbar)
|
// viewThemeUtils.material.themeCardView(activity!!.binding.searchToolbar)
|
||||||
viewThemeUtils.material.themeToolbar(activity.binding.toolbar)
|
// viewThemeUtils.material.themeToolbar(activity.binding.toolbar)
|
||||||
viewThemeUtils.material.themeSearchBarText(activity.binding.searchText)
|
// 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() {
|
// open fun showSearchOrToolbar() {
|
||||||
if (isValidActivity(activity)) {
|
// if (isValidActivity(activity)) {
|
||||||
val showSearchBar = appBarLayoutType == AppBarLayoutType.SEARCH_BAR
|
// val showSearchBar = appBarLayoutType == AppBarLayoutType.SEARCH_BAR
|
||||||
val activity = activity as MainActivity
|
// val activity = activity as MainActivity
|
||||||
|
//
|
||||||
if (appBarLayoutType == AppBarLayoutType.EMPTY) {
|
// if (appBarLayoutType == AppBarLayoutType.EMPTY) {
|
||||||
hideBars(activity.binding)
|
// hideBars(activity.binding)
|
||||||
} else {
|
// } else {
|
||||||
if (showSearchBar) {
|
// if (showSearchBar) {
|
||||||
showSearchBar(activity.binding)
|
// showSearchBar(activity.binding)
|
||||||
} else {
|
// } else {
|
||||||
showToolbar(activity.binding)
|
// showToolbar(activity.binding)
|
||||||
}
|
// }
|
||||||
colorizeStatusBar(showSearchBar, activity, resources)
|
// colorizeStatusBar(showSearchBar, activity, resources)
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
colorizeNavigationBar(activity, resources)
|
// colorizeNavigationBar(activity, resources)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private fun isValidActivity(activity: Activity?): Boolean {
|
// private fun isValidActivity(activity: Activity?): Boolean {
|
||||||
return activity != null && activity is MainActivity
|
// return activity != null && activity is MainActivity
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private fun showSearchBar(binding: ActivityMainBinding) {
|
// private fun showSearchBar(binding: ActivityMainBinding) {
|
||||||
val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
|
// val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
|
||||||
binding.searchToolbar.visibility = View.VISIBLE
|
// binding.searchToolbar.visibility = View.VISIBLE
|
||||||
binding.searchText.hint = searchHint
|
// binding.searchText.hint = searchHint
|
||||||
binding.toolbar.visibility = View.GONE
|
// binding.toolbar.visibility = View.GONE
|
||||||
// layoutParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout
|
// // layoutParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout
|
||||||
// .LayoutParams.SCROLL_FLAG_SNAP | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
|
// // .LayoutParams.SCROLL_FLAG_SNAP | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
|
||||||
layoutParams.scrollFlags = 0
|
// layoutParams.scrollFlags = 0
|
||||||
binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
|
// binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
|
||||||
binding.appBar.context,
|
// binding.appBar.context,
|
||||||
R.animator.appbar_elevation_off
|
// R.animator.appbar_elevation_off
|
||||||
)
|
// )
|
||||||
binding.searchToolbar.layoutParams = layoutParams
|
// binding.searchToolbar.layoutParams = layoutParams
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private fun showToolbar(binding: ActivityMainBinding) {
|
// private fun showToolbar(binding: ActivityMainBinding) {
|
||||||
val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
|
// val layoutParams = binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
|
||||||
binding.searchToolbar.visibility = View.GONE
|
// binding.searchToolbar.visibility = View.GONE
|
||||||
binding.toolbar.visibility = View.VISIBLE
|
// binding.toolbar.visibility = View.VISIBLE
|
||||||
viewThemeUtils.material.colorToolbarOverflowIcon(binding.toolbar)
|
// viewThemeUtils.material.colorToolbarOverflowIcon(binding.toolbar)
|
||||||
layoutParams.scrollFlags = 0
|
// layoutParams.scrollFlags = 0
|
||||||
binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
|
// binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
|
||||||
binding.appBar.context,
|
// binding.appBar.context,
|
||||||
R.animator.appbar_elevation_on
|
// R.animator.appbar_elevation_on
|
||||||
)
|
// )
|
||||||
binding.searchToolbar.layoutParams = layoutParams
|
// binding.searchToolbar.layoutParams = layoutParams
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private fun hideBars(binding: ActivityMainBinding) {
|
// private fun hideBars(binding: ActivityMainBinding) {
|
||||||
binding.toolbar.visibility = View.GONE
|
// binding.toolbar.visibility = View.GONE
|
||||||
binding.searchToolbar.visibility = View.GONE
|
// binding.searchToolbar.visibility = View.GONE
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
fun hideSearchBar() {
|
// fun hideSearchBar() {
|
||||||
val activity = activity as MainActivity?
|
// val activity = activity as MainActivity?
|
||||||
val layoutParams = activity!!.binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
|
// val layoutParams = activity!!.binding.searchToolbar.layoutParams as AppBarLayout.LayoutParams
|
||||||
activity.binding.searchToolbar.visibility = View.GONE
|
// activity.binding.searchToolbar.visibility = View.GONE
|
||||||
activity.binding.toolbar.visibility = View.VISIBLE
|
// activity.binding.toolbar.visibility = View.VISIBLE
|
||||||
layoutParams.scrollFlags = 0
|
// layoutParams.scrollFlags = 0
|
||||||
activity.binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
|
// activity.binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
|
||||||
activity.binding.appBar.context,
|
// activity.binding.appBar.context,
|
||||||
R.animator.appbar_elevation_on
|
// R.animator.appbar_elevation_on
|
||||||
)
|
// )
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private fun colorizeStatusBar(showSearchBar: Boolean, activity: Activity?, resources: Resources?) {
|
// private fun colorizeStatusBar(showSearchBar: Boolean, activity: Activity?, resources: Resources?) {
|
||||||
if (activity != null && resources != null) {
|
// if (activity != null && resources != null) {
|
||||||
if (showSearchBar) {
|
// if (showSearchBar) {
|
||||||
view?.let { viewThemeUtils.platform.resetStatusBar(activity) }
|
// view?.let { viewThemeUtils.platform.resetStatusBar(activity) }
|
||||||
} else {
|
// } else {
|
||||||
view?.let { viewThemeUtils.platform.themeStatusBar(activity, it) }
|
// view?.let { viewThemeUtils.platform.themeStatusBar(activity, it) }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private fun colorizeNavigationBar(activity: Activity?, resources: Resources?) {
|
// private fun colorizeNavigationBar(activity: Activity?, resources: Resources?) {
|
||||||
if (activity != null && resources != null) {
|
// if (activity != null && resources != null) {
|
||||||
DisplayUtils.applyColorToNavigationBar(
|
// DisplayUtils.applyColorToNavigationBar(
|
||||||
activity.window,
|
// activity.window,
|
||||||
ResourcesCompat.getColor(resources, R.color.bg_default, null)
|
// 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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
viewThemeUtils.material.themeToolbar(binding.conversationInfoToolbar)
|
||||||
|
|
||||||
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)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun themeSwitchPreferences() {
|
private fun themeSwitchPreferences() {
|
||||||
|
@ -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.google.android.material.appbar.AppBarLayout
|
||||||
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler
|
|
||||||
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,19 +135,17 @@ import java.util.concurrent.TimeUnit
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@AutoInjector(NextcloudTalkApplication::class)
|
@AutoInjector(NextcloudTalkApplication::class)
|
||||||
class ConversationsListController(bundle: Bundle) :
|
class ConversationsListActivity :
|
||||||
BaseController(R.layout.controller_conversations_rv, bundle),
|
BaseActivity(),
|
||||||
FlexibleAdapter.OnItemClickListener,
|
FlexibleAdapter.OnItemClickListener,
|
||||||
FlexibleAdapter.OnItemLongClickListener,
|
FlexibleAdapter.OnItemLongClickListener,
|
||||||
ConversationMenuInterface {
|
ConversationMenuInterface {
|
||||||
private val bundle: Bundle
|
|
||||||
|
private lateinit var binding: ControllerConversationsRvBinding
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var userManager: UserManager
|
lateinit var userManager: UserManager
|
||||||
|
|
||||||
@Inject
|
|
||||||
lateinit var eventBus: EventBus
|
|
||||||
|
|
||||||
@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) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onViewBound(view)
|
super.onCreate(savedInstanceState)
|
||||||
sharedApplication!!.componentApplication.inject(this)
|
NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
|
||||||
actionBar?.show()
|
|
||||||
|
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) {
|
||||||
if (currentUser != null) {
|
val url = ApiUtils.getUrlForAvatar(
|
||||||
val url = ApiUtils.getUrlForAvatar(
|
currentUser!!.baseUrl,
|
||||||
currentUser!!.baseUrl,
|
currentUser!!.userId,
|
||||||
currentUser!!.userId,
|
true
|
||||||
true
|
)
|
||||||
)
|
|
||||||
|
|
||||||
val credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token)
|
val credentials = ApiUtils.getCredentials(currentUser!!.username, currentUser!!.token)
|
||||||
|
|
||||||
context.imageLoader.enqueue(
|
context.imageLoader.enqueue(
|
||||||
ImageRequest.Builder(context)
|
ImageRequest.Builder(context)
|
||||||
.data(url)
|
.data(url)
|
||||||
.addHeader("Authorization", credentials)
|
.addHeader("Authorization", credentials)
|
||||||
.placeholder(R.drawable.ic_user)
|
.placeholder(R.drawable.ic_user)
|
||||||
.transformations(CircleCropTransformation())
|
.transformations(CircleCropTransformation())
|
||||||
.crossfade(true)
|
.crossfade(true)
|
||||||
.target(target)
|
.target(target)
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
Log.e(TAG, "currentUser was null in loadUserAvatar")
|
Log.e(TAG, "currentUser was null in loadUserAvatar")
|
||||||
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show()
|
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)
|
|
||||||
}
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
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() {
|
private fun initSearchView() {
|
||||||
if (activity != null) {
|
val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager?
|
||||||
val searchManager = activity!!.getSystemService(Context.SEARCH_SERVICE) as SearchManager?
|
if (searchItem != null) {
|
||||||
if (searchItem != null) {
|
searchView = MenuItemCompat.getActionView(searchItem) as SearchView
|
||||||
searchView = MenuItemCompat.getActionView(searchItem) as SearchView
|
viewThemeUtils.talk.themeSearchView(searchView!!)
|
||||||
viewThemeUtils.talk.themeSearchView(searchView!!)
|
searchView!!.maxWidth = Int.MAX_VALUE
|
||||||
searchView!!.maxWidth = Int.MAX_VALUE
|
searchView!!.inputType = InputType.TYPE_TEXT_VARIATION_FILTER
|
||||||
searchView!!.inputType = InputType.TYPE_TEXT_VARIATION_FILTER
|
var imeOptions = EditorInfo.IME_ACTION_DONE or EditorInfo.IME_FLAG_NO_FULLSCREEN
|
||||||
var imeOptions = EditorInfo.IME_ACTION_DONE or EditorInfo.IME_FLAG_NO_FULLSCREEN
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && appPreferences.isKeyboardIncognito) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && appPreferences.isKeyboardIncognito) {
|
imeOptions = imeOptions or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING
|
||||||
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
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.distinctUntilChanged()
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe { newText: String? -> onQueryTextChange(newText) }
|
|
||||||
}
|
}
|
||||||
|
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))
|
||||||
|
}
|
||||||
|
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) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
super.onCreateOptionsMenu(menu, inflater)
|
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()) {
|
||||||
if (adapter!!.hasFilter()) {
|
showSearchView(searchView, searchItem)
|
||||||
showSearchView(activity, searchView, searchItem)
|
searchView!!.setQuery(adapter!!.getFilter(String::class.java), false)
|
||||||
searchView!!.setQuery(adapter!!.getFilter(String::class.java), false)
|
}
|
||||||
}
|
binding.searchText.setOnClickListener {
|
||||||
activity.binding.searchText.setOnClickListener {
|
showSearchView(searchView, searchItem)
|
||||||
showSearchView(activity, searchView, searchItem)
|
viewThemeUtils.platform.themeStatusBar(this, searchView!!)
|
||||||
viewThemeUtils.platform.themeStatusBar(activity, 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(this)
|
||||||
viewThemeUtils.platform.resetStatusBar(activity)
|
|
||||||
}
|
|
||||||
} 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) {
|
binding.conversationListAppbar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
|
||||||
mainActivity.binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
|
binding.conversationListAppbar.context,
|
||||||
mainActivity.binding.appBar.context,
|
R.animator.appbar_elevation_off
|
||||||
R.animator.appbar_elevation_off
|
)
|
||||||
)
|
binding.conversationListToolbar.visibility = View.GONE
|
||||||
mainActivity.binding.toolbar.visibility = View.GONE
|
binding.searchToolbar.visibility = View.VISIBLE
|
||||||
mainActivity.binding.searchToolbar.visibility = View.VISIBLE
|
if (resources != null) {
|
||||||
if (resources != null) {
|
viewThemeUtils.platform.resetStatusBar(this@ConversationsListActivity)
|
||||||
viewThemeUtils.platform
|
|
||||||
.resetStatusBar(mainActivity)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 showSearchOrToolbar() {
|
||||||
|
if (TextUtils.isEmpty(searchQuery)) {
|
||||||
|
if (appBarLayoutType == AppBarLayoutType.SEARCH_BAR) {
|
||||||
|
showSearchBar()
|
||||||
|
} else {
|
||||||
|
showToolbar()
|
||||||
|
}
|
||||||
|
colorizeStatusBar()
|
||||||
|
colorizeNavigationBar()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 {
|
private fun hasActivityActionSendIntent(): Boolean {
|
||||||
return if (activity != null) {
|
return Intent.ACTION_SEND == intent.action || Intent.ACTION_SEND_MULTIPLE == intent.action
|
||||||
Intent.ACTION_SEND == activity!!.intent.action || Intent.ACTION_SEND_MULTIPLE == activity!!.intent.action
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun showSearchOrToolbar() {
|
private fun showSearchView(searchView: SearchView?, searchItem: MenuItem?) {
|
||||||
if (TextUtils.isEmpty(searchQuery)) {
|
binding.conversationListAppbar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
|
||||||
super.showSearchOrToolbar()
|
binding.conversationListAppbar.context,
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun showSearchView(activity: MainActivity, searchView: SearchView?, searchItem: MenuItem?) {
|
|
||||||
activity.binding.appBar.stateListAnimator = AnimatorInflater.loadStateListAnimator(
|
|
||||||
activity.binding.appBar.context,
|
|
||||||
R.animator.appbar_elevation_on
|
R.animator.appbar_elevation_on
|
||||||
)
|
)
|
||||||
activity.binding.toolbar.visibility = View.VISIBLE
|
binding.conversationListToolbar.visibility = View.VISIBLE
|
||||||
activity.binding.searchToolbar.visibility = View.GONE
|
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) {
|
// if (view == null) {
|
||||||
Log.d(TAG, "fetchData - getRooms - view is not bound: $startNanoTime")
|
// Log.d(TAG, "fetchData - getRooms - view is not bound: $startNanoTime")
|
||||||
return@subscribe
|
// 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 ==
|
if (intent.getStringExtra(KEY_FORWARD_HIDE_SOURCE_ROOM) != null &&
|
||||||
bundle.getString(KEY_FORWARD_HIDE_SOURCE_ROOM)
|
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(
|
val conversationItem = ConversationItem(
|
||||||
conversation,
|
conversation,
|
||||||
currentUser!!,
|
currentUser!!,
|
||||||
activity!!,
|
this,
|
||||||
viewThemeUtils
|
viewThemeUtils
|
||||||
)
|
)
|
||||||
conversationItems.add(conversationItem)
|
conversationItems.add(conversationItem)
|
||||||
val conversationItemWithHeader = ConversationItem(
|
val conversationItemWithHeader = ConversationItem(
|
||||||
conversation,
|
conversation,
|
||||||
currentUser!!,
|
currentUser!!,
|
||||||
activity!!,
|
this,
|
||||||
callHeaderItems[headerTitle],
|
callHeaderItems[headerTitle],
|
||||||
viewThemeUtils
|
viewThemeUtils
|
||||||
)
|
)
|
||||||
conversationItemsWithHeader.add(conversationItemWithHeader)
|
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) {
|
HTTP_UNAUTHORIZED -> showUnauthorizedDialog()
|
||||||
Log.d(TAG, "Starting reauth webview via getParentController()")
|
else -> {
|
||||||
parentController!!.router.pushController(
|
Log.e(TAG, "Http exception in ConversationListActivity", throwable)
|
||||||
RouterTransaction.with(
|
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show()
|
||||||
WebViewLoginController(
|
|
||||||
currentUser!!.baseUrl,
|
|
||||||
true
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.pushChangeHandler(VerticalChangeHandler())
|
|
||||||
.popChangeHandler(VerticalChangeHandler())
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
Log.d(TAG, "Starting reauth webview via ConversationsListController")
|
|
||||||
showUnauthorizedDialog()
|
|
||||||
}
|
}
|
||||||
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)) {
|
if (!isDestroyed) {
|
||||||
val imm = activity!!.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
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?
|
binding.switchAccountButton.setOnClickListener {
|
||||||
activity!!.binding.switchAccountButton.setOnClickListener {
|
if (resources != null && resources!!.getBoolean(R.bool.multiaccount_support)) {
|
||||||
if (resources != null && resources!!.getBoolean(R.bool.multiaccount_support)) {
|
val newFragment: DialogFragment = ChooseAccountDialogFragment.newInstance()
|
||||||
val newFragment: DialogFragment = ChooseAccountDialogFragment.newInstance()
|
newFragment.show(supportFragmentManager, ChooseAccountDialogFragment.TAG)
|
||||||
newFragment.show(
|
} else {
|
||||||
(getActivity() as MainActivity?)!!.supportFragmentManager,
|
val intent = Intent(context, SettingsActivity::class.java)
|
||||||
ChooseAccountDialogFragment.TAG
|
startActivity(intent)
|
||||||
)
|
|
||||||
} 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) {
|
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
|
||||||
super.onRestoreViewState(view, savedViewState)
|
super.onRestoreInstanceState(savedInstanceState)
|
||||||
if (savedViewState.containsKey(KEY_SEARCH_QUERY)) {
|
|
||||||
searchQuery = savedViewState.getString(KEY_SEARCH_QUERY, "")
|
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) {
|
if (intent != null) {
|
||||||
val intent = activity!!.intent
|
|
||||||
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 &&
|
if (conversationMenuBundle != null &&
|
||||||
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 {
|
||||||
binding?.floatingActionButton?.let {
|
val dialogBuilder = MaterialAlertDialogBuilder(it.context)
|
||||||
val dialogBuilder = MaterialAlertDialogBuilder(it.context)
|
.setIcon(
|
||||||
.setIcon(
|
viewThemeUtils.dialog.colorMaterialAlertDialogIcon(
|
||||||
viewThemeUtils.dialog.colorMaterialAlertDialogIcon(
|
context,
|
||||||
context,
|
R.drawable.ic_delete_black_24dp
|
||||||
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())
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
viewThemeUtils.dialog
|
|
||||||
.colorMaterialAlertDialogBackground(it.context, dialogBuilder)
|
|
||||||
val dialog = dialogBuilder.show()
|
|
||||||
viewThemeUtils.platform.colorTextButtons(
|
|
||||||
dialog.getButton(AlertDialog.BUTTON_POSITIVE),
|
|
||||||
dialog.getButton(AlertDialog.BUTTON_NEGATIVE)
|
|
||||||
)
|
)
|
||||||
}
|
.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.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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) {
|
if (otherUserExists) {
|
||||||
onViewBound(view!!)
|
finish()
|
||||||
onAttach(view!!)
|
startActivity(intent)
|
||||||
} else if (!otherUserExists) {
|
} else if (!otherUserExists) {
|
||||||
router.setRoot(
|
restartApp(this)
|
||||||
RouterTransaction.with(
|
|
||||||
ServerSelectionController()
|
|
||||||
)
|
|
||||||
.pushChangeHandler(VerticalChangeHandler())
|
|
||||||
.popChangeHandler(VerticalChangeHandler())
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.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()
|
finishAffinity()
|
||||||
activity!!.finish()
|
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
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -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 = ""
|
||||||
}
|
viewThemeUtils.material.themeToolbar(binding.geocodingToolbar)
|
||||||
|
|
||||||
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)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initAdapter(addresses: List<Address>) {
|
private fun initAdapter(addresses: List<Address>) {
|
||||||
|
@ -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)
|
||||||
}
|
viewThemeUtils.material.themeToolbar(binding.locationPickerToolbar)
|
||||||
|
|
||||||
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)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
@ -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
|
||||||
}
|
viewThemeUtils.material.themeToolbar(binding.messageSearchToolbar)
|
||||||
|
|
||||||
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)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
viewThemeUtils.material.themeToolbar(binding.profileToolbar)
|
||||||
|
|
||||||
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)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
@ -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)
|
||||||
}
|
viewThemeUtils.material.themeToolbar(binding.settingsToolbar)
|
||||||
|
|
||||||
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)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getCurrentUser() {
|
private fun getCurrentUser() {
|
||||||
|
@ -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 -> {
|
binding.addAccount.setOnClickListener(v -> {
|
||||||
dismiss();
|
// TODO: change this when conductor is removed
|
||||||
((MainActivity) getActivity()).addAccount();
|
Intent intent = new Intent(getContext(), MainActivity.class);
|
||||||
});
|
intent.putExtra(ADD_ACCOUNT, true);
|
||||||
binding.manageSettings.setOnClickListener(v -> {
|
startActivity(intent);
|
||||||
dismiss();
|
dismiss();
|
||||||
((MainActivity) getActivity()).openSettings();
|
});
|
||||||
});
|
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(
|
Intent intent = new Intent(getContext(), ConversationsListActivity.class);
|
||||||
() -> ((MainActivity) getActivity()).resetConversationsList());
|
// 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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
@ -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" />
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user