diff options
author | TAMARA JERINIC <tamara.jerinic@gmail.com> | 2022-11-29 10:54:28 +0100 |
---|---|---|
committer | TAMARA JERINIC <tamara.jerinic@gmail.com> | 2022-11-29 10:54:28 +0100 |
commit | f062de86e3e0694ce68a89c923dac5d539f1f05e (patch) | |
tree | 446c0279fdfc644917b0c6e5811bfaa596495199 /Client | |
parent | 75ff22fde1e7ebc566f54a7d9271923ac156ab89 (diff) | |
parent | efc660578a44173fe035f60257ac552d7ed4f528 (diff) |
Merge branch 'develop' of http://gitlab.pmf.kg.ac.rs/BrzoDoLokacije2022/odyssey/brzodolokacije into develop
# Conflicts:
# Client/BrzoDoLokacije/app/src/main/res/layout/chat_message.xml
# Client/BrzoDoLokacije/app/src/main/res/layout/chat_message_other.xml
Diffstat (limited to 'Client')
16 files changed, 383 insertions, 107 deletions
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityAddPost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityAddPost.kt index efe2ac2..746d8b0 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityAddPost.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityAddPost.kt @@ -9,6 +9,7 @@ import android.net.Uri import android.os.Bundle import android.util.Log import android.util.TypedValue +import android.view.KeyEvent import android.view.View import android.widget.* import androidx.appcompat.app.AppCompatActivity @@ -52,6 +53,7 @@ class ActivityAddPost : AppCompatActivity() { private lateinit var tagText: EditText private lateinit var tagButtonAdd:Button private lateinit var tagList: MutableList<String> + private lateinit var locText: EditText private var tagidcounter:Int = 0 val LOCATIONREQCODE=123 var locationId:String?=null @@ -80,6 +82,7 @@ class ActivityAddPost : AppCompatActivity() { tagText =findViewById<View>(R.id.acTags) as EditText tagButtonAdd = findViewById<View>(R.id.btnActivityAddPostAddTag) as Button tagLayout = findViewById<View>(R.id.llTags) as LinearLayout + locText=findViewById<View>(R.id.etActivityAddPostLocationText) as EditText addDescription=findViewById<View>(R.id.tvActivityAddPostDescriptiontext)as Button @@ -109,41 +112,18 @@ class ActivityAddPost : AppCompatActivity() { } //dodavanje i brisanje tagova tagButtonAdd.setOnClickListener { - tagText.isGone=false - tagText.isVisible=true - - if(tagList.count()<4 && tagText.text.toString().length>=3) { - var tagstr = tagText.text.toString() - var newbtn = Button(this) - newbtn.setId(tagidcounter) - newbtn.text = tagstr - var layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - 50 - ) - layoutParams.setMargins(3) - newbtn.layoutParams=layoutParams - newbtn.setBackgroundColor(Color.parseColor("#1C789A")) - newbtn.setTextColor(Color.WHITE) - newbtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) - newbtn.setPadding(3,1,3,1) - - newbtn.setOnClickListener { - var btntext = newbtn.text.toString() - tagList.remove(btntext) - tagButtons.remove(newbtn) - tagLayout.removeView(newbtn) - } - - tagList.add(tagstr) - tagButtons.add(newbtn) - tagLayout.addView(newbtn) - tagText.text.clear() - } - else{ - Toast.makeText(this,"Maksimalno 4 tagova ( duzine + karaktera)",Toast.LENGTH_LONG) - } + addTag() } + tagText.setOnKeyListener(View.OnKeyListener { v1, keyCode, event -> // If the event is a key-down event on the "enter" button + if (event.action === KeyEvent.ACTION_DOWN && + keyCode == KeyEvent.KEYCODE_ENTER + ) { + // Perform action on key press + addTag() + return@OnKeyListener true + } + false + }) //dodavanje iz galerije uploadFromGallery.setOnClickListener{ @@ -208,7 +188,42 @@ class ActivityAddPost : AppCompatActivity() { } } } + fun addTag(){ + tagText.isGone=false + tagText.isVisible=true + + if(tagList.count()<4 && tagText.text.toString().length>=3) { + var tagstr = tagText.text.toString() + var newbtn = Button(this) + newbtn.setId(tagidcounter) + newbtn.text = tagstr + var layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + 50 + ) + layoutParams.setMargins(3) + newbtn.layoutParams=layoutParams + newbtn.setBackgroundColor(Color.parseColor("#1C789A")) + newbtn.setTextColor(Color.WHITE) + newbtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) + newbtn.setPadding(3,1,3,1) + + newbtn.setOnClickListener { + var btntext = newbtn.text.toString() + tagList.remove(btntext) + tagButtons.remove(newbtn) + tagLayout.removeView(newbtn) + } + tagList.add(tagstr) + tagButtons.add(newbtn) + tagLayout.addView(newbtn) + tagText.text.clear() + } + else{ + Toast.makeText(this,"Maksimalno 4 tagova ( duzine + karaktera)",Toast.LENGTH_LONG) + } + } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -244,6 +259,10 @@ class ActivityAddPost : AppCompatActivity() { if(requestCode==LOCATIONREQCODE && resultCode== RESULT_OK){ var bundle=data!!.extras locationId=bundle!!.getString("locationId") + var name=bundle!!.getString("name") + locText.isGone=false + locText.isVisible=true + locText.setText(name,TextView.BufferType.EDITABLE) } } private fun sendPost(){ @@ -298,9 +317,12 @@ class ActivityAddPost : AppCompatActivity() { override fun onResponse(call: Call<PostPreview?>, response: Response<PostPreview?>) { progressDialog!!.dismiss() if(response.isSuccessful()){ - Toast.makeText( - applicationContext, "USPEH", Toast.LENGTH_LONG - ).show(); + val intent:Intent = Intent(this@ActivityAddPost,ActivitySinglePost::class.java) + var b=Bundle() + b.putParcelable("selectedPost",response.body()) + intent.putExtras(b) + startActivity(intent) + finish() }else { if (response.errorBody() != null) { diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityCapturePost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityCapturePost.kt index 0221241..79062c9 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityCapturePost.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityCapturePost.kt @@ -11,6 +11,7 @@ import android.os.Bundle import android.provider.MediaStore import android.util.Log import android.util.TypedValue +import android.view.KeyEvent import android.view.View import android.widget.* import androidx.activity.result.contract.ActivityResultContracts @@ -53,6 +54,7 @@ class ActivityCapturePost : AppCompatActivity() { private lateinit var tagList: MutableList<String> private var tagidcounter:Int = 0 private lateinit var addDescription:Button + private lateinit var locText: EditText val LOCATIONREQCODE=123 @@ -77,6 +79,7 @@ class ActivityCapturePost : AppCompatActivity() { tagLayout = findViewById<View>(R.id.llTagsCap) as LinearLayout addDescription=findViewById<View>(R.id.tvActivityCapturePostDescriptiontext)as Button + locText=findViewById<View>(R.id.etActivityAddPostLocationText) as EditText progressDialog= ProgressDialog(this) @@ -95,42 +98,18 @@ class ActivityCapturePost : AppCompatActivity() { } //dodavanje i brisanje tagova tagButtonAdd.setOnClickListener { - tagText.isGone=false - tagText.isVisible=true - - if(tagList.count()<4 && tagText.text.toString().length>=3) { - var tagstr = tagText.text.toString() - var newbtn = Button(this) - newbtn.setId(tagidcounter) - newbtn.text = tagstr - var layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - 50 - ) - layoutParams.setMargins(3) - newbtn.layoutParams=layoutParams - newbtn.setBackgroundColor(Color.parseColor("#1C789A")) - newbtn.setTextColor(Color.WHITE) - newbtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) - newbtn.setPadding(3,1,3,1) - - newbtn.setOnClickListener { - var btntext = newbtn.text.toString() - tagList.remove(btntext) - tagButtons.remove(newbtn) - tagLayout.removeView(newbtn) - } - - tagList.add(tagstr) - tagButtons.add(newbtn) - tagLayout.addView(newbtn) - tagText.text.clear() - } - else{ - Toast.makeText(this,"Maksimalno 4 tagova (duzine 3+ karaktera)",Toast.LENGTH_LONG) - } + addTag() } - + tagText.setOnKeyListener(View.OnKeyListener { v1, keyCode, event -> // If the event is a key-down event on the "enter" button + if (event.action === KeyEvent.ACTION_DOWN && + keyCode == KeyEvent.KEYCODE_ENTER + ) { + // Perform action on key press + addTag() + return@OnKeyListener true + } + false + }) //dodavanje sa kamere @@ -225,11 +204,51 @@ class ActivityCapturePost : AppCompatActivity() { } } + fun addTag(){ + tagText.isGone=false + tagText.isVisible=true + + if(tagList.count()<4 && tagText.text.toString().length>=3) { + var tagstr = tagText.text.toString() + var newbtn = Button(this) + newbtn.setId(tagidcounter) + newbtn.text = tagstr + var layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + 50 + ) + layoutParams.setMargins(3) + newbtn.layoutParams=layoutParams + newbtn.setBackgroundColor(Color.parseColor("#1C789A")) + newbtn.setTextColor(Color.WHITE) + newbtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) + newbtn.setPadding(3,1,3,1) + + newbtn.setOnClickListener { + var btntext = newbtn.text.toString() + tagList.remove(btntext) + tagButtons.remove(newbtn) + tagLayout.removeView(newbtn) + } + + tagList.add(tagstr) + tagButtons.add(newbtn) + tagLayout.addView(newbtn) + tagText.text.clear() + } + else{ + Toast.makeText(this,"Maksimalno 4 tagova ( duzine + karaktera)",Toast.LENGTH_LONG) + } + } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if(requestCode==LOCATIONREQCODE && resultCode== RESULT_OK){ var bundle=data!!.extras locationId=bundle!!.getString("locationId") + var name=bundle!!.getString("name") + locText.isGone=false + locText.isVisible=true + locText.setText(name,TextView.BufferType.EDITABLE) } } var f:File?=null @@ -291,9 +310,12 @@ class ActivityCapturePost : AppCompatActivity() { override fun onResponse(call: Call<PostPreview?>, response: Response<PostPreview?>) { if(response.isSuccessful()){ progressDialog!!.dismiss() - Toast.makeText( - applicationContext, "USPEH", Toast.LENGTH_LONG - ).show(); + val intent:Intent = Intent(this@ActivityCapturePost,ActivitySinglePost::class.java) + var b=Bundle() + b.putParcelable("selectedPost",response.body()) + intent.putExtras(b) + startActivity(intent) + finish() }else { progressDialog!!.dismiss() diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt index e1c2f80..edbec21 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt @@ -317,7 +317,8 @@ class ActivitySinglePost : AppCompatActivity() { binding.apply { tvTitle.text= post.location.name tvTitle.invalidate() - tvLocationType.text="TODO Click to open map" + tvLocationType.text="Otvorite Mapu" + tvLocationType.setTextColor(Color.BLUE) tvLocationType.invalidate() tvLocationParent.text="TODO" tvLocationParent.invalidate() 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 25ef88e..951cbb4 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 @@ -21,6 +21,7 @@ import com.example.brzodolokacije.chat.SignalRListener import com.example.brzodolokacije.databinding.ActivityChatBinding import retrofit2.Call import retrofit2.Response +import java.util.* class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener { @@ -83,9 +84,11 @@ class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener { if(!messages.isNullOrEmpty()){ var dbHelper= DBHelper.getInstance(this@ChatActivity) for( message in messages){ + var cal: Calendar = Calendar.getInstance() + cal.time=message.timestamp dbHelper.addMessage( Message(message.senderId+message.timestamp,message.senderId, - JWT(SharedPreferencesHelper.getValue("jwt",this@ChatActivity)!!).claims["id"]?.asString()!!,message.messagge,message.timestamp),false) + JWT(SharedPreferencesHelper.getValue("jwt",this@ChatActivity)!!).claims["id"]?.asString()!!,message.messagge,message.timestamp,cal),false) } } requestForChats() 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 b4722ea..19fd836 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 @@ -24,6 +24,7 @@ import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import retrofit2.Call import retrofit2.Response +import java.util.* class ChatActivityConversation : AppCompatActivity() { @@ -78,6 +79,9 @@ class ChatActivityConversation : AppCompatActivity() { if(response.isSuccessful()){ //zahtev da se posalje poruka var responseMessage=response.body() + var cal: Calendar = Calendar.getInstance() + cal.time=responseMessage?.timestamp + responseMessage?.usableTimeStamp=cal dbConnection?.addMessage(responseMessage!!) requestMessages() binding.etNewMessage.text?.clear() @@ -115,6 +119,9 @@ class ChatActivityConversation : AppCompatActivity() { if(response.isSuccessful()){ //zahtev da se posalje poruka var responseMessage=response.body() + var cal: Calendar = Calendar.getInstance() + cal.time=responseMessage?.timestamp + responseMessage?.usableTimeStamp=cal dbConnection?.addMessage(responseMessage!!) requestMessages() binding.etNewMessage.text?.clear() @@ -179,5 +186,6 @@ class ChatActivityConversation : AppCompatActivity() { } adapterVar= items?.let { ChatMessagesAdapter(it,this@ChatActivityConversation) } setRecyclerView(setParams = false) + dbConnection?.readContact(userId!!) } }
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/MapsActivity.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/MapsActivity.kt index fa3f06b..238c7e8 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/MapsActivity.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/MapsActivity.kt @@ -39,6 +39,7 @@ import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import org.osmdroid.views.Projection import org.osmdroid.views.overlay.ItemizedIconOverlay +import org.osmdroid.views.overlay.Marker import org.osmdroid.views.overlay.Overlay import org.osmdroid.views.overlay.OverlayItem import org.osmdroid.views.overlay.ScaleBarOverlay @@ -205,16 +206,49 @@ class MapsActivity : AppCompatActivity() { selectedLocation=responseLocations!!.find { location -> location.name==selected } Log.d("main",selectedLocation.toString()) confirmButton.visibility=View.VISIBLE + val locGeopoint=GeoPoint(selectedLocation!!.latitude,selectedLocation!!.longitude) + map!!.controller.animateTo(locGeopoint) + val marker = ContextCompat.getDrawable(this@MapsActivity, R.drawable.ic_baseline_add_location_24); + locLatitude=selectedLocation!!.latitude + locLongitude=selectedLocation!!.longitude + + + val overlayArray = ArrayList<OverlayItem>() + val mapItem = OverlayItem( + "", "", locGeopoint + ) + mapItem.setMarker(marker) + overlayArray.add(mapItem) + if (anotherItemizedIconOverlay == null) { + anotherItemizedIconOverlay = + ItemizedIconOverlay(applicationContext, overlayArray, null) + map!!.overlays.add(anotherItemizedIconOverlay) + map!!.invalidate() + } else { + map!!.overlays.remove(anotherItemizedIconOverlay) + map!!.invalidate() + anotherItemizedIconOverlay = + ItemizedIconOverlay(applicationContext, overlayArray, null) + map!!.overlays.add(anotherItemizedIconOverlay) + } + }) } + var anotherItemizedIconOverlay: ItemizedIconOverlay<OverlayItem>? = null fun returnValue(){ val intent = intent val bundle = Bundle() if(selectedLocation==null) return + if(selectedLocation!!.latitude!=locLatitude || selectedLocation!!.longitude!=locLongitude) + { + addLocation() + return + } bundle.putString("locationId",selectedLocation!!._id) + bundle.putString("name",selectedLocation!!.name) intent.putExtras(bundle) setResult(RESULT_OK, intent) finish() @@ -296,7 +330,7 @@ class MapsActivity : AppCompatActivity() { val touchOverlay: Overlay = object : Overlay(this) { - var anotherItemizedIconOverlay: ItemizedIconOverlay<OverlayItem>? = null + override fun onSingleTapConfirmed(e: MotionEvent, mapView: MapView): Boolean { val marker = ContextCompat.getDrawable(this@MapsActivity, R.drawable.ic_baseline_add_location_24); val proj: Projection = mapView.projection 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 index 45ffbf0..403b736 100644 --- 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 @@ -2,6 +2,7 @@ package com.example.brzodolokacije.Adapters import android.app.Activity import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.auth0.android.jwt.JWT @@ -9,6 +10,7 @@ import com.example.brzodolokacije.Models.Message import com.example.brzodolokacije.Services.SharedPreferencesHelper import com.example.brzodolokacije.databinding.ChatMessageBinding import com.example.brzodolokacije.databinding.ChatMessageOtherBinding +import java.util.* class ChatMessagesAdapter (val items : MutableList<Message>, val activity:Activity) : RecyclerView.Adapter<RecyclerView.ViewHolder>(){ @@ -49,6 +51,17 @@ class ChatMessagesAdapter (val items : MutableList<Message>, val activity:Activi fun bind(item : Message){ bindingOther?.apply { tvMessage?.text=item.messagge + tvTimestamp.text=item.usableTimeStamp.get(Calendar.HOUR_OF_DAY).toString() + ":" + item.usableTimeStamp.get(Calendar.MINUTE).toString() + if(layoutPosition==0 || isDifferentDays(items[layoutPosition].usableTimeStamp,items[layoutPosition-1].usableTimeStamp)){ + + tvDate.text=item.usableTimeStamp.get(Calendar.DAY_OF_MONTH).toString()+"/"+ + (item.usableTimeStamp.get(Calendar.MONTH)+1).toString()+"/"+ + item.usableTimeStamp.get(Calendar.YEAR).toString() + } + else{ + tvDate.visibility= View.GONE + tvDate.forceLayout() + } } } } @@ -56,10 +69,31 @@ class ChatMessagesAdapter (val items : MutableList<Message>, val activity:Activi fun bind(item : Message){ binding?.apply { tvMessage.text=item.messagge + tvTimestamp.text=item.usableTimeStamp.get(Calendar.HOUR_OF_DAY).toString() + ":" + item.usableTimeStamp.get(Calendar.MINUTE).toString() + if(layoutPosition==0 || isDifferentDays(items[layoutPosition].usableTimeStamp,items[layoutPosition-1].usableTimeStamp)){ + + tvDate.text=item.usableTimeStamp.get(Calendar.DAY_OF_MONTH).toString()+"/"+ + (item.usableTimeStamp.get(Calendar.MONTH)+1).toString()+"/"+ + item.usableTimeStamp.get(Calendar.YEAR).toString() + } + else{ + tvDate.visibility= View.GONE + tvDate.forceLayout() + } } } } + fun isDifferentDays(c1:Calendar,c2:Calendar):Boolean{ + if(c1.get(Calendar.DAY_OF_YEAR)!=c2.get(Calendar.DAY_OF_YEAR)){ + return true + } + else if(c1.get(Calendar.YEAR)!=c2.get(Calendar.YEAR)){ + return true + } + return false + } + override fun getItemViewType(position: Int): Int { var sender=items.get(position).senderId 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 index f875366..6e62180 100644 --- 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 @@ -1,11 +1,13 @@ package com.example.brzodolokacije.Adapters import android.content.Intent +import android.graphics.Typeface import android.view.LayoutInflater import android.view.ViewGroup import android.widget.Toast import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide +import com.exam.DBHelper import com.example.brzodolokacije.Activities.ChatActivity import com.example.brzodolokacije.Activities.ChatActivityConversation import com.example.brzodolokacije.Interfaces.IBackendApi @@ -25,6 +27,7 @@ class ChatPreviewsAdapter (val items : MutableList<ChatPreview>,val activity:Cha private var api: IBackendApi?=null private var token:String?=null private lateinit var binding: ChatPreviewBinding + private var db:DBHelper=DBHelper.getInstance(activity) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val inflater = LayoutInflater.from(parent.context) binding=ChatPreviewBinding.inflate(inflater,parent,false) @@ -39,6 +42,9 @@ class ChatPreviewsAdapter (val items : MutableList<ChatPreview>,val activity:Cha val intent: Intent = Intent(activity, ChatActivityConversation::class.java) intent.putExtra("userId",items[position].userId) intent.putExtra("username",holder.itemView.tvUsername.text) + db.readContact(items[position].userId) + items[position].read=true + holder.itemView.tvUsername.typeface= Typeface.DEFAULT activity.startActivity(intent) } } @@ -54,6 +60,8 @@ class ChatPreviewsAdapter (val items : MutableList<ChatPreview>,val activity:Cha if(response.isSuccessful()){ //zahtev da se posalje poruka var user=response.body()!! + if(!item.read) + tvUsername.typeface= Typeface.DEFAULT_BOLD tvUsername.text=user.username if(user.pfp!=null) { Glide.with(activity) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostHistoryAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostHistoryAdapter.kt index db3fc2e..79f0af2 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostHistoryAdapter.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostHistoryAdapter.kt @@ -13,6 +13,7 @@ import com.example.brzodolokacije.Models.PostPreview import com.example.brzodolokacije.Services.RetrofitHelper import com.example.brzodolokacije.Services.SharedPreferencesHelper import com.example.brzodolokacije.databinding.SinglePostHistoryBinding +import java.text.SimpleDateFormat class PostHistoryAdapter (val activity:Activity,val items : MutableList<PostPreview>) @@ -39,7 +40,7 @@ class PostHistoryAdapter (val activity:Activity,val items : MutableList<PostPrev fun bind(item: PostPreview) { binding.apply { tvTitleSinglePostHistory.text = item.location.name - tvLocationParentSinglePostHistory.text = "22.11.2022" + tvLocationParentSinglePostHistory.text = SimpleDateFormat("dd/MM/yyyy").format(item.lastViewed) tvLocationTypeSinglePostHistory.text = item.location.country } 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 3404541..6725c15 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 @@ -18,7 +18,8 @@ data class Message( var senderId: String, var receiverId: String, var messagge: String, - var timestamp: Date + var timestamp: Date, + var usableTimeStamp:Calendar ) data class ChatPreview( 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 191df3c..a3d5a13 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 @@ -41,7 +41,7 @@ class DBHelper : if(!doesTableExist(CONTACTS_TABLE_NAME,db)){ var sql:String="CREATE TABLE "+ CONTACTS_TABLE_NAME+" (" + "userId " +"TEXT PRIMARY KEY,"+ - "read " +"INT"+ + "read " +"INTEGER"+ ")" db?.execSQL(sql) } @@ -51,7 +51,7 @@ class DBHelper : "senderId " +"TEXT,"+ "receiverId "+"TEXT,"+ "messagge " +"TEXT,"+ - "timestamp "+"TEXT"+ + "timestamp "+"INTEGER"+ ")" db?.execSQL(sql) } @@ -88,8 +88,8 @@ class DBHelper : var sql="INSERT INTO "+ MESSAGES_TABLE_NAME+"(_id,senderId,receiverid,messagge,timestamp) VALUES('"+message._id+"','"+ message.senderId+"','"+ message.receiverId+"','"+ - message.messagge+ "','"+ - message.timestamp+ "')" + message.messagge+ "',"+ + message.usableTimeStamp.timeInMillis+")" db?.execSQL(sql) if(sent) sql="SELECT * FROM "+ CONTACTS_TABLE_NAME+" WHERE userId='"+message.receiverId+"'" @@ -105,15 +105,19 @@ class DBHelper : read+"')" db?.execSQL(sql) } + else{ + if(!sent) + unreadContact(message.senderId) + } } } fun getMessages(userId:String, self:Boolean=false): MutableList<Message>? { onCreate(db) var sql:String if(!self) - sql="SELECT * FROM "+ MESSAGES_TABLE_NAME+" WHERE senderId='"+userId+"' OR receiverId='"+userId+"'" + sql="SELECT * FROM "+ MESSAGES_TABLE_NAME+" WHERE senderId='"+userId+"' OR receiverId='"+userId+"' ORDER BY timestamp ASC" else - sql="SELECT * FROM "+ MESSAGES_TABLE_NAME+" WHERE senderId='"+userId+"' AND receiverId='"+userId+"'" + sql="SELECT * FROM "+ MESSAGES_TABLE_NAME+" WHERE senderId='"+userId+"' AND receiverId='"+userId+"' ORDER BY timestamp ASC" var cursor=db?.rawQuery(sql,null) if(cursor?.count!! >0){ var messagesList:MutableList<Message> =mutableListOf() @@ -123,17 +127,21 @@ class DBHelper : var messageIndex=cursor.getColumnIndexOrThrow("messagge") var timestampIndex=cursor.getColumnIndexOrThrow("timestamp") while(cursor.moveToNext()){ + var cal:Calendar= Calendar.getInstance() + cal.timeInMillis=cursor.getLong(timestampIndex) messagesList.add( Message( cursor.getString(idIndex), cursor.getString(senderIdIndex), cursor.getString(receiverIdIndex), cursor.getString(messageIndex), - Date() + cal.time, + cal ) ) + Log.d("main",cal.time.toString()) } - Log.d("main",messagesList.size.toString()) + readContact(userId) return messagesList } return null @@ -162,4 +170,13 @@ class DBHelper : sql="DROP TABLE IF EXISTS "+ MESSAGES_TABLE_NAME db?.execSQL(sql) } + + fun readContact(userId: String){ + var sql="UPDATE "+ CONTACTS_TABLE_NAME+" SET read=1 WHERE userId='"+userId+"'" + db?.execSQL(sql) + } + fun unreadContact(userId: String){ + var sql="UPDATE "+ CONTACTS_TABLE_NAME+" SET read=0 WHERE userId='"+userId+"'" + db?.execSQL(sql) + } }
\ 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 4b16f25..39689c7 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 @@ -14,6 +14,7 @@ import com.microsoft.signalr.Action1 import com.microsoft.signalr.HubConnection import com.microsoft.signalr.HubConnectionBuilder import com.microsoft.signalr.HubConnectionState +import java.util.* class SignalRListener private constructor(val activity: Activity){ @@ -62,8 +63,10 @@ class SignalRListener private constructor(val activity: Activity){ } fun addToDbAndloadMessageIfInChat(message:MessageReceive,activity: Activity){ + var cal:Calendar= Calendar.getInstance() + cal.time=message.timestamp dbHelper.addMessage(Message(message.senderId+message.timestamp,message.senderId, - JWT(SharedPreferencesHelper.getValue("jwt",activity)!!).claims["id"]?.asString()!!,message.messagge,message.timestamp),false) + JWT(SharedPreferencesHelper.getValue("jwt",activity)!!).claims["id"]?.asString()!!,message.messagge,message.timestamp,cal),false) if(activity is ChatActivity){ if(activity.clickedChat?.userId==message.senderId){ activity.clickedChat?.requestMessages() diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_add_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_add_post.xml index 8e3fbb4..405c221 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_add_post.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_add_post.xml @@ -73,6 +73,16 @@ app:layout_constraintHorizontal_bias="0.074" app:layout_constraintStart_toStartOf="parent" /> + <EditText + android:id="@+id/etActivityAddPostLocationText" + android:layout_width="wrap_content" + android:layout_height="50dp" + android:ems="10" + android:enabled="false" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="@+id/btnActivityAddPostAddLocation" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/btnActivityAddPostAddLocation" /> <Button android:id="@+id/tvActivityAddPostDescriptiontext" android:layout_width="wrap_content" diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_capture_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_capture_post.xml index e93fd54..cb2c8dc 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_capture_post.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_capture_post.xml @@ -50,6 +50,16 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.092" app:layout_constraintStart_toStartOf="parent" /> + <EditText + android:id="@+id/etActivityAddPostLocationText" + android:layout_width="wrap_content" + android:layout_height="50dp" + android:ems="10" + android:enabled="false" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="@+id/btnActivityCapturePostAddLocation" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/btnActivityCapturePostAddLocation" /> <Button android:id="@+id/tvActivityCapturePostDescriptiontext" diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message.xml index 57269e7..7858e94 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message.xml @@ -1,29 +1,78 @@ <?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" xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/clMessage" android:layout_margin="@dimen/text_padding" + android:layout_height="wrap_content" + android:layout_width="wrap_content" android:layout_gravity="end"> <androidx.cardview.widget.CardView - android:elevation="5dp" + android:id="@+id/cardView" android:layout_width="wrap_content" android:layout_height="30dp" android:backgroundTint="@color/unfollow" + android:elevation="5dp" app:cardCornerRadius="15dp" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintTop_toTopOf="parent" /> + + + <com.google.android.material.textview.MaterialTextView + + android:id="@+id/tvMessage" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="16dp" + android:background="@drawable/view_corner_radius" + android:backgroundTint="@color/unfollow" + android:padding="5dp" + android:text="blabla" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <TextView + android:id="@+id/tvDate" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="32dp" + android:paddingStart="8dp" + android:paddingTop="4dp" + android:paddingEnd="8dp" + android:paddingBottom="4dp" + android:text="June 10" + android:textColor="#C0C0C0" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <androidx.cardview.widget.CardView + android:id="@+id/cvContainer" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + app:cardBackgroundColor="@color/dark_blue_transparent" + app:cardCornerRadius="12dp" + app:cardElevation="0dp" + app:cardPreventCornerOverlap="false" + app:cardUseCompatPadding="true" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@id/tvDate"> + + - <com.google.android.material.textview.MaterialTextView - android:id="@+id/tvMessage" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:padding="5dp" - android:text="blabla" - /> </androidx.cardview.widget.CardView> + <TextView + android:id="@+id/tvTimestamp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="10:00" + android:textColor="#C0C0C0" + android:textSize="10sp" + app:layout_constraintBottom_toBottomOf="@+id/cvContainer" + app:layout_constraintEnd_toStartOf="@+id/cvContainer" /> + + </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message_other.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message_other.xml index 56dc09c..aaabd86 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message_other.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message_other.xml @@ -1,25 +1,78 @@ <?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:id="@+id/clMessage" android:layout_width="wrap_content" - android:layout_height="35dp"> - > + android:layout_height="wrap_content" + + android:layout_marginStart="8dp" + android:layout_marginTop="16dp"> + + <TextView + android:id="@+id/tvDate" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="32dp" + android:elevation="10dp" + + android:paddingTop="4dp" + android:paddingEnd="8dp" + android:paddingBottom="4dp" + android:text="June 10" + android:textColor="#C0C0C0" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> <androidx.cardview.widget.CardView + android:id="@+id/cvContainer" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_margin="5dp" android:elevation="5dp" - app:cardCornerRadius="15dp" + app:cardCornerRadius="10dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - <TextView - android:id="@+id/tvMessage" + + + <LinearLayout + android:id="@+id/llContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:padding="5dp" - android:text="blabla" /> + android:orientation="vertical"> + <TextView + android:id="@+id/tvMessage" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="5dp" + android:text="blabla" + app:cardBackgroundColor="#eef1f6" + app:cardCornerRadius="12dp" + app:cardElevation="0dp" + app:cardPreventCornerOverlap="false" + app:cardUseCompatPadding="true" + app:layout_constraintTop_toBottomOf="@+id/tvDate"/> + + </LinearLayout> + </androidx.cardview.widget.CardView> + + + <TextView + android:id="@+id/tvTimestamp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="4dp" + android:layout_marginTop="-5dp" + android:text="8:00" + android:textColor="#C0C0C0" + android:textSize="10sp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tvDate" /> + + </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file |