diff options
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  | 
