项目作者: andresandy1203

项目描述 :
Practice App created with Kotlin that registers users using Firebase Auth and allows users to engage in real-time messaging.
高级语言: Kotlin
项目地址: git://github.com/andresandy1203/KotlinMessenger.git
创建时间: 2021-01-17T16:28:45Z
项目社区:https://github.com/andresandy1203/KotlinMessenger

开源协议:

下载


KotlinMessenger

Pratice Android Application that features a fully functional chat messaging environment.

User to User messaging

To send and receive messages the app saves a list of messages under a node in Firebase Database. Next, it listens for all these messages as they are entered in the system, and then refreshes the adapter items in real time.

  1. private fun performSendMessage() {
  2. //Get sender info
  3. val text = edittext_chat_log.text.toString()
  4. val fromId = FirebaseAuth.getInstance().uid
  5. //Get receiver info
  6. val user = intent.getParcelableExtra<User>(NewMessageActivity.USER_KEY)
  7. val toId = user?.uid
  8. if (fromId == null) return
  9. //Push messages to each user message's list on the RealTimeDatabase
  10. val reference =
  11. FirebaseDatabase.getInstance().getReference("/user-messages/$fromId/$toId").push()
  12. val toReference =
  13. FirebaseDatabase.getInstance().getReference("/user-messages/$toId/$fromId").push()
  14. val chatMessage =
  15. ChatMessage(reference.key!!, text, fromId, toId!!, System.currentTimeMillis() / 1000)
  16. reference.setValue(chatMessage)
  17. .addOnSuccessListener {
  18. Log.d(TAG, "Saved chat message: ${reference.key}")
  19. edittext_chat_log.text.clear()
  20. recyclerview_chat_log.scrollToPosition(adapter.itemCount - 1)
  21. }
  22. toReference.setValue(chatMessage)
  23. //Update Latest message to the recently uploaded message
  24. val latestMessageRef =
  25. FirebaseDatabase.getInstance().getReference("/latest-messages/$fromId/$toId")
  26. latestMessageRef.setValue(chatMessage)
  27. val latestMessageToRef =
  28. FirebaseDatabase.getInstance().getReference("/latest-messages/$toId/$fromId")
  29. latestMessageToRef.setValue(chatMessage)
  30. }

Latest Messages

The initial activity displays a list of users whom the currently logged user is messaging. Each adapter’s item also fetches the information from a specific Firebase node that monitors the latest messages saved.

  1. private fun listenForLatestMessages() {
  2. val fromId = FirebaseAuth.getInstance().uid
  3. val ref = FirebaseDatabase.getInstance().getReference("/latest-messages/$fromId")
  4. //Fetch Latest Messages for each active conversation
  5. ref.addChildEventListener(object : ChildEventListener {
  6. override fun onChildAdded(p0: DataSnapshot, p1: String?) {
  7. val chatMessage = p0.getValue(ChatMessage::class.java) ?: return
  8. latestMessagesMap[p0.key!!] = chatMessage
  9. refreshRecyclerViewMessages()
  10. }
  11. override fun onChildChanged(p0: DataSnapshot, p1: String?) {
  12. val chatMessage = p0.getValue(ChatMessage::class.java) ?: return
  13. latestMessagesMap[p0.key!!] = chatMessage
  14. refreshRecyclerViewMessages()
  15. }
  16. override fun onCancelled(error: DatabaseError) {
  17. }
  18. override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {
  19. }
  20. override fun onChildRemoved(snapshot: DataSnapshot) {
  21. }
  22. })
  23. }

Firebase Auth

Using the Firebase Auth library users can be registered with email and password. They can create a username and upload a profile picture.
Integrating CircleImageView allows to round off the corners of the images

RecyclerView

Using Groupie library for easier adapter object creation.

  1. //ViewHolder Class for outbound messages
  2. class ChatFromItem(val text: String, val user: User) : Item<GroupieViewHolder>() {
  3. override fun bind(viewHolder: GroupieViewHolder, position: Int) {
  4. viewHolder.itemView.textView_from_row.text = text
  5. val uri = user.profileImageUrl
  6. val targetImageView = viewHolder.itemView.imageView_from_row
  7. Picasso.get().load(uri).into(targetImageView)
  8. }
  9. override fun getLayout(): Int {
  10. return R.layout.chat_from_row
  11. }
  12. }
  • Remember to add your own Firebase credentials when you test the app, add your own google-services.json

Credits

Firebase analytics 17.5.0, auth 19.4.0, storage 19.2.0, database 19.4.0

Circle Image View 3.1.0

Groupie 2.8.1

Picasso 2.71828

Android Gradle plugin version: 4.0.1

Gradle version: 6.1.1

com.google.gms:google-services:4.3.3

buildToolsVersion “30.0.1”

ext.kotlin_version = “1.4.0”

Gradle dependecies

  1. implementation fileTree(dir: "libs", include: ["*.jar"])
  2. implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
  3. implementation 'androidx.core:core-ktx:1.3.1'
  4. implementation 'androidx.appcompat:appcompat:1.2.0'
  5. implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
  6. implementation 'androidx.recyclerview:recyclerview:1.1.0'
  7. testImplementation 'junit:junit:4.12'
  8. androidTestImplementation 'androidx.test.ext:junit:1.1.2'
  9. androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
  10. implementation 'com.google.firebase:firebase-analytics:17.5.0'
  11. implementation 'com.google.firebase:firebase-auth-ktx:19.4.0'
  12. implementation 'com.google.firebase:firebase-storage-ktx:19.2.0'
  13. implementation 'com.google.firebase:firebase-database-ktx:19.4.0'
  14. implementation 'de.hdodenhof:circleimageview:3.1.0'
  15. implementation "com.xwray:groupie:2.8.1"
  16. implementation 'com.squareup.picasso:picasso:2.71828'