aboutsummaryrefslogtreecommitdiff
path: root/Client
diff options
context:
space:
mode:
authorJelena Petrovic <jelenapetrovic.7119@gmail.com>2022-11-21 06:58:25 +0100
committerJelena Petrovic <jelenapetrovic.7119@gmail.com>2022-11-21 06:58:25 +0100
commit045d19f46a9a79971ab9b72cad62a6b0e27bac89 (patch)
treebfa45cd6fd60d5c768a41305ccc401fd8e03bef2 /Client
parentf7a12cb67dd4d9e041534a04633d633582f6e0a2 (diff)
omogucena komunikacija preko soketa (slanje i primanje poruka), pisanje poruka u sqllite bazu na telefonu, dodate minimalno odradjene komponente neophodne za pregled i slanje poruka #37
Diffstat (limited to 'Client')
-rw-r--r--Client/BrzoDoLokacije/app/build.gradle2
-rw-r--r--Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml6
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivity.kt17
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivityConversation.kt128
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt24
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt3
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt3
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Chat.kt22
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/DBHelper.kt46
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt27
-rw-r--r--Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml42
-rw-r--r--Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat_conversation.xml82
-rw-r--r--Client/BrzoDoLokacije/app/src/main/res/layout/chat_preview.xml18
-rw-r--r--Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml13
14 files changed, 400 insertions, 33 deletions
diff --git a/Client/BrzoDoLokacije/app/build.gradle b/Client/BrzoDoLokacije/app/build.gradle
index 8437053..f81ba4b 100644
--- a/Client/BrzoDoLokacije/app/build.gradle
+++ b/Client/BrzoDoLokacije/app/build.gradle
@@ -54,7 +54,7 @@ dependencies {
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation "androidx.paging:paging-runtime:3.0.0-alpha03"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
- implementation 'com.microsoft.signalr:signalr:6.0.0'
+ implementation 'com.microsoft.signalr:signalr:6.0.8'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
diff --git a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml
index 8469bd3..745f813 100644
--- a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml
+++ b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml
@@ -37,15 +37,15 @@
android:usesCleartextTraffic="true"
tools:targetApi="31">
<activity
- android:name=".Activities.ChatActivity"
+ android:name=".Activities.ChatActivityConversation"
android:exported="false">
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<activity
- android:name=".MapsActivity"
- android:exported="false">
+ android:name=".Activities.ChatActivity"
+ android:exported="true">
<meta-data
android:name="android.app.lib_name"
android:value="" />
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivity.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivity.kt
index 96c8ea7..4cc7cc1 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivity.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivity.kt
@@ -1,17 +1,34 @@
package com.example.brzodolokacije.Activities
+import android.content.Intent
import android.os.Bundle
+import android.widget.ImageButton
import androidx.appcompat.app.AppCompatActivity
import com.example.brzodolokacije.R
import com.example.brzodolokacije.chat.DBHelper
+import com.example.brzodolokacije.chat.SignalRListener
+import com.example.brzodolokacije.databinding.ActivityChatBinding
class ChatActivity : AppCompatActivity() {
private var dbConnection:DBHelper?=null
+ lateinit var binding: ActivityChatBinding
+ var ws:SignalRListener?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_chat)
+ binding=ActivityChatBinding.inflate(layoutInflater)
dbConnection= DBHelper(this@ChatActivity,null)
+ ws=SignalRListener.getInstance(this@ChatActivity)
+ setListeners()
+
+ }
+ fun setListeners(){
+ findViewById<ImageButton>(R.id.addNewMessage).setOnClickListener {
+ val intent: Intent = Intent(this@ChatActivity,ChatActivityConversation::class.java)
+ intent.putExtra("receiverId","")
+ startActivity(intent)
+ }
}
} \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivityConversation.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivityConversation.kt
new file mode 100644
index 0000000..715f5f3
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivityConversation.kt
@@ -0,0 +1,128 @@
+package com.example.brzodolokacije.Activities
+
+import android.os.Bundle
+import android.util.Log
+import android.widget.EditText
+import android.widget.ImageButton
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import androidx.cardview.widget.CardView
+import androidx.core.view.isVisible
+import com.example.brzodolokacije.Models.Message
+import com.example.brzodolokacije.Models.MessageSend
+import com.example.brzodolokacije.Models.UserReceive
+import com.example.brzodolokacije.R
+import com.example.brzodolokacije.Services.RetrofitHelper
+import com.example.brzodolokacije.Services.SharedPreferencesHelper
+import com.example.brzodolokacije.chat.DBHelper
+import com.example.brzodolokacije.chat.SignalRListener
+import retrofit2.Call
+import retrofit2.Response
+
+class ChatActivityConversation : AppCompatActivity() {
+
+ var receiverId:String?=null
+ var receiverUsername:String?="jelena"
+ var dbConnection:DBHelper?=null
+ var webSocketConnection:SignalRListener?=null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_chat_conversation)
+ receiverId=intent.extras?.get("receiverId").toString()
+ if(receiverId.isNullOrEmpty()){
+ findViewById<CardView>(R.id.cvParentMessageEdit).isVisible=true
+ findViewById<CardView>(R.id.cvParentMessageEdit).invalidate()
+ }
+ else{
+ findViewById<CardView>(R.id.cvParentUsername).isVisible=true
+ findViewById<CardView>(R.id.cvParentUsername).invalidate()
+ }
+ dbConnection=DBHelper.getInstance(this@ChatActivityConversation)
+ webSocketConnection=SignalRListener.getInstance(this@ChatActivityConversation)
+ setListeners()
+ }
+
+ private fun setListeners() {
+ findViewById<ImageButton>(R.id.btnSendMessage).setOnClickListener {
+ var token=SharedPreferencesHelper.getValue("jwt",this@ChatActivityConversation)
+ var messageContent=findViewById<EditText>(R.id.etNewMessage).text.toString()
+ Log.d("main",token!!)
+ val Api= RetrofitHelper.getInstance()
+ if(receiverId.isNullOrEmpty()){
+ //zahtev sa username=om
+ receiverUsername=findViewById<EditText>(R.id.etReceiverUsername).text.toString()
+ val request=Api.getProfile("Bearer "+token,
+ receiverUsername!!
+ )
+ request.enqueue(object : retrofit2.Callback<UserReceive?> {
+ override fun onResponse(call: Call<UserReceive?>, response: Response<UserReceive?>) {
+ if(response.isSuccessful()){
+ //zahtev da se posalje poruka
+ receiverId=response.body()?._id
+ var message= MessageSend(receiverId!!,messageContent)
+ val request2=Api.sendMessage("Bearer "+token,
+ message
+ )
+ request2.enqueue(object : retrofit2.Callback<Message?> {
+ override fun onResponse(call: Call<Message?>, response: Response<Message?>) {
+ if(response.isSuccessful()){
+ //zahtev da se posalje poruka
+ var responseMessage=response.body()
+ dbConnection?.addMessage(responseMessage!!)
+ dbConnection?.getMessages()
+ webSocketConnection?.getConnectionState()
+
+
+ }
+ else{
+ Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime1.",Toast.LENGTH_LONG).show()
+ }
+ }
+
+ override fun onFailure(call: Call<Message?>, t: Throwable) {
+ Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime2.",Toast.LENGTH_LONG).show()
+ }
+ })
+ }
+ else{
+ Log.d("main",response.message())
+ //Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime3.",Toast.LENGTH_LONG).show()
+ }
+ }
+
+ override fun onFailure(call: Call<UserReceive?>, t: Throwable) {
+ Toast.makeText(this@ChatActivityConversation,"fail.",Toast.LENGTH_LONG).show()
+ }
+ })
+ }
+ else{
+ //zahtev da se posalje poruka
+ var message= MessageSend(receiverId!!,messageContent)
+ val request2=Api.sendMessage("Bearer "+token,
+ message
+ )
+ request2.enqueue(object : retrofit2.Callback<Message?> {
+ override fun onResponse(call: Call<Message?>, response: Response<Message?>) {
+ if(response.isSuccessful()){
+ //zahtev da se posalje poruka
+ var responseMessage=response.body()
+ dbConnection?.addMessage(responseMessage!!)
+ dbConnection?.getMessages()
+
+
+ }
+ else{
+ Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime.",Toast.LENGTH_LONG).show()
+ }
+ }
+
+ override fun onFailure(call: Call<Message?>, t: Throwable) {
+ Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime.",Toast.LENGTH_LONG).show()
+ }
+ })
+ }
+ }
+
+ }
+} \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt
index e78e1d6..c8ffb90 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt
@@ -1,43 +1,30 @@
package com.example.brzodolokacije.Fragments
-import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
-import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
-import android.widget.Toast
+import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
-import androidx.paging.PagingDataAdapter
-import androidx.paging.cachedIn
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
-import com.example.brzodolokacije.Activities.NavigationActivity
-import com.example.brzodolokacije.Adapters.SampleAdapter
+import com.example.brzodolokacije.Activities.ChatActivity
import com.example.brzodolokacije.Adapters.ShowPostsAdapter
-import com.example.brzodolokacije.Models.*
+import com.example.brzodolokacije.Models.SearchParams
import com.example.brzodolokacije.R
import com.example.brzodolokacije.Services.RetrofitHelper
-import com.example.brzodolokacije.Services.SharedPreferencesHelper
-import com.example.brzodolokacije.databinding.FragmentHomeBinding
import com.example.brzodolokacije.databinding.FragmentShowPostsBinding
-import com.example.brzodolokacije.paging.SearchPostsRepository
import com.example.brzodolokacije.paging.SearchPostsViewModel
import com.example.brzodolokacije.paging.SearchPostsViewModelFactory
-import kotlinx.android.synthetic.main.fragment_show_posts.*
-import kotlinx.android.synthetic.main.fragment_show_posts.view.*
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.launch
-import okhttp3.ResponseBody
-import retrofit2.Call
-import retrofit2.Response
class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener {
@@ -80,6 +67,11 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener {
}
Log.d("main","klik")
}
+
+ rootView?.findViewById<ImageButton>(R.id.btnChat)?.setOnClickListener() {
+ val intent: Intent = Intent(activity, ChatActivity::class.java)
+ requireActivity().startActivity(intent)
+ }
}
fun requestToBack(searchParams: SearchParams){
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt
index 9d94013..9f53522 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt
@@ -6,7 +6,6 @@ import com.example.brzodolokacije.Models.Auth.Login
import com.example.brzodolokacije.Models.Auth.Register
import com.example.brzodolokacije.Models.Auth.ResetPass
import okhttp3.MultipartBody
-import okhttp3.Request
import okhttp3.RequestBody
import okhttp3.ResponseBody
import retrofit2.Call
@@ -63,6 +62,8 @@ interface IBackendApi {
@Query("sorttype") sorttype:Int,
@Query("filterdate") filterdate:Int
):PagedPosts
+ @POST("/api/message/add")
+ fun sendMessage(@Header("Authorization") authHeader:String,@Body message:MessageSend):Call<Message>
//@POST("putanja")
//fun add(@Body obj:Post,@Header("Authorization") authHeader:String):Call<Post>
} \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt
index 515a41b..b3183b8 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt
@@ -9,7 +9,6 @@ import com.example.brzodolokacije.Activities.ActivityLoginRegister
import com.example.brzodolokacije.Activities.NavigationActivity
import com.example.brzodolokacije.Services.RetrofitHelper
import com.example.brzodolokacije.Services.SharedPreferencesHelper
-import com.example.brzodolokacije.chat.SignalRListener
import retrofit2.Call
import retrofit2.Response
@@ -21,7 +20,7 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent:Intent
- SignalRListener.getInstance(this@MainActivity)
+
if(checkLoggedIn()) {
intent = Intent(this, NavigationActivity::class.java)
}
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Chat.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Chat.kt
new file mode 100644
index 0000000..4b87d51
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Chat.kt
@@ -0,0 +1,22 @@
+package com.example.brzodolokacije.Models
+
+import java.util.*
+
+data class MessageReceive(
+ var senderId:String,
+ var messagge:String,
+ var timestamp:Date
+)
+
+data class MessageSend(
+ var receiverId:String,
+ var messagge:String
+)
+
+data class Message(
+ var _id:String,
+ var senderId: String,
+ var receiverId: String,
+ var messagge: String,
+ var timestamp: Date
+) \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/DBHelper.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/DBHelper.kt
index 60e870e..d4ee046 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/DBHelper.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/DBHelper.kt
@@ -1,41 +1,54 @@
package com.example.brzodolokacije.chat
+import android.app.Activity
import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
+import android.util.Log
+import com.example.brzodolokacije.Models.Message
+
class DBHelper :
- SQLiteOpenHelper {
+ SQLiteOpenHelper{
var db:SQLiteDatabase?=null
- constructor(context: Context, factory: SQLiteDatabase.CursorFactory?):super(context, DATABASE_NAME, factory,2){
+ constructor(context: Context, factory: SQLiteDatabase.CursorFactory?):super(context, DATABASE_NAME, factory,3){
db=readableDatabase
}
+
companion object{
//database name
private val DATABASE_NAME = "chatHistory"
//database tables
val CONTACTS_TABLE_NAME = "contacts"
val MESSAGES_TABLE_NAME = "messages"
+ private var instance:DBHelper?=null
+ fun getInstance(activity: Activity):DBHelper{
+ if(instance==null){
+ instance= DBHelper(activity,null)
+ }
+ return instance as DBHelper
}
+ }
override fun onCreate(db: SQLiteDatabase?) {
if(!doesTableExist(CONTACTS_TABLE_NAME,db)){
var sql:String="CREATE TABLE "+ CONTACTS_TABLE_NAME+"(" +
- "userId" +"TEXT PRIMARY KEY,"+
- "read" +"INT"+
+ "userId " +"TEXT PRIMARY KEY,"+
+ "read " +"INT"+
")"
db?.execSQL(sql)
}
if(!doesTableExist(MESSAGES_TABLE_NAME,db)){
var sql:String="CREATE TABLE "+ MESSAGES_TABLE_NAME+"(" +
- "senderId" +"TEXT,"+
- "receiverId"+"TEXT,"+
- "message" +"TEXT,"+
- "dateTime"+"TEXT"+
+ "_id "+"TEXT PRIMARY KEY,"+
+ "senderId " +"TEXT,"+
+ "receiverId "+"TEXT,"+
+ "messagge " +"TEXT,"+
+ "timestamp "+"TEXT"+
")"
db?.execSQL(sql)
}
@@ -60,4 +73,21 @@ class DBHelper :
db?.execSQL("DROP TABLE IF EXISTS " + MESSAGES_TABLE_NAME)
onCreate(db)
}
+
+ fun addMessage(message: Message){
+ if(message._id.isNullOrEmpty()){
+ message._id=message.senderId+message.timestamp
+ }
+ var sql="INSERT INTO "+ MESSAGES_TABLE_NAME+"(_id,senderId,receiverid,messagge,timestamp) VALUES('"+message._id+"','"+
+ message.senderId+"','"+
+ message.receiverId+"','"+
+ message.messagge+ "','"+
+ message.timestamp+ "')"
+ db?.execSQL(sql)
+ }
+ fun getMessages(){
+ var sql="SELECT * FROM "+ MESSAGES_TABLE_NAME
+ var cursor=db?.rawQuery(sql,null)
+ Log.d("main",cursor?.count.toString())
+ }
} \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt
index ee0c86d..1aa6afa 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt
@@ -2,19 +2,28 @@ package com.example.brzodolokacije.chat
import android.app.Activity
import android.util.Log
+import com.example.brzodolokacije.Models.MessageReceive
import com.example.brzodolokacije.Services.RetrofitHelper
import com.example.brzodolokacije.Services.SharedPreferencesHelper
+import com.microsoft.signalr.Action1
import com.microsoft.signalr.HubConnection
import com.microsoft.signalr.HubConnectionBuilder
-import io.reactivex.rxjava3.core.Single
+import com.microsoft.signalr.HubConnectionState
+
class SignalRListener private constructor(val activity: Activity){
private var hubConnection:HubConnection
init{
hubConnection=HubConnectionBuilder.create(RetrofitHelper.baseUrl+"/chathub")
- .withAccessTokenProvider(Single.defer{ Single.just(SharedPreferencesHelper.getValue("jwt", activity).toString())})
+ .withHeader("access_token",SharedPreferencesHelper.getValue("jwt",activity))
.build()
+ hubConnection.keepAliveInterval=120
+ hubConnection.on("Message",
+ Action1 {message:MessageReceive->Log.d("main",message.messagge)},
+ MessageReceive::class.java
+ )
hubConnection.start().blockingAwait()
+
Log.d("main", hubConnection.connectionState.toString())
}
@@ -27,6 +36,20 @@ class SignalRListener private constructor(val activity: Activity){
}
return instance as SignalRListener
}
+
+ }
+ fun stopHubConnection(){
+ if(hubConnection.connectionState == HubConnectionState.CONNECTED){
+ hubConnection.stop()
+ }
+ }
+
+ fun getConnectionState(){
+ Log.d("main",hubConnection.connectionState.toString())
+ }
+
+ fun log(){
+ Log.d("Debug infor siganlR ", hubConnection.connectionId)
}
} \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml
index 093a95a..694e972 100644
--- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml
+++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml
@@ -5,5 +5,47 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Activities.ChatActivity">
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/topBanner"
+ android:layout_width="match_parent"
+ android:clickable="true"
+ android:layout_height="50dp"
+ android:background="@color/dark_blue_transparent"
+ app:layout_constraintStart_toStartOf="parent">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:textSize="40dp"
+ android:id="@+id/tvFragmentTitle"
+ android:text="Chat"
+ android:textColor="@color/white"/>
+
+ </androidx.constraintlayout.widget.ConstraintLayout>
+ <ImageButton
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/addNewMessage"
+ android:clickable="true"
+ android:focusable="true"
+ app:layout_constraintTop_toBottomOf="@id/topBanner"
+ android:src="@drawable/button_chat">
+
+
+ </ImageButton>
+<!-- <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:id="@+id/swipeContainer"
+ app:layout_constraintTop_toBottomOf="@id/addNewMessage">
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/rvMain"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" >
+
+ </androidx.recyclerview.widget.RecyclerView>
+ </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>-->
</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat_conversation.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat_conversation.xml
new file mode 100644
index 0000000..ea7d3e7
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat_conversation.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".Activities.ChatActivityConversation">
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/topBanner"
+ android:layout_width="match_parent"
+ android:clickable="true"
+ android:layout_height="50dp"
+ android:background="@color/dark_blue_transparent"
+ app:layout_constraintStart_toStartOf="parent">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:textSize="40dp"
+ android:id="@+id/tvFragmentTitle"
+ android:text="Chat"
+ android:textColor="@color/white"/>
+ <androidx.cardview.widget.CardView
+ android:id="@+id/cvParentUsername"
+ android:layout_width="match_parent"
+ android:layout_height="40dp"
+ android:layout_marginTop="10dp"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="16dp"
+ android:elevation="0dp"
+ app:cardCornerRadius="20dp"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+
+
+ <com.google.android.material.textfield.TextInputEditText
+ android:id="@+id/etReceiverUsername"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/rounded_white_button_login"
+ android:hint=" kome slati poruku?"
+ android:paddingLeft="15dp"
+ android:inputType="textPersonName" />
+
+
+ </androidx.cardview.widget.CardView>
+
+ </androidx.constraintlayout.widget.ConstraintLayout>
+ <androidx.cardview.widget.CardView
+ android:id="@+id/cvParentMessageEdit"
+ android:layout_width="match_parent"
+ android:layout_height="40dp"
+ android:layout_marginTop="10dp"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="16dp"
+ android:elevation="0dp"
+ app:cardCornerRadius="20dp"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent">
+
+
+ <com.google.android.material.textfield.TextInputEditText
+ android:id="@+id/etNewMessage"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/rounded_white_button_login"
+ android:hint=" poruka"
+ android:paddingLeft="15dp"
+ android:inputType="textPersonName" />
+
+ <ImageButton
+ android:id="@+id/btnSendMessage"
+ android:layout_width="49dp"
+ android:layout_height="50dp"
+ android:layout_gravity="right"
+ android:scaleType="centerCrop"
+ app:cornerRadius="16dp"
+ android:src="@drawable/post_comment" />
+
+ </androidx.cardview.widget.CardView>
+</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/chat_preview.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/chat_preview.xml
new file mode 100644
index 0000000..95c036a
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/res/layout/chat_preview.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ <androidx.appcompat.widget.AppCompatImageView
+ android:layout_width="50dp"
+ android:layout_height="50dp"
+ android:id="@+id/ivUserImage"/>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:id="@+id/tvUsername"
+ android:textSize="@dimen/header1_size"
+ android:textColor="@color/black"
+ app:layout_constraintStart_toEndOf="@id/ivUserImage"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml
index 5dfbc98..6e22456 100644
--- a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml
+++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml
@@ -73,6 +73,19 @@
app:layout_constraintTop_toTopOf="parent" />
<ImageButton
+ android:id="@+id/btnChat"
+ android:layout_width="84dp"
+ android:layout_height="50dp"
+ android:layout_marginStart="8dp"
+ android:layout_weight="1"
+ android:background="@color/white"
+ android:padding="@dimen/component_padding"
+ android:scaleType="centerCrop"
+ android:src="@android:drawable/sym_action_chat"
+ app:layout_constraintStart_toEndOf="@+id/btnSortDirection"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <ImageButton
android:id="@+id/btnLinearLayout"
android:layout_width="50dp"
android:layout_height="50dp"