From ba4d5af2e85121fbd71a5b3f9a50d15e55ebe274 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Tue, 29 Nov 2022 22:16:46 +0100 Subject: Ispravljen back button. --- .../Activities/ActivityShowFollowersAndFollowing.kt | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowFollowersAndFollowing.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowFollowersAndFollowing.kt index fe0d546..4cc662e 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowFollowersAndFollowing.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowFollowersAndFollowing.kt @@ -62,27 +62,8 @@ class ActivityShowFollowersAndFollowing : AppCompatActivity() { } back.setOnClickListener { - var token= SharedPreferencesHelper.getValue("jwt", this).toString() - val api= RetrofitHelper.getInstance() - val request= api.getProfileFromId("Bearer " + token, userId) - request.enqueue(object : retrofit2.Callback { - override fun onResponse(call: Call, - response: Response - ) { - if (response.body() == null) { - return - } - var userData = response.body()!! - val intent: Intent = Intent(this@ActivityShowFollowersAndFollowing,ActivityUserProfile::class.java) - var b= Bundle() - intent.putExtra("user", Gson().toJson(userData)) - startActivity(intent) - } + finish() - override fun onFailure(call: Call, t: Throwable) { - - } - }) } -- cgit v1.2.3 From 71bfced6c95b79399fc1faf0adfd0af9f87edcd1 Mon Sep 17 00:00:00 2001 From: Jelena Petrovic Date: Fri, 2 Dec 2022 01:28:21 +0100 Subject: Omoguceno ugnjezdeno komentarisanje #67 --- .../Activities/ActivitySinglePost.kt | 31 ++++--- .../brzodolokacije/Adapters/CommentsAdapter.kt | 95 ++++++++++++++++++++- .../app/src/main/res/drawable/reply.png | Bin 0 -> 4690 bytes .../app/src/main/res/layout/single_comment.xml | 74 +++++++++++++--- 4 files changed, 174 insertions(+), 26 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/reply.png (limited to 'Client') 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 edbec21..f3d8a63 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 @@ -3,12 +3,9 @@ package com.example.brzodolokacije.Activities import android.content.Intent import android.graphics.Color import android.graphics.drawable.ColorDrawable -import android.media.Image import android.os.Bundle import android.preference.PreferenceManager -import android.provider.ContactsContract.CommonDataKinds.Im import android.util.Log -import android.widget.ImageButton import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity @@ -24,7 +21,6 @@ import com.example.brzodolokacije.Services.SharedPreferencesHelper import com.example.brzodolokacije.databinding.ActivitySinglePostBinding import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.gson.Gson -import okhttp3.ResponseBody import org.osmdroid.config.Configuration import org.osmdroid.tileprovider.tilesource.TileSourceFactory import org.osmdroid.util.GeoPoint @@ -42,7 +38,7 @@ class ActivitySinglePost : AppCompatActivity() { private var adapterComments: RecyclerView.Adapter? = null private var recyclerViewImages: RecyclerView?=null private var recyclerViewComments: RecyclerView?=null - private lateinit var post:PostPreview + public lateinit var post:PostPreview private var comments:MutableList?=mutableListOf() private var starNumber:Number=0 private lateinit var userData:UserReceive @@ -114,9 +110,9 @@ class ActivitySinglePost : AppCompatActivity() { fun buildRecyclerViewComments(){ recyclerViewComments=binding.rvComments - adapterComments=CommentsAdapter(comments as MutableList) + adapterComments=CommentsAdapter(comments as MutableList,this@ActivitySinglePost) layoutManagerComments= LinearLayoutManager(this@ActivitySinglePost,LinearLayoutManager.VERTICAL,false) - recyclerViewComments!!.setHasFixedSize(true) + recyclerViewComments!!.setHasFixedSize(false) recyclerViewComments!!.layoutManager=layoutManagerComments recyclerViewComments!!.adapter= adapterComments } @@ -245,9 +241,9 @@ class ActivitySinglePost : AppCompatActivity() { if(comments!=null && comments!!.isNotEmpty()){ buildRecyclerViewComments() if(comments!=null) - binding.tvCommentCount.text=comments?.size.toString() + binding.tvCommentCount.text=countComments(comments!!).toString() else - binding.tvCommentCount.text="0" + binding.tvCommentCount.text="12" } }else{ if(response.errorBody()!=null) @@ -265,8 +261,7 @@ class ActivitySinglePost : AppCompatActivity() { else{ (adapterComments as CommentsAdapter).items.add(0,newComment) recyclerViewComments?.adapter=adapterComments - Log.d("main",newComment.username) - binding.tvCommentCount.text=comments?.size.toString() + addedComment() } } @@ -368,4 +363,18 @@ class ActivitySinglePost : AppCompatActivity() { } }) } + fun countComments(comments:List):Int{ + var count:Int=0 + for(c in comments){ + if(c.replies!=null) + count=count+countComments(c.replies!!) + count=count+1 + } + return count + } + + public fun addedComment(){ + binding.tvCommentCount.text=(Integer.parseInt(binding.tvCommentCount.text.toString())+1).toString() + binding.tvCommentCount.invalidate() + } } diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt index d43057f..06713ec 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt @@ -1,12 +1,26 @@ package com.example.brzodolokacije.Adapters +import android.app.Activity +import android.content.Context +import android.util.Log import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup +import android.view.inputmethod.InputMethodManager +import android.widget.EditText +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Activities.ActivitySinglePost +import com.example.brzodolokacije.Models.CommentReceive import com.example.brzodolokacije.Models.CommentSend +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper import com.example.brzodolokacije.databinding.SingleCommentBinding +import retrofit2.Call +import retrofit2.Response -class CommentsAdapter (val items : MutableList) +class CommentsAdapter (val items : MutableList,val activity: Activity) : RecyclerView.Adapter(){ //constructer has one argument - list of objects that need to be displayed //it is bound to xml of single item @@ -32,7 +46,86 @@ class CommentsAdapter (val items : MutableList) binding.apply { tvCommentAuthor.text=item.username tvCommentText.text=item.comment + etReply.visibility= View.GONE + etReply.forceLayout() + etReply.showSoftInputOnFocus=true + etReply.setOnFocusChangeListener { _, focused -> + if(!focused){ + etReply.visibility= View.GONE + etReply.forceLayout() + btnReply.setImageResource(R.drawable.reply) + hideKeyboard(etReply) + } + else{ + showKeyboard(etReply) + btnReply.setImageResource(R.drawable.post_comment) + btnReply.setOnClickListener{ + if(etReply.text.isNotEmpty()){ + val postId=(activity as ActivitySinglePost).post._id + val comment= CommentReceive(etReply.text.toString(),item._id) + requestAddComment(binding,comment,postId) + } + else{ + Log.d("komentari","greska") + } + } + } + } + btnReply.setOnClickListener { + etReply.visibility=View.VISIBLE + etReply.forceLayout() + etReply.requestFocus() + } + + var rv: RecyclerView = rvReplies + rv.setHasFixedSize(false) + rv.layoutManager=LinearLayoutManager(activity,LinearLayoutManager.VERTICAL,false) + if(item.replies!=null) + rv.adapter=CommentsAdapter(item.replies as MutableList,activity) + else + rv.adapter=CommentsAdapter(mutableListOf(),activity) } } + fun showKeyboard(item:EditText){ + var imm:InputMethodManager=activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.showSoftInput(item,InputMethodManager.SHOW_FORCED) + } + + fun hideKeyboard(item: EditText){ + var imm:InputMethodManager=activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(item.windowToken,InputMethodManager.HIDE_IMPLICIT_ONLY) + } + fun requestAddComment(binding:SingleCommentBinding,comment:CommentReceive,postId:String){ + val postApi= RetrofitHelper.getInstance() + val token= SharedPreferencesHelper.getValue("jwt", activity) + val request=postApi.addComment("Bearer "+token,postId,comment) + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful){ + var newComment=response.body()!! + requestGetComments(binding,newComment) + binding.etReply.text.clear() + hideKeyboard(binding.etReply) + }else{ + if(response.errorBody()!=null) + Log.d("main1",response.message().toString()) + } + + + } + + override fun onFailure(call: Call, t: Throwable) { + Log.d("main2",t.message.toString()) + } + }) + } + + private fun requestGetComments(binding:SingleCommentBinding,newComment: CommentSend) { + var rv: RecyclerView = binding.rvReplies + var adapter:CommentsAdapter=rv.adapter as CommentsAdapter + adapter.items.add(0,newComment) + rv.adapter=adapter + (activity as ActivitySinglePost).addedComment() + } } } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/reply.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/reply.png new file mode 100644 index 0000000..0c1071b Binary files /dev/null and b/Client/BrzoDoLokacije/app/src/main/res/drawable/reply.png differ diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml index f219ea2..51d9079 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml @@ -1,22 +1,68 @@ - - + + - + android:orientation="vertical" + android:layout_weight="1"> + + + + + + + + + + + - \ No newline at end of file + \ No newline at end of file -- cgit v1.2.3 From eb024ae9f03eb9720a8745174eef53246ee02b03 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sat, 3 Dec 2022 20:17:27 +0100 Subject: Napravljen upit sa clienta ka backu za dodavanje favourite. Omogucen prikaz i dodavanje/brisanje favourite. --- Backend/Api/Api/Models/Post.cs | 4 +- Backend/Api/Api/Services/PostService.cs | 11 +++--- .../Activities/ActivitySinglePost.kt | 43 +++++++++++++++++++++- .../brzodolokacije/Interfaces/IBackendApi.kt | 2 + .../java/com/example/brzodolokacije/Models/Post.kt | 3 +- .../main/res/drawable/ic_baseline_favorite_24.xml | 5 +++ .../drawable/ic_baseline_favorite_border_24.xml | 5 +++ .../src/main/res/layout/activity_single_post.xml | 13 +++++++ 8 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_24.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_border_24.xml (limited to 'Client') diff --git a/Backend/Api/Api/Models/Post.cs b/Backend/Api/Api/Models/Post.cs index dbe7952..22ed62e 100644 --- a/Backend/Api/Api/Models/Post.cs +++ b/Backend/Api/Api/Models/Post.cs @@ -19,7 +19,7 @@ namespace Api.Models public List comments { get; set; } public List images { get; set; } public List? tags { get; set; } - public List? favorites { get; set; } + public List? favourites { get; set; } } public class PostReceive @@ -44,7 +44,7 @@ namespace Api.Models public List images { get; set; } public List? tags { get; set; } public DateTime? lastViewed { get; set; } - public List? favorites { get; set; } + public List? favourites { get; set; } } public class Rating { diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index 17c96e3..fd42d08 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -89,6 +89,7 @@ namespace Api.Services p.createdAt = post.createdAt; p.tags = post.tags; p.ratingscount = post.ratings.Count(); + p.favourites = post.favourites; if (post.ratings.Count() > 0) { List ratings = new List(); @@ -537,16 +538,16 @@ namespace Api.Services Post post = await _posts.Find(x => x._id == postId).FirstOrDefaultAsync(); if (userId == null || post==null) return result; - if (post.favorites == null) - post.favorites = new List(); - if (post.favorites.Contains(userId)) + if (post.favourites == null) + post.favourites = new List(); + if (post.favourites.Contains(userId)) { - post.favorites.Remove(userId); + post.favourites.Remove(userId); result = false; } else { - post.favorites.Add(userId); + post.favourites.Add(userId); result = true; } 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 f3d8a63..5f99766 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 @@ -6,12 +6,14 @@ import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.preference.PreferenceManager import android.util.Log +import android.widget.ImageView import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.auth0.android.jwt.JWT import com.example.brzodolokacije.Adapters.CommentsAdapter import com.example.brzodolokacije.Adapters.PostImageAdapter import com.example.brzodolokacije.Models.* @@ -38,6 +40,7 @@ class ActivitySinglePost : AppCompatActivity() { private var adapterComments: RecyclerView.Adapter? = null private var recyclerViewImages: RecyclerView?=null private var recyclerViewComments: RecyclerView?=null + private var favouriteImage:ImageView?=null public lateinit var post:PostPreview private var comments:MutableList?=mutableListOf() private var starNumber:Number=0 @@ -56,7 +59,7 @@ class ActivitySinglePost : AppCompatActivity() { recyclerViewImages = binding.rvMain buildRecyclerViewComments() requestGetComments() - + favouriteImage=binding.ivFavourite // set recyclerView attributes recyclerViewImages?.setHasFixedSize(true) recyclerViewImages?.layoutManager = layoutManagerImages @@ -64,7 +67,7 @@ class ActivitySinglePost : AppCompatActivity() { loadTextComponents() setRatingListeners() translateOwnerIdToName(post.ownerId) - + loadFavourite() val alreadyrated= RatingReceive(starNumber.toInt(),post._id) requestAddRating(alreadyrated) @@ -78,6 +81,42 @@ class ActivitySinglePost : AppCompatActivity() { getMap() } + favouriteImage!!.setOnClickListener{ + addRemoveFavourite() + } + } + fun loadFavourite(){ + if(post.favourites!=null){ + var jwtString=SharedPreferencesHelper.getValue("jwt",this) + var jwt: JWT = JWT(jwtString!!) + var userId=jwt.getClaim("id").asString() + if(post.favourites!!.contains(userId)) + { + favouriteImage!!.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_baseline_favorite_24)) + }else{ + favouriteImage!!.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_baseline_favorite_border_24)); + + } + + } + } + fun addRemoveFavourite(){ + var token= SharedPreferencesHelper.getValue("jwt", this).toString() + val Api= RetrofitHelper.getInstance() + val request=Api.addRemoveFavourite("Bearer "+token,post._id) + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful && response.body() == true) + favouriteImage!!.setImageDrawable(ContextCompat.getDrawable(this@ActivitySinglePost, R.drawable.ic_baseline_favorite_24)) + else + favouriteImage!!.setImageDrawable(ContextCompat.getDrawable(this@ActivitySinglePost, R.drawable.ic_baseline_favorite_border_24)); + } + + override fun onFailure(call: Call, t: Throwable) { + + } + }) + } fun getMap(){ val mapDialogue = BottomSheetDialog(this@ActivitySinglePost, android.R.style.Theme_Black_NoTitleBar) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt index 676023f..60f243d 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt @@ -109,5 +109,7 @@ interface IBackendApi { @GET("/api/user/{id}/myFollowers") fun getMyFollowers(@Header("Authorization") authHeader:String):Call > + @GET("/api/Post/favourite/{id}") + fun addRemoveFavourite(@Header("Authorization") authHeader:String,@Path("id") id:String):Call } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt index f0f67a7..8f07bca 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt @@ -39,7 +39,8 @@ data class PostPreview ( var ratingscount:Int, var createdAt:Date, var lastViewed: Date?, //samo za istoriju pregleda - var tags:List? + var tags:List?, + var favourites:List? //nedostaju datum i vreme kreiranja diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_24.xml new file mode 100644 index 0000000..84df34b --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_border_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_border_24.xml new file mode 100644 index 0000000..4c07189 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_border_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml index e3cabb5..e07345b 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml @@ -76,6 +76,19 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tvLocationParent" /> + + Date: Sun, 4 Dec 2022 01:28:02 +0100 Subject: Ucitavaju se slike korisnika, onemogucen odgovor na odgovor, resen problem dodavanja odgovora na pogresan komentar #67 --- .../Activities/ActivitySinglePost.kt | 8 ++ .../brzodolokacije/Adapters/CommentsAdapter.kt | 99 +++++++++++++----- .../src/main/res/layout/activity_single_post.xml | 11 +- .../app/src/main/res/layout/single_comment.xml | 111 ++++++++++++--------- 4 files changed, 154 insertions(+), 75 deletions(-) (limited to 'Client') 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 5f99766..c9ed2f7 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 @@ -1,11 +1,14 @@ package com.example.brzodolokacije.Activities +import android.content.Context import android.content.Intent import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.preference.PreferenceManager import android.util.Log +import android.view.inputmethod.InputMethodManager +import android.widget.EditText import android.widget.ImageView import android.widget.TextView import android.widget.Toast @@ -155,6 +158,10 @@ class ActivitySinglePost : AppCompatActivity() { recyclerViewComments!!.layoutManager=layoutManagerComments recyclerViewComments!!.adapter= adapterComments } + fun hideKeyboard(item: EditText){ + var imm: InputMethodManager =this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(item.windowToken, InputMethodManager.HIDE_NOT_ALWAYS) + } fun setRatingListeners() { val emptyStar = R.drawable.empty_star @@ -255,6 +262,7 @@ class ActivitySinglePost : AppCompatActivity() { var newComment=response.body()!! requestGetComments(newComment) binding.NewComment.text.clear() + hideKeyboard(binding.NewComment) }else{ if(response.errorBody()!=null) Log.d("main1",response.message().toString()) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt index 06713ec..731566f 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt @@ -8,15 +8,19 @@ import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import android.widget.EditText +import android.widget.Toast import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide import com.example.brzodolokacije.Activities.ActivitySinglePost +import com.example.brzodolokacije.Interfaces.IBackendApi import com.example.brzodolokacije.Models.CommentReceive import com.example.brzodolokacije.Models.CommentSend -import com.example.brzodolokacije.R +import com.example.brzodolokacije.Models.UserReceive import com.example.brzodolokacije.Services.RetrofitHelper import com.example.brzodolokacije.Services.SharedPreferencesHelper import com.example.brzodolokacije.databinding.SingleCommentBinding +import kotlinx.android.synthetic.main.single_comment.view.* import retrofit2.Call import retrofit2.Response @@ -24,10 +28,14 @@ class CommentsAdapter (val items : MutableList,val activity: Activi : RecyclerView.Adapter(){ //constructer has one argument - list of objects that need to be displayed //it is bound to xml of single item + private var api: IBackendApi?=null + private var token:String?=null private lateinit var binding: SingleCommentBinding override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val inflater = LayoutInflater.from(parent.context) binding=SingleCommentBinding.inflate(inflater,parent,false) + api=RetrofitHelper.getInstance() + token=SharedPreferencesHelper.getValue("jwt",activity) return ViewHolder(binding) } override fun onBindViewHolder(holder: ViewHolder, position: Int){ @@ -46,24 +54,37 @@ class CommentsAdapter (val items : MutableList,val activity: Activi binding.apply { tvCommentAuthor.text=item.username tvCommentText.text=item.comment - etReply.visibility= View.GONE - etReply.forceLayout() + Log.d("info",tvCommentText.text.toString()+binding.toString()) + requestProfilePic(item) + llReply.visibility=View.GONE + llReply.forceLayout() + if(item.parentId!=""){ + btnReply.visibility=View.GONE + btnReply.forceLayout() + } + else{ + btnReply.setOnClickListener { + llReply.visibility=View.VISIBLE + llReply.forceLayout() + etReply.requestFocus() + } + } etReply.showSoftInputOnFocus=true etReply.setOnFocusChangeListener { _, focused -> if(!focused){ - etReply.visibility= View.GONE - etReply.forceLayout() - btnReply.setImageResource(R.drawable.reply) + llReply.visibility= View.GONE + llReply.forceLayout() + //btnReply.setImageResource(R.drawable.) hideKeyboard(etReply) } else{ showKeyboard(etReply) - btnReply.setImageResource(R.drawable.post_comment) - btnReply.setOnClickListener{ + btnPostReply.setOnClickListener{ if(etReply.text.isNotEmpty()){ val postId=(activity as ActivitySinglePost).post._id + Log.d("main",binding.toString()) val comment= CommentReceive(etReply.text.toString(),item._id) - requestAddComment(binding,comment,postId) + requestAddComment(comment,postId) } else{ Log.d("komentari","greska") @@ -71,14 +92,10 @@ class CommentsAdapter (val items : MutableList,val activity: Activi } } } - btnReply.setOnClickListener { - etReply.visibility=View.VISIBLE - etReply.forceLayout() - etReply.requestFocus() - } + var rv: RecyclerView = rvReplies - rv.setHasFixedSize(false) + rv.setHasFixedSize(true) rv.layoutManager=LinearLayoutManager(activity,LinearLayoutManager.VERTICAL,false) if(item.replies!=null) rv.adapter=CommentsAdapter(item.replies as MutableList,activity) @@ -88,14 +105,14 @@ class CommentsAdapter (val items : MutableList,val activity: Activi } fun showKeyboard(item:EditText){ var imm:InputMethodManager=activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.showSoftInput(item,InputMethodManager.SHOW_FORCED) + imm.showSoftInput(item,InputMethodManager.SHOW_IMPLICIT) } fun hideKeyboard(item: EditText){ var imm:InputMethodManager=activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.hideSoftInputFromWindow(item.windowToken,InputMethodManager.HIDE_IMPLICIT_ONLY) + imm.hideSoftInputFromWindow(item.windowToken,InputMethodManager.HIDE_NOT_ALWAYS) } - fun requestAddComment(binding:SingleCommentBinding,comment:CommentReceive,postId:String){ + fun requestAddComment(comment:CommentReceive,postId:String){ val postApi= RetrofitHelper.getInstance() val token= SharedPreferencesHelper.getValue("jwt", activity) val request=postApi.addComment("Bearer "+token,postId,comment) @@ -103,9 +120,10 @@ class CommentsAdapter (val items : MutableList,val activity: Activi override fun onResponse(call: Call, response: Response) { if(response.isSuccessful){ var newComment=response.body()!! - requestGetComments(binding,newComment) - binding.etReply.text.clear() - hideKeyboard(binding.etReply) + requestGetComments(newComment) + itemView.etReply.text.clear() + hideKeyboard(itemView.etReply) + itemView.etReply.clearFocus() }else{ if(response.errorBody()!=null) Log.d("main1",response.message().toString()) @@ -120,12 +138,47 @@ class CommentsAdapter (val items : MutableList,val activity: Activi }) } - private fun requestGetComments(binding:SingleCommentBinding,newComment: CommentSend) { - var rv: RecyclerView = binding.rvReplies + private fun requestGetComments(newComment: CommentSend) { + var rv: RecyclerView = itemView.rvReplies var adapter:CommentsAdapter=rv.adapter as CommentsAdapter adapter.items.add(0,newComment) rv.adapter=adapter (activity as ActivitySinglePost).addedComment() } + + private fun requestProfilePic(item:CommentSend){ + val request2=api?.getProfileFromId("Bearer "+token, + item.userId + ) + request2?.enqueue(object : retrofit2.Callback { + override fun onResponse( + call: Call, + response: Response + ) { + if (response.isSuccessful) { + var user = response.body()!! + if (user.pfp != null) { + Glide.with(activity) + .load(RetrofitHelper.baseUrl + "/api/post/image/compress/" + user.pfp!!._id) + .circleCrop() + .into(itemView.ivPfp) + } + } else { + Toast.makeText( + activity, "los id", + Toast.LENGTH_LONG + ).show() + itemView.tvCommentAuthor.text = "nije nadjen korisnik" + } + } + + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText( + activity, "neuspesan zahtev", + Toast.LENGTH_LONG + ).show() + } + }) + } } } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml index e07345b..3824f69 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml @@ -5,17 +5,17 @@ xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="wrap_content" android:padding="@dimen/component_padding" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".Activities.ActivitySinglePost"> - + android:layout_height="wrap_content"> @@ -310,7 +309,7 @@ @@ -319,5 +318,5 @@ - + diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml index 51d9079..5e0dc03 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml @@ -3,66 +3,85 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + android:orientation="vertical" android:padding="@dimen/component_padding" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - + android:orientation="horizontal"> - + + android:orientation="vertical" + android:layout_weight="1"> - - - + - + android:padding="@dimen/text_padding" + app:layout_constraintTop_toBottomOf="@id/tvCommentAuthor" + tools:layout_editor_absoluteX="54dp" /> + - + + + + + + + + android:layout_weight="1" + android:id="@+id/etReply" + android:hint="odgovor na komentar"/> + + \ No newline at end of file -- cgit v1.2.3 From 8d19b8ebd9690808e7e8fb481fb5f3e947034823 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sun, 4 Dec 2022 20:56:53 +0100 Subject: Omogucena pretraga lokacija i prikaz objava za datu lokaciju. --- .../brzodolokacije/Fragments/FragmentShowPosts.kt | 76 ++++++++++++++++++++-- .../src/main/res/layout/fragment_show_posts.xml | 5 +- 2 files changed, 74 insertions(+), 7 deletions(-) (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt index a840d6b..f5b4b58 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt @@ -6,10 +6,9 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button -import android.widget.EditText -import android.widget.ImageButton -import android.widget.Toast +import android.widget.* +import androidx.core.content.ContextCompat +import androidx.core.widget.addTextChangedListener import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -20,9 +19,11 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.example.brzodolokacije.Activities.ActivityAddPost import com.example.brzodolokacije.Activities.ChatActivity import com.example.brzodolokacije.Adapters.ShowPostsAdapter +import com.example.brzodolokacije.Models.Location import com.example.brzodolokacije.Models.SearchParams import com.example.brzodolokacije.R import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper import com.example.brzodolokacije.databinding.FragmentShowPostsBinding import com.example.brzodolokacije.paging.SearchPostsViewModel import com.example.brzodolokacije.paging.SearchPostsViewModelFactory @@ -31,6 +32,11 @@ import kotlinx.android.synthetic.main.fragment_show_posts.* import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch +import org.osmdroid.util.GeoPoint +import org.osmdroid.views.overlay.ItemizedIconOverlay +import org.osmdroid.views.overlay.OverlayItem +import retrofit2.Call +import retrofit2.Response class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { @@ -42,20 +48,75 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { private var gridManagerVar: RecyclerView.LayoutManager?=null private var swipeRefreshLayout:SwipeRefreshLayout?=null private lateinit var searchPostsViewModel:SearchPostsViewModel - private var searchParams:SearchParams?= SearchParams("6375784fe84e2d53df32bf03",1,1) + private var searchParams:SearchParams?= SearchParams("6385b79d7e1a2c93575e1ef1",1,1) private lateinit var btnFilter:ImageButton private lateinit var btnSort:ImageButton + private lateinit var searchBar: AutoCompleteTextView + var responseLocations:MutableList?=null + var selectedLocation:com.example.brzodolokacije.Models.Location?=null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setUpViewModel() binding=FragmentShowPostsBinding.inflate(layoutInflater) + //instantiate adapter and linearLayout adapterVar=ShowPostsAdapter(requireActivity()) linearManagerVar= LinearLayoutManager(activity) gridManagerVar=GridLayoutManager(activity,2) } + fun onTextEnter(){ + var api=RetrofitHelper.getInstance() + var jwtString= SharedPreferencesHelper.getValue("jwt",requireActivity()) + var text=searchBar.text + Log.d("test",text.toString()) + if(text==null ||text.toString().trim()=="") + return + var data=api.searchLocationsQuery("Bearer "+jwtString,text.toString()) + data.enqueue(object : retrofit2.Callback> { + override fun onResponse(call: Call?>, response: Response>) { + if(response.isSuccessful){ + var existingLocation=responseLocations + responseLocations=response.body()!! + var tempList=mutableListOf() + if(existingLocation!=null && existingLocation.size>0) + for(loc in existingLocation!!){ + spinnerAdapter!!.remove(loc.name) + } + for(loc in responseLocations!!){ + spinnerAdapter!!.add(loc.name) + } + spinnerAdapter!!.notifyDataSetChanged() + } + } + + override fun onFailure(call: Call>, t: Throwable) { + + } + }) + + } + var arraySpinner :MutableList?=null + var spinnerAdapter: ArrayAdapter?=null + + fun setUpSpinner() { + arraySpinner=mutableListOf() + spinnerAdapter= ArrayAdapter( + requireContext(), + android.R.layout.simple_list_item_1, arraySpinner!!) + searchBar.threshold=1 + searchBar.setAdapter(spinnerAdapter) + searchBar.setOnItemClickListener(AdapterView.OnItemClickListener { parent, view, position, id -> + val selected = parent.getItemAtPosition(position) as String + selectedLocation = responseLocations!!.find { location -> location.name == selected } + searchParams=SearchParams(selectedLocation!!._id,1,1)//to do sort type + requestToBack(searchParams!!) + + }) + + + } private fun setUpViewModel() { val factory=SearchPostsViewModelFactory(RetrofitHelper.getInstance(),requireActivity()) searchPostsViewModel=ViewModelProvider(this@FragmentShowPosts,factory).get(SearchPostsViewModel::class.java) @@ -126,6 +187,11 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { btnSort.setOnClickListener{ showBottomSheetSort() } + searchBar=rootView.findViewById(R.id.etFragmentShowPostsSearch) as AutoCompleteTextView + setUpSpinner() + searchBar.addTextChangedListener{ + onTextEnter() + } return rootView } diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml index e1effc4..e3db4bc 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml @@ -21,8 +21,8 @@ app:layout_constraintTop_toBottomOf="@+id/tvFragmentHomePageSearch"> - Date: Sun, 4 Dec 2022 21:12:46 +0100 Subject: Dodati listeneri za enter i ostale moguce potvrdjivanja. todo(default pretraga, text pretraga) --- .../brzodolokacije/Fragments/FragmentShowPosts.kt | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt index f5b4b58..714f994 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt @@ -3,6 +3,7 @@ package com.example.brzodolokacije.Fragments import android.content.Intent import android.os.Bundle import android.util.Log +import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,6 +29,7 @@ import com.example.brzodolokacije.databinding.FragmentShowPostsBinding import com.example.brzodolokacije.paging.SearchPostsViewModel import com.example.brzodolokacije.paging.SearchPostsViewModelFactory import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.button.MaterialButton import kotlinx.android.synthetic.main.fragment_show_posts.* import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged @@ -47,6 +49,7 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { private var recyclerView: RecyclerView?=null private var gridManagerVar: RecyclerView.LayoutManager?=null private var swipeRefreshLayout:SwipeRefreshLayout?=null + private lateinit var searchButton: MaterialButton private lateinit var searchPostsViewModel:SearchPostsViewModel private var searchParams:SearchParams?= SearchParams("6385b79d7e1a2c93575e1ef1",1,1) private lateinit var btnFilter:ImageButton @@ -65,6 +68,9 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { linearManagerVar= LinearLayoutManager(activity) gridManagerVar=GridLayoutManager(activity,2) } + fun searchText(){ + Log.d("MAIN","TODO") + } fun onTextEnter(){ var api=RetrofitHelper.getInstance() var jwtString= SharedPreferencesHelper.getValue("jwt",requireActivity()) @@ -78,7 +84,6 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { if(response.isSuccessful){ var existingLocation=responseLocations responseLocations=response.body()!! - var tempList=mutableListOf() if(existingLocation!=null && existingLocation.size>0) for(loc in existingLocation!!){ spinnerAdapter!!.remove(loc.name) @@ -188,10 +193,25 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { showBottomSheetSort() } searchBar=rootView.findViewById(R.id.etFragmentShowPostsSearch) as AutoCompleteTextView + searchButton=rootView.findViewById(R.id.mbFragmentHomePageSearch) as MaterialButton setUpSpinner() + searchButton.setOnClickListener{ + searchText() + } searchBar.addTextChangedListener{ onTextEnter() } + searchBar.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 + searchText() + return@OnKeyListener true + } + false + }) + return rootView } -- cgit v1.2.3 From a18cd1c5439780e84fa983b62cdaef8445df4542 Mon Sep 17 00:00:00 2001 From: Jelena Petrovic Date: Mon, 5 Dec 2022 07:15:23 +0100 Subject: Prepravljen izgled četa i liste četova, omogućeno vraćanje na pritisak dugmeta u uglu ekrana, dodat prikaz zadnje poruke i njenog datuma/vremena u listi četova #70 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/main/AndroidManifest.xml | 2 +- .../brzodolokacije/Activities/ChatActivity.kt | 6 +- .../Activities/ChatActivityConversation.kt | 161 +++++++++++---------- .../brzodolokacije/Adapters/ChatPreviewsAdapter.kt | 42 +++++- .../java/com/example/brzodolokacije/Models/Chat.kt | 3 +- .../com/example/brzodolokacije/chat/DBHelper.kt | 88 +++++++++-- .../app/src/main/res/drawable/expand.png | Bin 0 -> 2326 bytes .../app/src/main/res/drawable/shrink.png | Bin 0 -> 2322 bytes .../app/src/main/res/layout/activity_chat.xml | 31 ++-- .../main/res/layout/activity_chat_conversation.xml | 134 ++++++++++------- .../app/src/main/res/layout/chat_message.xml | 61 +++----- .../app/src/main/res/layout/chat_message_other.xml | 62 +++----- .../app/src/main/res/layout/chat_preview.xml | 61 ++++++-- .../app/src/main/res/values/dimens.xml | 1 + 14 files changed, 408 insertions(+), 244 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/expand.png create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/shrink.png (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml index 2241c80..4555917 100644 --- a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml +++ b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml @@ -56,7 +56,7 @@ android:name=".Activities.ChatActivityConversation" android:exported="false" android:screenOrientation="portrait" - android:windowSoftInputMode="stateVisible|adjustPan"> + android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> 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 951cbb4..14a4ba5 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 @@ -20,6 +20,7 @@ import com.example.brzodolokacije.Services.SharedPreferencesHelper import com.example.brzodolokacije.chat.SignalRListener import com.example.brzodolokacije.databinding.ActivityChatBinding import retrofit2.Call +import retrofit2.Callback import retrofit2.Response import java.util.* @@ -64,6 +65,9 @@ class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener { intent.putExtra("receiverId","") startActivity(intent) } + findViewById(R.id.btnBack).setOnClickListener { + finish() + } } fun requestForChats(){ @@ -77,7 +81,7 @@ class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener { val api=RetrofitHelper.getInstance() val token=SharedPreferencesHelper.getValue("jwt",this@ChatActivity) val request2=api?.getNewMessages("Bearer "+token) - request2?.enqueue(object : retrofit2.Callback?> { + request2?.enqueue(object : Callback?> { override fun onResponse(call: Call?>, response: Response?>) { if(response.isSuccessful()){ var messages=response.body() 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 19fd836..985735f 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 @@ -1,5 +1,6 @@ package com.example.brzodolokacije.Activities +import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.view.View @@ -37,6 +38,7 @@ class ChatActivityConversation : AppCompatActivity() { var dbConnection: DBHelper?=null var webSocketConnection:SignalRListener?=null var items:MutableList?=mutableListOf() + var userImage:Bitmap?=null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -44,6 +46,7 @@ class ChatActivityConversation : AppCompatActivity() { setContentView(binding.root) userId=intent.extras?.get("userId").toString() receiverUsername=intent.extras?.get("username").toString() + userImage=intent.extras?.get("pfp") as Bitmap? dbConnection=DBHelper.getInstance(this@ChatActivityConversation) setHeader() setRecyclerView() @@ -56,85 +59,89 @@ class ChatActivityConversation : AppCompatActivity() { private fun setListeners() { findViewById(R.id.btnSendMessage).setOnClickListener { var token=SharedPreferencesHelper.getValue("jwt",this@ChatActivityConversation) - var messageContent=findViewById(R.id.etNewMessage).text.toString() + var messageContent=findViewById(R.id.etNewMessage).text.trim().toString() val Api= RetrofitHelper.getInstance() - if(userId.isNullOrEmpty() || userId.equals("null")){ - //zahtev sa username=om - receiverUsername=findViewById(R.id.etReceiverUsername).text.toString() - val request=Api.getProfile("Bearer "+token, - receiverUsername!! - ) - request.enqueue(object : retrofit2.Callback { - override fun onResponse(call: Call, response: Response) { - if(response.isSuccessful()){ - //zahtev da se posalje poruka - userId=response.body()?._id - setHeader() - var message= MessageSend(userId!!,messageContent) - val request2=Api.sendMessage("Bearer "+token, - message - ) - request2.enqueue(object : retrofit2.Callback { - override fun onResponse(call: Call, response: Response) { - 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() + if(!messageContent.isNullOrEmpty()){ + if(userId.isNullOrEmpty() || userId.equals("null")){ + //zahtev sa username=om + receiverUsername=findViewById(R.id.etReceiverUsername).text.toString() + val request=Api.getProfile("Bearer "+token, + receiverUsername!! + ) + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful()){ + //zahtev da se posalje poruka + var user:UserReceive=response.body()!! + userId=user._id + setHeader() + var message= MessageSend(userId!!,messageContent) + val request2=Api.sendMessage("Bearer "+token, + message + ) + request2.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + 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!!,username=user.username) + requestMessages() + binding.etNewMessage.text?.clear() + } + else{ + Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime1.",Toast.LENGTH_LONG).show() + } } - else{ - Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime1.",Toast.LENGTH_LONG).show() + + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime2.",Toast.LENGTH_LONG).show() } - } + }) + } + else{ + Log.d("main",response.message()) + //Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime3.",Toast.LENGTH_LONG).show() + } + } - override fun onFailure(call: Call, t: Throwable) { - Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime2.",Toast.LENGTH_LONG).show() - } - }) + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText(this@ChatActivityConversation,"fail.",Toast.LENGTH_LONG).show() } - else{ - Log.d("main",response.message()) - //Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime3.",Toast.LENGTH_LONG).show() + }) + } + else{ + //zahtev da se posalje poruka + var message= MessageSend(userId!!,messageContent) + val request2=Api.sendMessage("Bearer "+token, + message + ) + request2.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + 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!!,username=receiverUsername) + requestMessages() + binding.etNewMessage.text?.clear() + } + else{ + Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime.",Toast.LENGTH_LONG).show() + } } - } - override fun onFailure(call: Call, t: Throwable) { - Toast.makeText(this@ChatActivityConversation,"fail.",Toast.LENGTH_LONG).show() - } - }) - } - else{ - //zahtev da se posalje poruka - var message= MessageSend(userId!!,messageContent) - val request2=Api.sendMessage("Bearer "+token, - message - ) - request2.enqueue(object : retrofit2.Callback { - override fun onResponse(call: Call, response: Response) { - 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() - } - else{ + override fun onFailure(call: Call, t: Throwable) { Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime.",Toast.LENGTH_LONG).show() } - } + }) + } - override fun onFailure(call: Call, t: Throwable) { - Toast.makeText(this@ChatActivityConversation,"Pogresno korisnicko ime.",Toast.LENGTH_LONG).show() - } - }) } } @@ -144,19 +151,24 @@ class ChatActivityConversation : AppCompatActivity() { if(userId.isNullOrEmpty() || userId.equals("null")){ binding.cvParentUsername.visibility= View.VISIBLE binding.cvParentUsername.forceLayout() - binding.tvFragmentTitle.visibility= View.GONE - binding.tvFragmentTitle.invalidate() - binding.tvFragmentTitle.forceLayout() + binding.llHeader.visibility= View.GONE + binding.llHeader.invalidate() + binding.llHeader.forceLayout() } else{ - binding.tvFragmentTitle.visibility= View.VISIBLE - binding.tvFragmentTitle.invalidate() - binding.tvFragmentTitle.forceLayout() + binding.llHeader.visibility= View.VISIBLE + binding.llHeader.invalidate() + binding.llHeader.forceLayout() binding.tvFragmentTitle.text=receiverUsername binding.tvFragmentTitle.invalidate() binding.cvParentUsername.visibility= View.GONE binding.cvParentUsername.forceLayout() } + binding.btnBack.setOnClickListener { + finish() + } + if(userImage!=null) + binding.ivUserImage.setImageBitmap(userImage) } fun setRecyclerView(setParams:Boolean=true){ MainScope().launch { @@ -173,6 +185,7 @@ class ChatActivityConversation : AppCompatActivity() { } catch (e: Exception) { Log.d("error", e.message!!) } + recyclerView?.addOnLayoutChangeListener { _, i, i2, i3, i4, i5, i6, i7, i8 -> recyclerView?.scrollToPosition(items?.size?.minus(1) ?: 0) } recyclerView?.scrollToPosition(items?.size?.minus(1) ?: 0) } } 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 6e62180..be564f4 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 @@ -5,6 +5,8 @@ import android.graphics.Typeface import android.view.LayoutInflater import android.view.ViewGroup import android.widget.Toast +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.toBitmap import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.exam.DBHelper @@ -13,12 +15,14 @@ import com.example.brzodolokacije.Activities.ChatActivityConversation import com.example.brzodolokacije.Interfaces.IBackendApi import com.example.brzodolokacije.Models.ChatPreview 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.databinding.ChatPreviewBinding import kotlinx.android.synthetic.main.chat_preview.view.* import retrofit2.Call import retrofit2.Response +import java.util.* class ChatPreviewsAdapter (val items : MutableList,val activity:ChatActivity) : RecyclerView.Adapter(){ @@ -42,6 +46,7 @@ class ChatPreviewsAdapter (val items : MutableList,val activity:Cha val intent: Intent = Intent(activity, ChatActivityConversation::class.java) intent.putExtra("userId",items[position].userId) intent.putExtra("username",holder.itemView.tvUsername.text) + intent.putExtra("pfp",holder.itemView.ivUserImage.drawable.toBitmap(200,200)) db.readContact(items[position].userId) items[position].read=true holder.itemView.tvUsername.typeface= Typeface.DEFAULT @@ -61,11 +66,12 @@ class ChatPreviewsAdapter (val items : MutableList,val activity:Cha //zahtev da se posalje poruka var user=response.body()!! if(!item.read) - tvUsername.typeface= Typeface.DEFAULT_BOLD + setUnread() tvUsername.text=user.username if(user.pfp!=null) { Glide.with(activity) .load(RetrofitHelper.baseUrl + "/api/post/image/" + user.pfp!!._id) + .circleCrop() .into(ivUserImage) } } @@ -81,7 +87,41 @@ class ChatPreviewsAdapter (val items : MutableList,val activity:Cha Toast.LENGTH_LONG).show() } }) + var lastMessage=db.getLastMessage(item.userId) + tvUsername.text=item.username + if(lastMessage!=null){ + tvLastMessage.text=lastMessage.messagge + if(layoutPosition==0 || isDifferentDays(lastMessage.usableTimeStamp,Calendar.getInstance())){ + tvLastMessageDate.text=lastMessage.usableTimeStamp.get(Calendar.HOUR_OF_DAY).toString() + ":" + lastMessage.usableTimeStamp.get( + Calendar.MINUTE).toString() + } + else{ + tvLastMessageDate.text=lastMessage.usableTimeStamp.get(Calendar.DAY_OF_MONTH).toString()+"/"+ + (lastMessage.usableTimeStamp.get(Calendar.MONTH)+1).toString()+"/"+ + lastMessage.usableTimeStamp.get(Calendar.YEAR).toString() + } + + } } } + 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 + } + fun setUnread(){ + itemView.tvUsername.typeface= Typeface.DEFAULT_BOLD + itemView.tvUsername.invalidate() + itemView.tvLastMessage.typeface= Typeface.DEFAULT_BOLD + itemView.tvLastMessage.invalidate() + itemView.tvLastMessageDate.typeface= Typeface.DEFAULT_BOLD + itemView.tvLastMessageDate.invalidate() + itemView.readIndicator.background= ContextCompat.getDrawable(activity,R.color.dark_blue_transparent) + itemView.readIndicator.invalidate() + } } } \ 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 6725c15..f3af84c 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 @@ -24,5 +24,6 @@ data class Message( data class ChatPreview( var userId:String, - var read:Boolean + var read:Boolean, + var username:String ) \ 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 a3d5a13..041eebb 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 @@ -9,6 +9,11 @@ import android.database.sqlite.SQLiteOpenHelper import android.util.Log import com.example.brzodolokacije.Models.ChatPreview import com.example.brzodolokacije.Models.Message +import com.example.brzodolokacije.Models.UserReceive +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import retrofit2.Call +import retrofit2.Response import java.util.* @@ -17,7 +22,7 @@ class DBHelper : var db:SQLiteDatabase?=null - constructor(context: Context, factory: SQLiteDatabase.CursorFactory?):super(context, DATABASE_NAME, factory,3){ + constructor(context: Context, factory: SQLiteDatabase.CursorFactory?):super(context, DATABASE_NAME, factory,5){ db=readableDatabase } @@ -28,8 +33,10 @@ class DBHelper : //database tables val CONTACTS_TABLE_NAME = "contacts" val MESSAGES_TABLE_NAME = "messages" + var activity:Activity?=null private var instance:DBHelper?=null fun getInstance(activity: Activity):DBHelper{ + this.activity =activity if(instance==null){ instance= DBHelper(activity,null) } @@ -41,7 +48,8 @@ class DBHelper : if(!doesTableExist(CONTACTS_TABLE_NAME,db)){ var sql:String="CREATE TABLE "+ CONTACTS_TABLE_NAME+" (" + "userId " +"TEXT PRIMARY KEY,"+ - "read " +"INTEGER"+ + "read " +"INTEGER,"+ + "username "+"TEXT"+ ")" db?.execSQL(sql) } @@ -77,7 +85,7 @@ class DBHelper : onCreate(db) } - fun addMessage(message: Message, sent:Boolean=true){ + fun addMessage(message: Message, sent:Boolean=true,username:String?=null){ onCreate(db) if(!message._id.isNullOrEmpty() && message.senderId==message.receiverId){ Log.d("main", "ne zapisuje se dupla poruka") @@ -101,9 +109,41 @@ class DBHelper : 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) + if(username==null){ + //request + var api=RetrofitHelper.getInstance() + var token= activity?.let { SharedPreferencesHelper.getValue("jwt", it) } + val request2=api.getProfileFromId("Bearer "+token, + message.senderId + ) + request2?.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful()){ + var user=response.body()!! + sql="INSERT INTO "+ CONTACTS_TABLE_NAME+"(userId,read,username) VALUES('"+id+"','"+ + read+"','"+user.username+"')" + db?.execSQL(sql) + } + else{ + sql="INSERT INTO "+ CONTACTS_TABLE_NAME+"(userId,read) VALUES('"+id+"','"+ + read+"')" + db?.execSQL(sql) + } + } + + override fun onFailure(call: Call, t: Throwable) { + sql="INSERT INTO "+ CONTACTS_TABLE_NAME+"(userId,read) VALUES('"+id+"','"+ + read+"')" + db?.execSQL(sql) + } + }) + } + else{ + sql="INSERT INTO "+ CONTACTS_TABLE_NAME+"(userId,read,username) VALUES('"+id+"','"+ + read+"','"+username+"')" + db?.execSQL(sql) + } + } else{ if(!sent) @@ -111,7 +151,36 @@ class DBHelper : } } } - fun getMessages(userId:String, self:Boolean=false): MutableList? { + fun getLastMessage(userId:String): Message? { + onCreate(db) + var sql:String = "SELECT * FROM "+ MESSAGES_TABLE_NAME+" WHERE senderId='"+userId+"'"+" OR receiverId='"+userId+"'"+" ORDER BY timestamp DESC LIMIT 1" + var cursor=db?.rawQuery(sql,null) + if(cursor?.count!! >0){ + var msg:Message + 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") + cursor.moveToNext() + var cal:Calendar= Calendar.getInstance() + cal.timeInMillis=cursor.getLong(timestampIndex) + msg=Message( + cursor.getString(idIndex), + cursor.getString(senderIdIndex), + cursor.getString(receiverIdIndex), + cursor.getString(messageIndex), + cal.time, + cal + ) + + Log.d("main",cal.time.toString()) + readContact(userId) + return msg + } + return null + } + fun getMessages(userId:String,self:Boolean=false): MutableList? { onCreate(db) var sql:String if(!self) @@ -137,8 +206,8 @@ class DBHelper : cursor.getString(messageIndex), cal.time, cal - ) ) + ) Log.d("main",cal.time.toString()) } readContact(userId) @@ -155,8 +224,9 @@ class DBHelper : var contactList:MutableList =mutableListOf() var userIdIndex=cursor.getColumnIndexOrThrow("userId") var readIndex=cursor.getColumnIndexOrThrow("read") + var usernameIndex=cursor.getColumnIndexOrThrow("username") while(cursor.moveToNext()){ - contactList.add(ChatPreview(cursor.getString(userIdIndex),cursor.getInt(readIndex)==1)) + contactList.add(ChatPreview(cursor.getString(userIdIndex),cursor.getInt(readIndex)==1,cursor.getString(usernameIndex))) } Log.d("main",contactList.size.toString()) return contactList diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/expand.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/expand.png new file mode 100644 index 0000000..2051733 Binary files /dev/null and b/Client/BrzoDoLokacije/app/src/main/res/drawable/expand.png differ diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/shrink.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/shrink.png new file mode 100644 index 0000000..d4c07e1 Binary files /dev/null and b/Client/BrzoDoLokacije/app/src/main/res/drawable/shrink.png differ 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 680bada..acdab4a 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml @@ -18,16 +18,20 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> + - @@ -36,13 +40,20 @@ android:id="@+id/tvActivityShowFollowersOrFollowingShow" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:layout_marginEnd="268dp" + android:layout_gravity="center_vertical" + android:layout_weight="1" android:text="Poruke" android:textSize="25dp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + 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 72060f7..4dcab31 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 @@ -1,69 +1,94 @@ - - - - - - - - + + android:layout_gravity="center_vertical" + android:clickable="true" + android:src="@drawable/ic_baseline_arrow_back" + android:background="@null" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" /> + + + + + + + + + + + + + + - - + android:animateLayoutChanges="true" + android:layout_weight="1"> + app:layout_constraintBottom_toBottomOf="parent"> @@ -72,14 +97,12 @@ android:id="@+id/cvParentMessageEdit" android:layout_width="match_parent" android:layout_height="40dp" + android:layout_marginBottom="5dp" 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:cardCornerRadius="20dp"> + android:paddingLeft="15dp" + tools:ignore="TouchTargetSizeCheck" + android:autofillHints="emailAddress"/> + app:cornerRadius="16dp" + tools:ignore="SpeakableTextPresentCheck" /> - \ No newline at end of file + \ 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 index 7858e94..f7ef08c 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/chat_message.xml @@ -1,42 +1,15 @@ - - - - - + android:layout_width="match_parent"> + app:layout_constraintTop_toTopOf="parent"/> - - - - + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tvDate"> + + + android:layout_width="match_parent"> + app:layout_constraintTop_toTopOf="parent"/> - - + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tvDate"> - - - - - + android:backgroundTint="#eef1f6" + android:padding="5dp" + android:paddingHorizontal="15dp" + android:text="blabla" + app:layout_constraintEnd_toEndOf="parent" /> - + app:layout_constraintBottom_toBottomOf="@+id/cvContainer" + app:layout_constraintStart_toEndOf="@+id/cvContainer" /> \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/chat_preview.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/chat_preview.xml index 35431ff..c995b4b 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/chat_preview.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/chat_preview.xml @@ -1,19 +1,54 @@ - - + - + - - \ No newline at end of file + android:layout_weight="1" + android:orientation="vertical"> + + + + + + + \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/values/dimens.xml b/Client/BrzoDoLokacije/app/src/main/res/values/dimens.xml index 181591b..5f0b4e1 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/values/dimens.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/values/dimens.xml @@ -2,6 +2,7 @@ 16dp 5dp 20dp + 18dp 10dp 16dp 8dp -- cgit v1.2.3 From 72995f8e1177488b3b69004743c0f3ab85065af6 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Mon, 5 Dec 2022 12:51:43 +0100 Subject: Napravljen fragment za prikazivanje objava korisnina na mapi. --- .../brzodolokacije/Fragments/FragmentBrowse.kt | 1 - .../example/brzodolokacije/UserPostsMapFragment.kt | 100 +++++++++++++++++++++ .../main/res/layout/fragment_user_posts_map.xml | 18 ++++ 3 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_posts_map.xml (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt index 57e1833..a0d6146 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt @@ -197,7 +197,6 @@ class FragmentBrowse : Fragment(R.layout.fragment_browse) { } } private fun getMarkers(){ - val startMarker = Marker(map) var api=RetrofitHelper.getInstance() var jwtString= SharedPreferencesHelper.getValue("jwt",requireActivity()) var data=api.getPosts("Bearer "+jwtString) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt new file mode 100644 index 0000000..1ecc22f --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt @@ -0,0 +1,100 @@ +package com.example.brzodolokacije + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.preference.PreferenceManager +import android.util.Log +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.Activities.ActivitySinglePost +import com.example.brzodolokacije.Models.PostPreview +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import org.osmdroid.config.Configuration +import org.osmdroid.tileprovider.tilesource.TileSourceFactory +import org.osmdroid.util.GeoPoint +import org.osmdroid.views.MapView +import org.osmdroid.views.overlay.Marker +import retrofit2.Call +import retrofit2.Response + + +class UserPostsMapFragment : Fragment() { + + var map: MapView? = null + var id:String?=null + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + var view=inflater.inflate(R.layout.fragment_user_posts_map, container, false) + val ctx: Context = requireContext() + Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx)); + map=view.findViewById(R.id.FragmentUserPostsMapMapView) as MapView + map!!.setTileSource(TileSourceFactory.MAPNIK); + id=this.requireArguments().getString("id");//https://stackoverflow.com/questions/17436298/how-to-pass-a-variable-from-activity-to-fragment-and-pass-it-back + setUpMap() + return view + } + fun setUpMap(){ + map!!.setBuiltInZoomControls(true); + map!!.setMultiTouchControls(true); + val mapController = map!!.controller + mapController.setZoom(15) + var api= RetrofitHelper.getInstance() + var jwtString= SharedPreferencesHelper.getValue("jwt",requireActivity()) + if(id==null) + return + var data=api.getUsersPosts("Bearer "+jwtString,id!!) + + data.enqueue(object : retrofit2.Callback> { + override fun onResponse(call: Call>, response: Response>) { + if(response.isSuccessful()){ + var postList=response.body() + if (postList != null) { + for(post in postList){ + Log.d("main",post.toString()) + val startMarker = Marker(map) + startMarker.setPosition(GeoPoint(post.location.latitude,post.location.longitude)) + startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM) + startMarker.setOnMarkerClickListener(object: + Marker.OnMarkerClickListener { + override fun onMarkerClick( + marker: Marker?, + mapView: MapView? + ): Boolean { + val intent: Intent = Intent(activity, ActivitySinglePost::class.java) + var b=Bundle() + b.putParcelable("selectedPost",post) + intent.putExtras(b) + requireActivity().startActivity(intent) + return true + } + + }) + map!!.getOverlays().add(startMarker) + + + } + } + + + + }else { + + } + + + } + + override fun onFailure(call: Call>, t: Throwable) { + } + }) + } + + +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_posts_map.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_posts_map.xml new file mode 100644 index 0000000..0708692 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_posts_map.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file -- cgit v1.2.3 From a3b1f70fe0b4372c51818236b6a259c67d997f5c Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Mon, 5 Dec 2022 13:07:27 +0100 Subject: Dodat back button i omoguceno vracanje nazad. --- .../com/example/brzodolokacije/UserPostsMapFragment.kt | 18 ++++++++++++++++++ .../src/main/res/layout/fragment_user_posts_map.xml | 11 +++++++++++ 2 files changed, 29 insertions(+) (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt index 1ecc22f..eeaf7af 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt @@ -9,7 +9,9 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView import com.example.brzodolokacije.Activities.ActivitySinglePost +import com.example.brzodolokacije.Fragments.FragmentProfile import com.example.brzodolokacije.Models.PostPreview import com.example.brzodolokacije.Services.RetrofitHelper import com.example.brzodolokacije.Services.SharedPreferencesHelper @@ -26,6 +28,7 @@ class UserPostsMapFragment : Fragment() { var map: MapView? = null var id:String?=null + var backButton:ImageView?=null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -35,9 +38,18 @@ class UserPostsMapFragment : Fragment() { val ctx: Context = requireContext() Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx)); map=view.findViewById(R.id.FragmentUserPostsMapMapView) as MapView + backButton=view.findViewById(R.id.btnFragmentUserPostsBack) as ImageView map!!.setTileSource(TileSourceFactory.MAPNIK); id=this.requireArguments().getString("id");//https://stackoverflow.com/questions/17436298/how-to-pass-a-variable-from-activity-to-fragment-and-pass-it-back setUpMap() + backButton!!.setOnClickListener{ + //SUBJECT TO CHANGE + val fragmentProfile = FragmentProfile() + fragmentManager?.beginTransaction() + ?.replace(com.example.brzodolokacije.R.id.flNavigationFragment,fragmentProfile) + ?.commit() + + } return view } fun setUpMap(){ @@ -56,11 +68,17 @@ class UserPostsMapFragment : Fragment() { if(response.isSuccessful()){ var postList=response.body() if (postList != null) { + var flag=true for(post in postList){ Log.d("main",post.toString()) val startMarker = Marker(map) startMarker.setPosition(GeoPoint(post.location.latitude,post.location.longitude)) startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM) + if(flag){ + flag=false + map!!.controller.animateTo(GeoPoint(post.location.latitude,post.location.longitude)) + } + startMarker.setOnMarkerClickListener(object: Marker.OnMarkerClickListener { override fun onMarkerClick( diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_posts_map.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_posts_map.xml index 0708692..5ea5c93 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_posts_map.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_posts_map.xml @@ -15,4 +15,15 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + \ No newline at end of file -- cgit v1.2.3 From f3c3fcaeb4ece508e018286c59a57da1d9ea0469 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Mon, 5 Dec 2022 13:08:10 +0100 Subject: Dodat poziv fragmenta. --- .../java/com/example/brzodolokacije/UserPostsMapFragment.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt index eeaf7af..882a1ae 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/UserPostsMapFragment.kt @@ -48,7 +48,16 @@ class UserPostsMapFragment : Fragment() { fragmentManager?.beginTransaction() ?.replace(com.example.brzodolokacije.R.id.flNavigationFragment,fragmentProfile) ?.commit() - +//How to call fragment +// val bundle = Bundle() +// bundle.putString("id",userId ) +// val fragmentFollowers = UserPostsMapFragment() +// fragmentFollowers.setArguments(bundle) +// +// fragmentManager +// ?.beginTransaction() +// ?.replace(com.example.brzodolokacije.R.id.flNavigationFragment,fragmentFollowers) +// ?.commit() } return view } -- cgit v1.2.3 From c9ca0173325bf846d84ac0776ef00182dd3e790b Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Mon, 5 Dec 2022 18:13:58 +0100 Subject: Omogucena pretraga sa bilo kakvim stringom na clientu. --- .../java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt index 714f994..0254e0f 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt @@ -69,7 +69,11 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { gridManagerVar=GridLayoutManager(activity,2) } fun searchText(){ - Log.d("MAIN","TODO") + if(searchBar.text==null || searchBar.text.toString().trim()=="") + return + + searchParams=SearchParams(searchBar.text.toString(),1,1) + requestToBack(searchParams!!) } fun onTextEnter(){ var api=RetrofitHelper.getInstance() -- cgit v1.2.3 From dfd867d9006520cfcd40f5bd08e7980a202ec530 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Mon, 5 Dec 2022 19:05:05 +0100 Subject: Omogucena pretraga lokacija i objava na pocetnoj strani. Prilikom potvrde pretrage omoguceno usmeravanje na stranicu sve objave sa datim parametrima pretrage i vrsenje pretrage. Dodat onResume. --- .../Activities/NavigationActivity.kt | 12 ++- .../brzodolokacije/Fragments/FragmentHomePage.kt | 103 +++++++++++++++++++-- .../Fragments/FragmentHomePageMainScroll.kt | 3 - .../brzodolokacije/Fragments/FragmentShowPosts.kt | 28 +++++- .../app/src/main/res/layout/fragment_home_page.xml | 3 +- 5 files changed, 132 insertions(+), 17 deletions(-) (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/NavigationActivity.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/NavigationActivity.kt index 180b59d..23cbca6 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/NavigationActivity.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/NavigationActivity.kt @@ -18,19 +18,20 @@ class NavigationActivity : AppCompatActivity() { //lateinit var openAddPost:Button //lateinit var capturePost:Button - + public lateinit var bottomNav:BottomNavigationView + public lateinit var searchQuery:String + public lateinit var searchId:String override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_navigation) - Toast.makeText( - applicationContext, "Open ", Toast.LENGTH_LONG - ).show(); + searchQuery="" + searchId="" val fragmentHomePage=FragmentHomePage() val fragmentShowPosts=FragmentShowPosts() val browseFragment=FragmentBrowse() val addPostFragment= FragmentAddNew() val profileFragment=FragmentProfile() - val bottomNav=findViewById(R.id.bottomNavigationView) as BottomNavigationView + bottomNav=findViewById(R.id.bottomNavigationView) as BottomNavigationView setCurrentFragment(fragmentHomePage) bottomNav.setOnNavigationItemSelectedListener { when(it.itemId){ @@ -46,6 +47,7 @@ class NavigationActivity : AppCompatActivity() { } + } private fun setCurrentFragment(fragment: Fragment)= supportFragmentManager.beginTransaction().apply { diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHomePage.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHomePage.kt index cb48d3e..a26aaba 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHomePage.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHomePage.kt @@ -2,27 +2,31 @@ package com.example.brzodolokacije.Fragments import android.content.Intent import android.os.Bundle +import android.util.Log +import android.view.KeyEvent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button -import android.widget.ImageButton -import android.widget.ImageView -import android.widget.ScrollView -import android.widget.Toast +import android.widget.* import androidx.core.view.isVisible +import androidx.core.widget.addTextChangedListener import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.brzodolokacije.Activities.ChatActivity +import com.example.brzodolokacije.Activities.NavigationActivity import com.example.brzodolokacije.Adapters.ShowPostsHomePageAdapter import com.example.brzodolokacije.Interfaces.IBackendApi +import com.example.brzodolokacije.Models.Location import com.example.brzodolokacije.Models.LocationType import com.example.brzodolokacije.Models.PostPreview +import com.example.brzodolokacije.Models.SearchParams import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper import com.example.brzodolokacije.Services.RetrofitHelper.baseUrl import com.example.brzodolokacije.Services.SharedPreferencesHelper +import com.google.android.material.button.MaterialButton import retrofit2.Call import retrofit2.Callback import retrofit2.Response @@ -34,6 +38,9 @@ class FragmentHomePage : Fragment() { private lateinit var btnChat:ImageView private lateinit var btnBack:ImageView + private lateinit var searchBar:AutoCompleteTextView + private lateinit var searchButton: MaterialButton + var responseLocations:MutableList?=null /* override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -47,8 +54,10 @@ class FragmentHomePage : Fragment() { var view:View= inflater.inflate(R.layout.fragment_home_page, container, false) btnBack=view.findViewById(R.id.btnFragmentHomePageBack) btnChat=view.findViewById(R.id.ivFragmentHomePageChat) + searchBar=view.findViewById(R.id.etFragmentHomePageSearch) + searchButton=view.findViewById(R.id.mbFragmentHomePageSearchButton) setBtnBackInvisible() - + setUpSpinner() var fm: FragmentTransaction =childFragmentManager.beginTransaction() fm.replace(R.id.flFragmentHomePageMainContent, FragmentHomePageMainScroll()) fm.commit() @@ -62,9 +71,36 @@ class FragmentHomePage : Fragment() { val intent: Intent = Intent(activity, ChatActivity::class.java) requireActivity().startActivity(intent) } + searchButton.setOnClickListener{ + searchText() + } + searchBar.addTextChangedListener{ + onTextEnter() + } + searchBar.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 + searchText() + return@OnKeyListener true + } + false + }) return view } + + + fun searchText(){ + if(searchBar.text==null || searchBar.text.toString().trim()=="") + return + + var act=requireActivity() as NavigationActivity + act.searchQuery=searchBar.text.toString() + act.searchId="" + act.bottomNav.selectedItemId=R.id.navAllPosts + } fun changeScrollVIewToLocationView(){ var fm: FragmentTransaction =childFragmentManager.beginTransaction() fm.replace(R.id.flFragmentHomePageMainContent, FragmentShowPostsByLocation()) @@ -81,4 +117,59 @@ class FragmentHomePage : Fragment() { fun setBtnBackVisible(){ btnBack.isVisible=true } + fun onTextEnter(){ + var api= RetrofitHelper.getInstance() + var jwtString= SharedPreferencesHelper.getValue("jwt",requireActivity()) + var text=searchBar.text + Log.d("test",text.toString()) + if(text==null ||text.toString().trim()=="") + return + var data=api.searchLocationsQuery("Bearer "+jwtString,text.toString()) + data.enqueue(object : retrofit2.Callback> { + override fun onResponse(call: Call?>, response: Response>) { + if(response.isSuccessful){ + var existingLocation=responseLocations + responseLocations=response.body()!! + if(existingLocation!=null && existingLocation.size>0) + for(loc in existingLocation!!){ + spinnerAdapter!!.remove(loc.name) + } + for(loc in responseLocations!!){ + spinnerAdapter!!.add(loc.name) + } + spinnerAdapter!!.notifyDataSetChanged() + } + } + + override fun onFailure(call: Call>, t: Throwable) { + + } + }) + + + } + var arraySpinner :MutableList?=null + var spinnerAdapter: ArrayAdapter?=null + + fun setUpSpinner() { + arraySpinner=mutableListOf() + spinnerAdapter= ArrayAdapter( + requireContext(), + android.R.layout.simple_list_item_1, arraySpinner!!) + searchBar.threshold=1 + searchBar.setAdapter(spinnerAdapter) + searchBar.setOnItemClickListener(AdapterView.OnItemClickListener { parent, view, position, id -> + val selected = parent.getItemAtPosition(position) as String + var selectedLocation = responseLocations!!.find { location -> location.name == selected } + + var act=requireActivity() as NavigationActivity + act.searchQuery=selectedLocation!!.name + act.searchId=selectedLocation!!._id + act.bottomNav.selectedItemId=R.id.navAllPosts + + + }) + + + } } diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHomePageMainScroll.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHomePageMainScroll.kt index 46904d4..82c78a1 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHomePageMainScroll.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHomePageMainScroll.kt @@ -239,9 +239,6 @@ private lateinit var change:Button // Toast.makeText( // activity, "get all mv ", Toast.LENGTH_LONG // ).show(); - Toast.makeText( - activity," get popular all", Toast.LENGTH_LONG - ).show(); val api = RetrofitHelper.getInstance() val token= SharedPreferencesHelper.getValue("jwt", requireActivity()) val data=api.get10MostViewed("Bearer "+token) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt index 0254e0f..8620dc4 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt @@ -19,6 +19,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.example.brzodolokacije.Activities.ActivityAddPost import com.example.brzodolokacije.Activities.ChatActivity +import com.example.brzodolokacije.Activities.NavigationActivity import com.example.brzodolokacije.Adapters.ShowPostsAdapter import com.example.brzodolokacije.Models.Location import com.example.brzodolokacije.Models.SearchParams @@ -51,7 +52,7 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { private var swipeRefreshLayout:SwipeRefreshLayout?=null private lateinit var searchButton: MaterialButton private lateinit var searchPostsViewModel:SearchPostsViewModel - private var searchParams:SearchParams?= SearchParams("6385b79d7e1a2c93575e1ef1",1,1) + private var searchParams:SearchParams?= SearchParams("Kragujevac",1,1) private lateinit var btnFilter:ImageButton private lateinit var btnSort:ImageButton private lateinit var searchBar: AutoCompleteTextView @@ -62,7 +63,6 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { super.onCreate(savedInstanceState) setUpViewModel() binding=FragmentShowPostsBinding.inflate(layoutInflater) - //instantiate adapter and linearLayout adapterVar=ShowPostsAdapter(requireActivity()) linearManagerVar= LinearLayoutManager(activity) @@ -215,12 +215,36 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { } false }) + refreshSearch() + return rootView } override fun onRefresh() { requestToBack(searchParams!!) + refreshSearch() + } + override fun onResume() { + super.onResume() + refreshSearch() + + } + private fun refreshSearch(){ + var act=requireActivity() as NavigationActivity + Log.d("TEST","USAO") + if(act.searchId!=null && act.searchId.trim()!="") + { + searchBar.setText(act.searchQuery,TextView.BufferType.EDITABLE) + searchParams= SearchParams(act.searchId,1,1) + requestToBack(searchParams!!) + }else + if(act.searchQuery!=null && act.searchQuery.trim()!="") + { + searchBar.setText(act.searchQuery,TextView.BufferType.EDITABLE) + searchParams= SearchParams(act.searchQuery,1,1) + requestToBack(searchParams!!) + } } diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_home_page.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_home_page.xml index f39acf2..12c37e8 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_home_page.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_home_page.xml @@ -82,7 +82,7 @@ app:layout_constraintTop_toBottomOf="@+id/brzodolokacije"> - Date: Mon, 5 Dec 2022 19:12:02 +0100 Subject: Dodata promena parametara pretrage u FragmentShowPosts. --- .../java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt index 8620dc4..76fa4e0 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt @@ -71,7 +71,9 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { fun searchText(){ if(searchBar.text==null || searchBar.text.toString().trim()=="") return - + var act=requireActivity() as NavigationActivity + act.searchQuery=searchBar.text.toString() + act.searchId="" searchParams=SearchParams(searchBar.text.toString(),1,1) requestToBack(searchParams!!) } @@ -119,6 +121,9 @@ class FragmentShowPosts : Fragment(), SwipeRefreshLayout.OnRefreshListener { searchBar.setOnItemClickListener(AdapterView.OnItemClickListener { parent, view, position, id -> val selected = parent.getItemAtPosition(position) as String selectedLocation = responseLocations!!.find { location -> location.name == selected } + var act=requireActivity() as NavigationActivity + act.searchQuery=selectedLocation!!.name + act.searchId=selectedLocation!!._id searchParams=SearchParams(selectedLocation!!._id,1,1)//to do sort type requestToBack(searchParams!!) -- cgit v1.2.3 From 4eab4ea8df9e3aeb7db8c86fd54a6fa9d59d11a7 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Mon, 5 Dec 2022 21:20:56 +0100 Subject: Izmenjena struktura stranice za prikaz objave. --- .../Activities/ActivitySinglePost.kt | 67 +++- .../brzodolokacije/Adapters/CommentsAdapter.kt | 2 +- .../brzodolokacije/FragmentSinglePostComments.kt | 59 +++ .../Fragments/FragmentSinglePostDescription.kt | 60 +++ .../brzodolokacije/Services/RetrofitHelper.kt | 4 +- .../app/src/main/res/drawable/gradient2.xml | 28 ++ .../drawable/ic_round_keyboard_arrow_down_24.xml | 5 + .../res/drawable/ic_round_keyboard_arrow_up_24.xml | 5 + .../main/res/drawable/ic_round_star_outline_24.xml | 5 + .../src/main/res/layout/activity_single_post.xml | 402 ++++++++------------- .../res/layout/fragment_single_post_comments.xml | 74 ++++ .../layout/fragment_single_post_description.xml | 187 ++++++++++ .../app/src/main/res/values/styles.xml | 5 + 13 files changed, 634 insertions(+), 269 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentSinglePostComments.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/gradient2.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_keyboard_arrow_down_24.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_keyboard_arrow_up_24.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_star_outline_24.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_single_post_comments.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_single_post_description.xml (limited to 'Client') 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 f3d8a63..5a1e8b1 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 @@ -6,10 +6,17 @@ import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.preference.PreferenceManager import android.util.Log +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams +import android.widget.Button +import android.widget.ImageView import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat +import androidx.core.view.isGone +import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.brzodolokacije.Adapters.CommentsAdapter @@ -21,6 +28,7 @@ import com.example.brzodolokacije.Services.SharedPreferencesHelper import com.example.brzodolokacije.databinding.ActivitySinglePostBinding import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.gson.Gson +import kotlinx.android.synthetic.main.activity_single_post.view.* import org.osmdroid.config.Configuration import org.osmdroid.tileprovider.tilesource.TileSourceFactory import org.osmdroid.util.GeoPoint @@ -43,17 +51,38 @@ class ActivitySinglePost : AppCompatActivity() { private var starNumber:Number=0 private lateinit var userData:UserReceive private lateinit var user:TextView + private lateinit var linearLayout2:ConstraintLayout + private lateinit var btnChangeHeightUp:ImageView + private lateinit var btnChangeHeightDown:ImageView + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding=ActivitySinglePostBinding.inflate(layoutInflater) setContentView(binding.root) post= intent.extras?.getParcelable("selectedPost")!! + btnChangeHeightUp=findViewById(R.id.activitySinglePostChangeHeightUp) + btnChangeHeightDown=findViewById(R.id.activitySinglePostChangeHeightDown) + + btnChangeHeightDown.isVisible=false + btnChangeHeightDown.isGone=true + btnChangeHeightDown.isClickable=false + btnChangeHeightUp.isVisible=true + btnChangeHeightUp.isGone=false + btnChangeHeightUp.isClickable=true + + linearLayout2=findViewById(R.id.linearLayout2) + + linearLayout2.setOnClickListener { + linearLayout2.getLayoutParams().height= ViewGroup.LayoutParams.MATCH_PARENT; + } + //instantiate adapter and linearLayout adapterImages= PostImageAdapter(this@ActivitySinglePost, post.images as MutableList) layoutManagerImages= LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false) recyclerViewImages = binding.rvMain + /* buildRecyclerViewComments() requestGetComments() @@ -67,7 +96,7 @@ class ActivitySinglePost : AppCompatActivity() { val alreadyrated= RatingReceive(starNumber.toInt(),post._id) requestAddRating(alreadyrated) - + */ binding.tvUser.setOnClickListener { val intent: Intent = Intent(this@ActivitySinglePost,ActivityUserProfile::class.java) var b= Bundle() @@ -78,16 +107,39 @@ class ActivitySinglePost : AppCompatActivity() { getMap() } + + btnChangeHeightUp.setOnClickListener { + btnChangeHeightUp.isVisible=false + btnChangeHeightUp.isGone=true + btnChangeHeightUp.isClickable=false + btnChangeHeightDown.isVisible=true + btnChangeHeightDown.isGone=false + btnChangeHeightDown.isClickable=true + linearLayout2.setMinHeight(0); + linearLayout2.setMinimumHeight(0); + linearLayout2.getLayoutParams().height= ViewGroup.LayoutParams.MATCH_PARENT; + } + btnChangeHeightDown.setOnClickListener { + btnChangeHeightDown.isVisible=false + btnChangeHeightDown.isGone=true + btnChangeHeightDown.isClickable=false + btnChangeHeightUp.isVisible=true + btnChangeHeightUp.isGone=false + btnChangeHeightUp.isClickable=true + linearLayout2.setMinHeight(0); + linearLayout2.setMinimumHeight(0); + linearLayout2.getLayoutParams().height= ViewGroup.LayoutParams.WRAP_CONTENT; + } } fun getMap(){ - val mapDialogue = BottomSheetDialog(this@ActivitySinglePost, android.R.style.Theme_Black_NoTitleBar) + /*val mapDialogue = BottomSheetDialog(this@ActivitySinglePost, android.R.style.Theme_Black_NoTitleBar) mapDialogue.getWindow()?.setBackgroundDrawable(ColorDrawable(Color.argb(100, 0, 0, 0))) mapDialogue.setContentView(R.layout.map_dialogue) mapDialogue.setCancelable(true) - mapDialogue.setCanceledOnTouchOutside(true) + mapDialogue.setCanceledOnTouchOutside(true)*/ var map: MapView? = null Configuration.getInstance().load(this, PreferenceManager.getDefaultSharedPreferences(this)); - map=mapDialogue.findViewById(R.id.MapDialogueMapView) + map=findViewById(R.id.MapDialogueMapView) //findViewById(R.id.MapDialogueMapView) as MapView map!!.setTileSource(TileSourceFactory.MAPNIK); map!!.setBuiltInZoomControls(true); @@ -103,11 +155,10 @@ class ActivitySinglePost : AppCompatActivity() { startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_CENTER) map!!.getOverlays().add(startMarker) map!!.controller.setCenter(LocMarker) - mapDialogue.show() - - } + } +/* fun buildRecyclerViewComments(){ recyclerViewComments=binding.rvComments adapterComments=CommentsAdapter(comments as MutableList,this@ActivitySinglePost) @@ -377,4 +428,6 @@ class ActivitySinglePost : AppCompatActivity() { binding.tvCommentCount.text=(Integer.parseInt(binding.tvCommentCount.text.toString())+1).toString() binding.tvCommentCount.invalidate() } + + */ } diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt index 06713ec..96e332a 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt @@ -125,7 +125,7 @@ class CommentsAdapter (val items : MutableList,val activity: Activi var adapter:CommentsAdapter=rv.adapter as CommentsAdapter adapter.items.add(0,newComment) rv.adapter=adapter - (activity as ActivitySinglePost).addedComment() + //(activity as ActivitySinglePost).addedComment() } } } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentSinglePostComments.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentSinglePostComments.kt new file mode 100644 index 0000000..046bdf6 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentSinglePostComments.kt @@ -0,0 +1,59 @@ +package com.example.brzodolokacije + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentSinglePostComments.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentSinglePostComments : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_single_post_comments, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentSinglePostComments. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentSinglePostComments().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt new file mode 100644 index 0000000..1a7e7da --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentSinglePostDescription.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentSinglePostDescription : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_single_post_description, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentSinglePostDescription. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentSinglePostDescription().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt index 43c2109..88685e4 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt @@ -7,8 +7,8 @@ import retrofit2.converter.gson.GsonConverterFactory object RetrofitHelper { - val baseUrl="http://10.0.2.2:5279" - //val baseUrl="http://147.91.204.115:10082" + //val baseUrl="http://10.0.2.2:5279" + val baseUrl="http://147.91.204.115:10082" private var retrofit_noauth: IBackendApi? = null private var retrofit_auth: IBackendApi? = null diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/gradient2.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/gradient2.xml new file mode 100644 index 0000000..0d73580 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/gradient2.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_keyboard_arrow_down_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_keyboard_arrow_down_24.xml new file mode 100644 index 0000000..ee6e4de --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_keyboard_arrow_down_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_keyboard_arrow_up_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_keyboard_arrow_up_24.xml new file mode 100644 index 0000000..0d6676b --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_keyboard_arrow_up_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_star_outline_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_star_outline_24.xml new file mode 100644 index 0000000..e97ab0a --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_round_star_outline_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml index e3cabb5..744a2a2 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml @@ -1,310 +1,194 @@ - - - - - - - - - - - - - - - - - + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.0" /> + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent"> + - + app:layout_constraintTop_toTopOf="parent" /> - - - + - + - + - - + + app:layout_constraintTop_toTopOf="parent" /> - - - - - - - - + app:layout_constraintTop_toTopOf="parent" /> + + + + - - - - - - - - - - - - -