123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- package com.nextcloud.talk.conversationinfoedit
- import android.app.Activity
- import android.content.Intent
- import android.graphics.drawable.ColorDrawable
- import android.os.Bundle
- import android.text.TextUtils
- import android.util.Log
- import android.view.Menu
- import android.view.MenuItem
- import android.view.View
- import androidx.core.net.toFile
- import androidx.core.view.ViewCompat
- import androidx.lifecycle.ViewModelProvider
- import autodagger.AutoInjector
- import com.github.dhaval2404.imagepicker.ImagePicker
- import com.google.android.material.snackbar.Snackbar
- import com.nextcloud.talk.R
- import com.nextcloud.talk.activities.BaseActivity
- import com.nextcloud.talk.api.NcApi
- import com.nextcloud.talk.application.NextcloudTalkApplication
- import com.nextcloud.talk.conversationinfoedit.viewmodel.ConversationInfoEditViewModel
- import com.nextcloud.talk.data.user.model.User
- import com.nextcloud.talk.databinding.ActivityConversationInfoEditBinding
- import com.nextcloud.talk.extensions.loadConversationAvatar
- import com.nextcloud.talk.extensions.loadSystemAvatar
- import com.nextcloud.talk.extensions.loadUserAvatar
- import com.nextcloud.talk.models.domain.ConversationModel
- import com.nextcloud.talk.models.domain.ConversationType
- import com.nextcloud.talk.models.json.capabilities.SpreedCapability
- import com.nextcloud.talk.models.json.generic.GenericOverall
- import com.nextcloud.talk.utils.ApiUtils
- import com.nextcloud.talk.utils.CapabilitiesUtil
- import com.nextcloud.talk.utils.PickImage
- import com.nextcloud.talk.utils.bundle.BundleKeys
- import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
- import io.reactivex.Observer
- import io.reactivex.android.schedulers.AndroidSchedulers
- import io.reactivex.disposables.Disposable
- import io.reactivex.schedulers.Schedulers
- import java.io.File
- import javax.inject.Inject
- @AutoInjector(NextcloudTalkApplication::class)
- class ConversationInfoEditActivity :
- BaseActivity() {
- private lateinit var binding: ActivityConversationInfoEditBinding
- @Inject
- lateinit var ncApi: NcApi
- @Inject
- lateinit var currentUserProvider: CurrentUserProviderNew
- @Inject
- lateinit var viewModelFactory: ViewModelProvider.Factory
- lateinit var conversationInfoEditViewModel: ConversationInfoEditViewModel
- private lateinit var roomToken: String
- private lateinit var conversationUser: User
- private lateinit var credentials: String
- private var conversation: ConversationModel? = null
- private lateinit var pickImage: PickImage
- private lateinit var spreedCapabilities: SpreedCapability
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
- binding = ActivityConversationInfoEditBinding.inflate(layoutInflater)
- setupActionBar()
- setContentView(binding.root)
- setupSystemColors()
- val extras: Bundle? = intent.extras
- conversationUser = currentUserProvider.currentUser.blockingGet()
- roomToken = extras?.getString(BundleKeys.KEY_ROOM_TOKEN)!!
- conversationInfoEditViewModel =
- ViewModelProvider(this, viewModelFactory)[ConversationInfoEditViewModel::class.java]
- conversationInfoEditViewModel.getRoom(conversationUser, roomToken)
- viewThemeUtils.material.colorTextInputLayout(binding.conversationNameInputLayout)
- viewThemeUtils.material.colorTextInputLayout(binding.conversationDescriptionInputLayout)
- credentials = ApiUtils.getCredentials(conversationUser.username, conversationUser.token)!!
- pickImage = PickImage(this, conversationUser)
- initObservers()
- }
- override fun onResume() {
- super.onResume()
- }
- private fun initObservers() {
- conversationInfoEditViewModel.viewState.observe(this) { state ->
- when (state) {
- is ConversationInfoEditViewModel.GetRoomSuccessState -> {
- conversation = state.conversationModel
- spreedCapabilities = conversationUser.capabilities!!.spreedCapability!!
- binding.conversationName.setText(conversation!!.displayName)
- if (conversation!!.description != null && conversation!!.description!!.isNotEmpty()) {
- binding.conversationDescription.setText(conversation!!.description)
- }
- if (!CapabilitiesUtil.isConversationDescriptionEndpointAvailable(spreedCapabilities)) {
- binding.conversationDescription.isEnabled = false
- }
- loadConversationAvatar()
- }
- is ConversationInfoEditViewModel.GetRoomErrorState -> {
- Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
- }
- is ConversationInfoEditViewModel.UploadAvatarSuccessState -> {
- conversation = state.conversationModel
- loadConversationAvatar()
- }
- is ConversationInfoEditViewModel.UploadAvatarErrorState -> {
- Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
- }
- is ConversationInfoEditViewModel.DeleteAvatarSuccessState -> {
- conversation = state.conversationModel
- loadConversationAvatar()
- }
- is ConversationInfoEditViewModel.DeleteAvatarErrorState -> {
- Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
- }
- else -> {}
- }
- }
- }
- private fun setupAvatarOptions() {
- binding.avatarUpload.setOnClickListener { pickImage.selectLocal() }
- binding.avatarChoose.setOnClickListener { pickImage.selectRemote() }
- binding.avatarCamera.setOnClickListener { pickImage.takePicture() }
- if (conversation?.hasCustomAvatar == true) {
- binding.avatarDelete.visibility = View.VISIBLE
- binding.avatarDelete.setOnClickListener { deleteAvatar() }
- } else {
- binding.avatarDelete.visibility = View.GONE
- }
- binding.avatarImage.let { ViewCompat.setTransitionName(it, "userAvatar.transitionTag") }
- binding.let {
- viewThemeUtils.material.themeFAB(it.avatarUpload)
- viewThemeUtils.material.themeFAB(it.avatarChoose)
- viewThemeUtils.material.themeFAB(it.avatarCamera)
- viewThemeUtils.material.themeFAB(it.avatarDelete)
- }
- }
- private fun setupActionBar() {
- setSupportActionBar(binding.conversationInfoEditToolbar)
- binding.conversationInfoEditToolbar.setNavigationOnClickListener {
- onBackPressedDispatcher.onBackPressed()
- }
- supportActionBar?.setDisplayHomeAsUpEnabled(true)
- supportActionBar?.setDisplayShowHomeEnabled(true)
- supportActionBar?.setIcon(ColorDrawable(resources!!.getColor(android.R.color.transparent, null)))
- supportActionBar?.title = resources!!.getString(R.string.nc_conversation_menu_conversation_info)
- viewThemeUtils.material.themeToolbar(binding.conversationInfoEditToolbar)
- }
- override fun onCreateOptionsMenu(menu: Menu): Boolean {
- super.onCreateOptionsMenu(menu)
- menuInflater.inflate(R.menu.menu_conversation_info_edit, menu)
- return true
- }
- override fun onPrepareOptionsMenu(menu: Menu): Boolean {
- super.onPrepareOptionsMenu(menu)
- return true
- }
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- if (item.itemId == R.id.save) {
- saveConversationNameAndDescription()
- }
- return true
- }
- private fun saveConversationNameAndDescription() {
- val apiVersion =
- ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1))
- ncApi.renameRoom(
- credentials,
- ApiUtils.getUrlForRoom(
- apiVersion,
- conversationUser.baseUrl!!,
- conversation!!.token
- ),
- binding.conversationName.text.toString()
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .retry(1)
- .subscribe(object : Observer<GenericOverall> {
- override fun onSubscribe(d: Disposable) {
-
- }
- override fun onNext(genericOverall: GenericOverall) {
- if (CapabilitiesUtil.isConversationDescriptionEndpointAvailable(spreedCapabilities)) {
- saveConversationDescription()
- } else {
- finish()
- }
- }
- override fun onError(e: Throwable) {
- Snackbar.make(
- binding.root,
- context.getString(R.string.default_error_msg),
- Snackbar.LENGTH_LONG
- ).show()
- Log.e(TAG, "Error while saving conversation name", e)
- }
- override fun onComplete() {
-
- }
- })
- }
- fun saveConversationDescription() {
- val apiVersion =
- ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.API_V4, ApiUtils.API_V1))
- ncApi.setConversationDescription(
- credentials,
- ApiUtils.getUrlForConversationDescription(
- apiVersion,
- conversationUser.baseUrl!!,
- conversation!!.token
- ),
- binding.conversationDescription.text.toString()
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .retry(1)
- .subscribe(object : Observer<GenericOverall> {
- override fun onSubscribe(d: Disposable) {
-
- }
- override fun onNext(genericOverall: GenericOverall) {
- finish()
- }
- override fun onError(e: Throwable) {
- Snackbar.make(
- binding.root,
- context.getString(R.string.default_error_msg),
- Snackbar.LENGTH_LONG
- ).show()
- Log.e(TAG, "Error while saving conversation description", e)
- }
- override fun onComplete() {
-
- }
- })
- }
- override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- super.onActivityResult(requestCode, resultCode, data)
- when (resultCode) {
- Activity.RESULT_OK -> {
- pickImage.handleActivityResult(
- requestCode,
- resultCode,
- data
- ) { uploadAvatar(it.toFile()) }
- }
- ImagePicker.RESULT_ERROR -> {
- Snackbar.make(binding.root, ImagePicker.getError(data), Snackbar.LENGTH_SHORT).show()
- }
- else -> {
- Log.i(TAG, "Task Cancelled")
- }
- }
- }
- private fun uploadAvatar(file: File) {
- conversationInfoEditViewModel.uploadConversationAvatar(conversationUser, file, roomToken)
- }
- private fun deleteAvatar() {
- conversationInfoEditViewModel.deleteConversationAvatar(conversationUser, roomToken)
- }
- private fun loadConversationAvatar() {
- setupAvatarOptions()
- when (conversation!!.type) {
- ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL -> if (!TextUtils.isEmpty(conversation!!.name)) {
- conversation!!.name?.let { binding.avatarImage.loadUserAvatar(conversationUser, it, true, false) }
- }
- ConversationType.ROOM_GROUP_CALL, ConversationType.ROOM_PUBLIC_CALL -> {
- binding.avatarImage.loadConversationAvatar(conversationUser, conversation!!, false, viewThemeUtils)
- }
- ConversationType.ROOM_SYSTEM -> {
- binding.avatarImage.loadSystemAvatar()
- }
- else -> {
-
- }
- }
- }
- companion object {
- private val TAG = ConversationInfoEditActivity::class.simpleName
- }
- }
|