session-android/app/src/main/java/org/thoughtcrime/securesms/home/UserDetailsBottomSheet.kt

123 lines
5.3 KiB
Kotlin
Raw Normal View History

2021-07-09 05:56:38 +02:00
package org.thoughtcrime.securesms.home
2020-09-07 02:57:25 +02:00
2021-05-13 02:25:11 +02:00
import android.annotation.SuppressLint
2020-09-07 07:20:32 +02:00
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
2020-09-07 02:57:25 +02:00
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
2021-05-13 08:20:55 +02:00
import android.view.inputmethod.EditorInfo
2021-05-13 02:25:11 +02:00
import android.view.inputmethod.InputMethodManager
2020-09-07 07:20:32 +02:00
import android.widget.Toast
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
2020-09-07 07:20:32 +02:00
import kotlinx.android.synthetic.main.fragment_user_details_bottom_sheet.*
2020-09-07 02:57:25 +02:00
import network.loki.messenger.R
import org.session.libsession.messaging.MessagingModuleConfiguration
2021-05-24 02:27:31 +02:00
import org.session.libsession.messaging.contacts.Contact
import org.session.libsession.utilities.Address
import org.session.libsession.utilities.recipients.Recipient
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
import org.thoughtcrime.securesms.dependencies.DatabaseComponent
2020-09-07 07:20:32 +02:00
import org.thoughtcrime.securesms.mms.GlideApp
2021-07-14 06:39:20 +02:00
import org.thoughtcrime.securesms.util.UiModeUtilities
2020-09-07 02:57:25 +02:00
2021-05-21 07:36:16 +02:00
class UserDetailsBottomSheet : BottomSheetDialogFragment() {
2020-09-07 02:57:25 +02:00
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_user_details_bottom_sheet, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
2020-09-07 07:20:32 +02:00
val publicKey = arguments?.getString("publicKey") ?: return dismiss()
2021-05-11 09:05:04 +02:00
val recipient = Recipient.from(requireContext(), Address.fromSerialized(publicKey), false)
2020-09-07 07:20:32 +02:00
profilePictureView.publicKey = publicKey
profilePictureView.glide = GlideApp.with(this)
profilePictureView.isLarge = true
profilePictureView.update(recipient, -1)
2021-05-11 09:05:04 +02:00
nameTextViewContainer.visibility = View.VISIBLE
nameTextViewContainer.setOnClickListener {
nameTextViewContainer.visibility = View.INVISIBLE
nameEditTextContainer.visibility = View.VISIBLE
nicknameEditText.text = null
nicknameEditText.requestFocus()
2021-05-13 02:25:11 +02:00
showSoftKeyboard()
2021-05-11 09:05:04 +02:00
}
cancelNicknameEditingButton.setOnClickListener {
nicknameEditText.clearFocus()
2021-05-13 02:25:11 +02:00
hideSoftKeyboard()
2021-05-11 09:05:04 +02:00
nameTextViewContainer.visibility = View.VISIBLE
nameEditTextContainer.visibility = View.INVISIBLE
2021-05-11 09:05:04 +02:00
}
saveNicknameButton.setOnClickListener {
2021-05-13 08:20:55 +02:00
saveNickName(recipient)
}
nicknameEditText.setOnEditorActionListener { _, actionId, _ ->
2021-05-13 08:20:55 +02:00
when (actionId) {
EditorInfo.IME_ACTION_DONE -> {
saveNickName(recipient)
return@setOnEditorActionListener true
}
else -> return@setOnEditorActionListener false
2021-05-12 07:11:09 +02:00
}
2021-05-11 09:05:04 +02:00
}
2021-05-24 02:27:31 +02:00
nameTextView.text = recipient.name ?: publicKey // Uses the Contact API internally
2020-09-07 07:20:32 +02:00
publicKeyTextView.text = publicKey
publicKeyTextView.setOnLongClickListener {
2020-09-07 07:20:32 +02:00
val clipboard = requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("Session ID", publicKey)
clipboard.setPrimaryClip(clip)
Toast.makeText(requireContext(), R.string.copied_to_clipboard, Toast.LENGTH_SHORT).show()
true
}
messageButton.setOnClickListener {
val threadId = MessagingModuleConfiguration.shared.storage.getThreadId(recipient)
val intent = Intent(
context,
ConversationActivityV2::class.java
)
intent.putExtra(ConversationActivityV2.ADDRESS, recipient.address)
intent.putExtra(ConversationActivityV2.THREAD_ID, threadId ?: -1)
startActivity(intent)
dismiss()
2020-09-07 07:20:32 +02:00
}
2020-09-07 02:57:25 +02:00
}
2021-05-13 02:25:11 +02:00
2021-07-14 06:39:20 +02:00
override fun onStart() {
super.onStart()
val window = dialog?.window ?: return
val isLightMode = UiModeUtilities.isDayUiMode(requireContext())
window.setDimAmount(if (isLightMode) 0.1f else 0.75f)
}
2021-05-13 08:20:55 +02:00
fun saveNickName(recipient: Recipient) {
nicknameEditText.clearFocus()
2021-05-13 08:20:55 +02:00
hideSoftKeyboard()
nameTextViewContainer.visibility = View.VISIBLE
nameEditTextContainer.visibility = View.INVISIBLE
2021-05-13 08:20:55 +02:00
var newNickName: String? = null
if (nicknameEditText.text.isNotEmpty()) {
newNickName = nicknameEditText.text.toString()
2021-05-13 08:20:55 +02:00
}
2021-05-24 02:27:31 +02:00
val publicKey = recipient.address.serialize()
val contactDB = DatabaseComponent.get(requireContext()).sessionContactDatabase()
2021-05-24 02:27:31 +02:00
val contact = contactDB.getContactWithSessionID(publicKey) ?: Contact(publicKey)
contact.nickname = newNickName
contactDB.setContact(contact)
nameTextView.text = recipient.name ?: publicKey // Uses the Contact API internally
2021-05-13 08:20:55 +02:00
}
2021-05-13 02:25:11 +02:00
@SuppressLint("ServiceCast")
fun showSoftKeyboard() {
val imm = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
imm?.showSoftInput(nicknameEditText, 0)
2021-05-13 02:25:11 +02:00
}
fun hideSoftKeyboard() {
val imm = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
imm?.hideSoftInputFromWindow(nicknameEditText.windowToken, 0)
2021-05-13 02:25:11 +02:00
}
2020-09-07 02:57:25 +02:00
}