diff options
11 files changed, 289 insertions, 65 deletions
diff --git a/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml b/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 6fac072..0000000 --- a/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="deploymentTargetDropDown"> - <targetSelectedWithDropDown> - <Target> - <type value="QUICK_BOOT_TARGET" /> - <deviceKey> - <Key> - <type value="VIRTUAL_DEVICE_PATH" /> - <value value="C:\Users\TAMARA\.android\avd\Pixel_3a_XL_API_33.avd" /> - </Key> - </deviceKey> - </Target> - </targetSelectedWithDropDown> - <timeTargetWasSelectedWithDropDown value="2022-11-21T20:28:37.906817700Z" /> - </component> -</project>
\ No newline at end of file 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 4cc7cc1..992f09f 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 @@ -4,8 +4,12 @@ import android.content.Intent import android.os.Bundle import android.widget.ImageButton import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.exam.DBHelper +import com.example.brzodolokacije.Adapters.ChatPreviewsAdapter +import com.example.brzodolokacije.Models.ChatPreview import com.example.brzodolokacije.R -import com.example.brzodolokacije.chat.DBHelper import com.example.brzodolokacije.chat.SignalRListener import com.example.brzodolokacije.databinding.ActivityChatBinding @@ -14,14 +18,20 @@ class ChatActivity : AppCompatActivity() { private var dbConnection:DBHelper?=null lateinit var binding: ActivityChatBinding var ws:SignalRListener?=null + var recyclerView:RecyclerView?=null + var adapterVar:ChatPreviewsAdapter?=null + var layoutVar:LinearLayoutManager?=null + var items:MutableList<ChatPreview>?= mutableListOf() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_chat) - binding=ActivityChatBinding.inflate(layoutInflater) + binding= ActivityChatBinding.inflate(layoutInflater) + setContentView(binding.root) dbConnection= DBHelper(this@ChatActivity,null) ws=SignalRListener.getInstance(this@ChatActivity) setListeners() + setRecyclerView() + requestForChats() } fun setListeners(){ @@ -31,4 +41,22 @@ class ChatActivity : AppCompatActivity() { startActivity(intent) } } + + fun requestForChats(){ + var dbHelper= DBHelper.getInstance(this@ChatActivity) + items=dbHelper.getContacts() + adapterVar= items?.let { ChatPreviewsAdapter(it,this@ChatActivity) } + setRecyclerView(setParams = false) + } + + fun setRecyclerView(setParams:Boolean=true){ + if(setParams){ + adapterVar= items?.let { ChatPreviewsAdapter(it,this@ChatActivity) } + layoutVar=LinearLayoutManager(this@ChatActivity) + } + recyclerView=binding.rvMain + recyclerView?.setHasFixedSize(true) + recyclerView?.layoutManager=layoutVar + recyclerView?.adapter=adapterVar + } }
\ 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 index 715f5f3..d523485 100644 --- 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 @@ -2,43 +2,47 @@ package com.example.brzodolokacije.Activities import android.os.Bundle import android.util.Log +import android.view.View 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 androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.exam.DBHelper +import com.example.brzodolokacije.Adapters.ChatMessagesAdapter 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 com.example.brzodolokacije.databinding.ActivityChatConversationBinding import retrofit2.Call import retrofit2.Response class ChatActivityConversation : AppCompatActivity() { - var receiverId:String?=null + var recyclerView:RecyclerView?=null + var adapterVar: ChatMessagesAdapter?=null + var layoutVar: RecyclerView.LayoutManager?=null + lateinit var binding:ActivityChatConversationBinding + var userId:String?=null var receiverUsername:String?="jelena" - var dbConnection:DBHelper?=null + var dbConnection: DBHelper?=null var webSocketConnection:SignalRListener?=null + var items:MutableList<Message>?=mutableListOf() 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() - } + binding= ActivityChatConversationBinding.inflate(layoutInflater) + setContentView(binding.root) + userId=intent.extras?.get("userId").toString() dbConnection=DBHelper.getInstance(this@ChatActivityConversation) + setHeader() + setRecyclerView() + requestMessages() webSocketConnection=SignalRListener.getInstance(this@ChatActivityConversation) setListeners() } @@ -49,7 +53,7 @@ class ChatActivityConversation : AppCompatActivity() { var messageContent=findViewById<EditText>(R.id.etNewMessage).text.toString() Log.d("main",token!!) val Api= RetrofitHelper.getInstance() - if(receiverId.isNullOrEmpty()){ + if(userId.isNullOrEmpty() || userId.equals("null")){ //zahtev sa username=om receiverUsername=findViewById<EditText>(R.id.etReceiverUsername).text.toString() val request=Api.getProfile("Bearer "+token, @@ -59,8 +63,8 @@ class ChatActivityConversation : AppCompatActivity() { 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) + userId=response.body()?._id + var message= MessageSend(userId!!,messageContent) val request2=Api.sendMessage("Bearer "+token, message ) @@ -70,8 +74,7 @@ class ChatActivityConversation : AppCompatActivity() { //zahtev da se posalje poruka var responseMessage=response.body() dbConnection?.addMessage(responseMessage!!) - dbConnection?.getMessages() - webSocketConnection?.getConnectionState() + } @@ -98,7 +101,7 @@ class ChatActivityConversation : AppCompatActivity() { } else{ //zahtev da se posalje poruka - var message= MessageSend(receiverId!!,messageContent) + var message= MessageSend(userId!!,messageContent) val request2=Api.sendMessage("Bearer "+token, message ) @@ -108,7 +111,7 @@ class ChatActivityConversation : AppCompatActivity() { //zahtev da se posalje poruka var responseMessage=response.body() dbConnection?.addMessage(responseMessage!!) - dbConnection?.getMessages() + requestMessages() } @@ -125,4 +128,34 @@ class ChatActivityConversation : AppCompatActivity() { } } + + private fun setHeader(){ + if(userId.isNullOrEmpty() || userId.equals("null")){ + binding.tvFragmentTitle.visibility= View.GONE + binding.tvFragmentTitle.invalidate() + binding.tvFragmentTitle.forceLayout() + } + else{ + binding.tvFragmentTitle.text=userId + binding.tvFragmentTitle.invalidate() + binding.cvParentUsername.visibility= View.GONE + binding.cvParentUsername.forceLayout() + } + } + fun setRecyclerView(setParams:Boolean=true){ + if(setParams){ + adapterVar= items?.let { ChatMessagesAdapter(it,this@ChatActivityConversation) } + layoutVar= LinearLayoutManager(this@ChatActivityConversation) + } + recyclerView = binding.rvMain + recyclerView?.setHasFixedSize(true) + recyclerView?.layoutManager=layoutVar + recyclerView?.adapter=adapterVar + } + + fun requestMessages(){ + items=dbConnection?.getMessages(userId!!) + adapterVar= items?.let { ChatMessagesAdapter(it,this@ChatActivityConversation) } + setRecyclerView(setParams = false) + } }
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/ChatMessagesAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/ChatMessagesAdapter.kt new file mode 100644 index 0000000..4c917f3 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/ChatMessagesAdapter.kt @@ -0,0 +1,38 @@ +package com.example.brzodolokacije.Adapters + +import android.app.Activity +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Models.Message +import com.example.brzodolokacije.databinding.ChatMessageBinding + +class ChatMessagesAdapter (val items : MutableList<Message>, val activity:Activity) + : RecyclerView.Adapter<ChatMessagesAdapter.ViewHolder>(){ + //constructer has one argument - list of objects that need to be displayed + //it is bound to xml of single item + private lateinit var binding: ChatMessageBinding + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val inflater = LayoutInflater.from(parent.context) + binding= ChatMessageBinding.inflate(inflater,parent,false) + return ViewHolder(binding) + } + override fun onBindViewHolder(holder: ViewHolder, position: Int){ + //sets components of particular item + holder.bind(items[position]) +// holder.itemView.setOnClickListener { +// val intent: Intent = Intent(activity, ChatActivityConversation::class.java) +// intent.putExtra("userId",items[position].userId) +// activity.startActivity(intent) +// } + } + override fun getItemCount() = items.size + inner class ViewHolder(itemView : ChatMessageBinding) : RecyclerView.ViewHolder(itemView.root){ + fun bind(item : Message){ + binding.apply { + //clMessage.foregroundGravity=Gravity.END + tvMessage.text=item.messagge + } + } + } +}
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/ChatPreviewsAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/ChatPreviewsAdapter.kt new file mode 100644 index 0000000..b63cb2f --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/ChatPreviewsAdapter.kt @@ -0,0 +1,39 @@ +package com.example.brzodolokacije.Adapters + +import android.app.Activity +import android.content.Intent +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Activities.ChatActivityConversation +import com.example.brzodolokacije.Models.ChatPreview +import com.example.brzodolokacije.databinding.ChatPreviewBinding + +class ChatPreviewsAdapter (val items : MutableList<ChatPreview>,val activity:Activity) + : RecyclerView.Adapter<ChatPreviewsAdapter.ViewHolder>(){ + //constructer has one argument - list of objects that need to be displayed + //it is bound to xml of single item + private lateinit var binding: ChatPreviewBinding + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val inflater = LayoutInflater.from(parent.context) + binding=ChatPreviewBinding.inflate(inflater,parent,false) + return ViewHolder(binding) + } + override fun onBindViewHolder(holder: ViewHolder, position: Int){ + //sets components of particular item + holder.bind(items[position]) + holder.itemView.setOnClickListener { + val intent: Intent = Intent(activity, ChatActivityConversation::class.java) + intent.putExtra("userId",items[position].userId) + activity.startActivity(intent) + } + } + override fun getItemCount() = items.size + inner class ViewHolder(itemView : ChatPreviewBinding) : RecyclerView.ViewHolder(itemView.root){ + fun bind(item : ChatPreview){ + binding.apply { + tvUsername.text=item.userId + } + } + } +}
\ No newline at end of file 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 index 4b87d51..3404541 100644 --- 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 @@ -19,4 +19,9 @@ data class Message( var receiverId: String, var messagge: String, var timestamp: Date +) + +data class ChatPreview( + var userId:String, + var read:Boolean )
\ 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 d4ee046..d3a95b4 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,4 +1,5 @@ -package com.example.brzodolokacije.chat +package com.exam + import android.app.Activity import android.content.Context @@ -6,7 +7,9 @@ import android.database.Cursor import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper import android.util.Log +import com.example.brzodolokacije.Models.ChatPreview import com.example.brzodolokacije.Models.Message +import java.util.* class DBHelper : @@ -36,7 +39,7 @@ class DBHelper : override fun onCreate(db: SQLiteDatabase?) { if(!doesTableExist(CONTACTS_TABLE_NAME,db)){ - var sql:String="CREATE TABLE "+ CONTACTS_TABLE_NAME+"(" + + var sql:String="CREATE TABLE "+ CONTACTS_TABLE_NAME+" (" + "userId " +"TEXT PRIMARY KEY,"+ "read " +"INT"+ ")" @@ -74,7 +77,7 @@ class DBHelper : onCreate(db) } - fun addMessage(message: Message){ + fun addMessage(message: Message, sent:Boolean=true){ if(message._id.isNullOrEmpty()){ message._id=message.senderId+message.timestamp } @@ -84,10 +87,61 @@ class DBHelper : message.messagge+ "','"+ message.timestamp+ "')" db?.execSQL(sql) + if(sent) + sql="SELECT * FROM "+ CONTACTS_TABLE_NAME+" WHERE userId='"+message.receiverId+"'" + else + sql="SELECT * FROM "+ CONTACTS_TABLE_NAME+" WHERE userId='"+message.senderId+"'" + var cursor=db?.rawQuery(sql,null) + if(cursor?.count==0){ + //dodati u kontakte + var id:String + id = if(sent) message.receiverId else message.senderId + var read:Int=if(sent) 1 else 0 + sql="INSERT INTO "+ CONTACTS_TABLE_NAME+"(userId,read) VALUES('"+id+"','"+ + read+"')" + db?.execSQL(sql) + } } - fun getMessages(){ - var sql="SELECT * FROM "+ MESSAGES_TABLE_NAME + fun getMessages(userId:String): MutableList<Message>? { + var sql="SELECT * FROM "+ MESSAGES_TABLE_NAME+" WHERE senderId='"+userId+"' OR receiverId='"+userId+"'" var cursor=db?.rawQuery(sql,null) - Log.d("main",cursor?.count.toString()) + if(cursor?.count!! >0){ + var messagesList:MutableList<Message> =mutableListOf() + var idIndex=cursor.getColumnIndexOrThrow("_id") + var senderIdIndex=cursor.getColumnIndexOrThrow("senderId") + var receiverIdIndex=cursor.getColumnIndexOrThrow("receiverId") + var messageIndex=cursor.getColumnIndexOrThrow("messagge") + var timestampIndex=cursor.getColumnIndexOrThrow("timestamp") + while(cursor.moveToNext()){ + messagesList.add( + Message( + cursor.getString(idIndex), + cursor.getString(senderIdIndex), + cursor.getString(receiverIdIndex), + cursor.getString(messageIndex), + Date() + ) + ) + } + Log.d("main",messagesList.size.toString()) + return messagesList + } + return null + } + + fun getContacts(): MutableList<ChatPreview>? { + var sql="SELECT * FROM "+ CONTACTS_TABLE_NAME + var cursor=db?.rawQuery(sql,null) + if(cursor?.count!! >0){ + var contactList:MutableList<ChatPreview> =mutableListOf() + var userIdIndex=cursor.getColumnIndexOrThrow("userId") + var readIndex=cursor.getColumnIndexOrThrow("read") + while(cursor.moveToNext()){ + contactList.add(ChatPreview(cursor.getString(userIdIndex),cursor.getInt(readIndex)==1)) + } + Log.d("main",contactList.size.toString()) + return contactList + } + return null } }
\ 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 1aa6afa..07a9d3e 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,6 +2,8 @@ package com.example.brzodolokacije.chat import android.app.Activity import android.util.Log +import com.exam.DBHelper +import com.example.brzodolokacije.Models.Message import com.example.brzodolokacije.Models.MessageReceive import com.example.brzodolokacije.Services.RetrofitHelper import com.example.brzodolokacije.Services.SharedPreferencesHelper @@ -13,13 +15,17 @@ import com.microsoft.signalr.HubConnectionState class SignalRListener private constructor(val activity: Activity){ private var hubConnection:HubConnection + private var dbHelper:DBHelper init{ + dbHelper= DBHelper.getInstance(activity) hubConnection=HubConnectionBuilder.create(RetrofitHelper.baseUrl+"/chathub") .withHeader("access_token",SharedPreferencesHelper.getValue("jwt",activity)) .build() hubConnection.keepAliveInterval=120 hubConnection.on("Message", - Action1 {message:MessageReceive->Log.d("main",message.messagge)}, + Action1 { + message:MessageReceive->dbHelper.addMessage(Message(message.senderId+message.timestamp,message.senderId,message.senderId,message.messagge,message.timestamp),false) + }, MessageReceive::class.java ) hubConnection.start().blockingAwait() 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 694e972..9e28d6d 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml @@ -32,7 +32,7 @@ </ImageButton> -<!-- <androidx.swiperefreshlayout.widget.SwipeRefreshLayout + <androidx.swiperefreshlayout.widget.SwipeRefreshLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/swipeContainer" @@ -46,6 +46,6 @@ app:layout_constraintTop_toTopOf="parent" > </androidx.recyclerview.widget.RecyclerView> - </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>--> + </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 index ea7d3e7..5afcd86 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat_conversation.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat_conversation.xml @@ -5,26 +5,30 @@ 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:elevation="5dp" android:background="@color/dark_blue_transparent" + android:clickable="true" app:layout_constraintStart_toStartOf="parent"> + <TextView + android:id="@+id/tvFragmentTitle" android:layout_width="wrap_content" android:layout_height="match_parent" - android:textSize="40dp" - android:id="@+id/tvFragmentTitle" android:text="Chat" - android:textColor="@color/white"/> + android:textColor="@color/white" + android:textSize="40dp" /> + <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_marginTop="10dp" android:layout_marginEnd="16dp" android:elevation="0dp" app:cardCornerRadius="20dp" @@ -39,25 +43,42 @@ android:layout_height="match_parent" android:background="@drawable/rounded_white_button_login" android:hint=" kome slati poruku?" - android:paddingLeft="15dp" - android:inputType="textPersonName" /> + android:inputType="textPersonName" + android:paddingLeft="15dp" /> </androidx.cardview.widget.CardView> </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/messagesContainer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintBottom_toTopOf="@id/cvParentMessageEdit" + app:layout_constrainedHeight="true"> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/rvMain" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintBottom_toBottomOf="parent"> + + </androidx.recyclerview.widget.RecyclerView> + </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_marginTop="10dp" android:layout_marginEnd="16dp" android:elevation="0dp" app:cardCornerRadius="20dp" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintBottom_toBottomOf="parent"> + app:layout_constraintStart_toStartOf="parent"> <com.google.android.material.textfield.TextInputEditText @@ -66,8 +87,8 @@ android:layout_height="match_parent" android:background="@drawable/rounded_white_button_login" android:hint=" poruka" - android:paddingLeft="15dp" - android:inputType="textPersonName" /> + android:inputType="textPersonName" + android:paddingLeft="15dp" /> <ImageButton android:id="@+id/btnSendMessage" @@ -75,8 +96,8 @@ android:layout_height="50dp" android:layout_gravity="right" android:scaleType="centerCrop" - app:cornerRadius="16dp" - android:src="@drawable/post_comment" /> + android:src="@drawable/post_comment" + app:cornerRadius="16dp" /> </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_message.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message.xml new file mode 100644 index 0000000..2210fa0 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@drawable/rounded_cyan_button" + android:id="@+id/clMessage"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/white" + android:id="@+id/tvMessage" + android:text="blabla" + android:padding="@dimen/component_padding"/> + + +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file |