aboutsummaryrefslogtreecommitdiff
path: root/Client/BrzoDoLokacije/app/src/main/java/com/example
diff options
context:
space:
mode:
Diffstat (limited to 'Client/BrzoDoLokacije/app/src/main/java/com/example')
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt25
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityOpenedImages.kt83
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt27
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityUserProfile.kt32
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivity.kt102
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivityConversation.kt18
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/NavigationActivity.kt24
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/MonthViewsAdapter.kt63
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/MyPostsAdapter.kt10
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/OpenedPostImageAdapter.kt47
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostImageAdapter.kt12
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentProfileStatistics.kt98
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHomePageMainScroll.kt31
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt32
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt2
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt125
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt14
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt5
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Auth/ChangePass.kt6
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Statistics.kt18
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt54
21 files changed, 700 insertions, 128 deletions
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt
index 2501f8a..d403609 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt
@@ -3,34 +3,41 @@ package com.example.brzodolokacije.Activities
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
+
+import com.example.brzodolokacije.R
import android.widget.Button
+import android.widget.EditText
+import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.core.view.isVisible
import com.exam.DBHelper.Companion.activity
+import com.example.brzodolokacije.Models.Auth.ChangePass
import com.example.brzodolokacije.Models.UserReceive
-import com.example.brzodolokacije.R
import com.example.brzodolokacije.Services.RetrofitHelper
import com.example.brzodolokacije.Services.SharedPreferencesHelper
+import kotlinx.android.synthetic.main.fragment_my_profile_info.*
import retrofit2.Call
import retrofit2.Response
+
class ActivityChangePassword : AppCompatActivity() {
- private lateinit var oldPass:TextView
+ private lateinit var oldPass:EditText
private lateinit var oldPassError:TextView
- private lateinit var newPass:TextView
+ private lateinit var newPass:EditText
private lateinit var newPassError:TextView
- private lateinit var confirmPass:TextView
+ private lateinit var confirmPass:EditText
private lateinit var confirmPassError:TextView
private lateinit var forgotten:TextView
private lateinit var submit:Button
+ private lateinit var backButton:ImageView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_change_password)
- oldPass=findViewById(R.id.changeDataOldPassword)
+ oldPass=findViewById(R.id.tvActivityChangePasswordCurrentPass)
oldPassError=findViewById(R.id.ActivityChangePasswordOldError)
newPass=findViewById(R.id.tvActivityChangePasswordNewPass)
newPassError=findViewById(R.id.btnActivityChangePasswordNewError)
@@ -38,10 +45,14 @@ class ActivityChangePassword : AppCompatActivity() {
confirmPassError=findViewById(R.id.btnActivityChangePasswordConfirmError)
forgotten=findViewById(R.id.btnActivityChangePasswordForgottenPass)
submit=findViewById(R.id.ActivityChangePasswordChangePassword)
+ backButton=findViewById(R.id.btnBackToUser)
oldPassError.isVisible=false
newPassError.isVisible=false
confirmPassError.isVisible=false
+ backButton.setOnClickListener{
+ finish()
+ }
submit.setOnClickListener{
oldPassError.isVisible=false
@@ -54,10 +65,10 @@ class ActivityChangePassword : AppCompatActivity() {
if(newPass.text.toString().trim() == confirmPass.text.toString().trim()){
//PROVERI DA LI JE TRENUTA LOZINKA ISTA KAO TRENUTNI UNOS
-
+ var cp= ChangePass(oldPass.text.toString(),newPass.text.toString())
val authApi= RetrofitHelper.getInstance()
val token= SharedPreferencesHelper.getValue("jwt",this@ActivityChangePassword)
- val request=authApi.changePass("Bearer "+token)
+ val request=authApi.changePass("Bearer "+token,cp)
request.enqueue(object : retrofit2.Callback<Int> {
override fun onResponse(call: Call<Int>, response: Response<Int>) {
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityOpenedImages.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityOpenedImages.kt
new file mode 100644
index 0000000..d1f1e4c
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityOpenedImages.kt
@@ -0,0 +1,83 @@
+package com.example.brzodolokacije.Activities
+
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.os.Build
+import android.os.Bundle
+import android.provider.MediaStore
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.PagerSnapHelper
+import androidx.recyclerview.widget.RecyclerView
+import androidx.recyclerview.widget.SnapHelper
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.target.CustomTarget
+import com.bumptech.glide.request.transition.Transition
+import com.example.brzodolokacije.Adapters.OpenedPostImageAdapter
+import com.example.brzodolokacije.Models.PostImage
+import com.example.brzodolokacije.Models.PostPreview
+import com.example.brzodolokacije.Services.RetrofitHelper
+import com.example.brzodolokacije.databinding.ActivityOpenedImagesBinding
+import java.util.*
+
+class ActivityOpenedImages : AppCompatActivity() {
+ lateinit var binding:ActivityOpenedImagesBinding
+ var rvImages: RecyclerView?=null
+ var linearLayout:LinearLayoutManager?=null
+ var adapter:OpenedPostImageAdapter?=null
+ var images:List<PostImage>?=null
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding= ActivityOpenedImagesBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ images=(intent.extras?.getParcelable("post",PostPreview::class.java) as PostPreview).images
+ }
+ else{
+ images=(intent.extras?.getParcelable("post") as PostPreview?)?.images
+ }
+
+ setRecyclerView()
+ setListeners()
+ }
+
+ fun setListeners(){
+ binding.btnBackToPost.setOnClickListener {
+ finish()
+ }
+ binding.btnDownload.setOnClickListener {
+ //uzmi id trenutne slike
+ var selected:PostImage?=null
+ linearLayout?.findFirstVisibleItemPosition()?.let { it1 -> selected=images?.get(it1) }
+ if(selected!=null){
+ //sacuvaj na telefonu
+ var image=Glide.with(this)
+ .asBitmap()
+ .load(RetrofitHelper.baseUrl + "/api/post/image/" + selected!!._id)
+ .into(object : CustomTarget<Bitmap>(){
+ override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
+ Toast.makeText(this@ActivityOpenedImages,"Slika se preuzima...",Toast.LENGTH_LONG).show()
+ MediaStore.Images.Media.insertImage(contentResolver, resource, "odyssey_"+ Calendar.getInstance().timeInMillis , "");
+ Toast.makeText(this@ActivityOpenedImages,"Slika je sačuvana.",Toast.LENGTH_LONG).show()
+ }
+ override fun onLoadCleared(placeholder: Drawable?) {
+ }
+ })
+ }
+ }
+ }
+
+ fun setRecyclerView(){
+ rvImages=binding.rvImages
+ linearLayout= LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false)
+ adapter= OpenedPostImageAdapter(images,this)
+ rvImages!!.setHasFixedSize(true)
+ var snap:SnapHelper=PagerSnapHelper()
+ snap.attachToRecyclerView(rvImages)
+ rvImages!!.layoutManager=linearLayout
+ rvImages!!.adapter=adapter
+ }
+
+} \ No newline at end of file
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 b7848df..623b670 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
@@ -5,7 +5,6 @@ import android.graphics.Color
import android.os.Bundle
import android.preference.PreferenceManager
import android.util.TypedValue
-import android.view.View
import android.view.ViewGroup
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
@@ -16,7 +15,9 @@ import androidx.core.view.isVisible
import androidx.core.view.setMargins
import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView
+import androidx.recyclerview.widget.SnapHelper
import com.auth0.android.jwt.JWT
import com.example.brzodolokacije.Adapters.CommentsAdapter
import com.example.brzodolokacije.Adapters.PostImageAdapter
@@ -31,7 +32,6 @@ import com.example.brzodolokacije.Services.RetrofitHelper
import com.example.brzodolokacije.Services.SharedPreferencesHelper
import com.example.brzodolokacije.databinding.ActivitySinglePostBinding
import com.google.gson.Gson
-import kotlinx.android.synthetic.main.fragment_single_post_description.*
import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.tilesource.TileSourceFactory
import org.osmdroid.util.GeoPoint
@@ -51,8 +51,11 @@ class ActivitySinglePost : AppCompatActivity() {
private var recyclerViewComments: RecyclerView?=null
private var favouriteImage: ImageView?=null
private lateinit var tagLayout: LinearLayout
+ private lateinit var createdAt:TextView
public lateinit var post: PostPreview
+ public lateinit var ratings:TextView
+ public lateinit var ratingscount:TextView
private var comments:MutableList<CommentSend>?=mutableListOf()
private var starNumber:Number=0
@@ -94,6 +97,8 @@ class ActivitySinglePost : AppCompatActivity() {
//DODATI SLIKE
recyclerViewImages?.setHasFixedSize(true)
+ var snap: SnapHelper = PagerSnapHelper()
+ snap.attachToRecyclerView(recyclerViewImages)
recyclerViewImages?.layoutManager = layoutManagerImages
recyclerViewImages?.adapter = adapterImages
@@ -140,7 +145,6 @@ class ActivitySinglePost : AppCompatActivity() {
recyclerViewImages?.setHasFixedSize(true)
recyclerViewImages?.layoutManager = layoutManagerImages
recyclerViewImages?.adapter = adapterImages
-
}
btnChangeHeightDown.setOnClickListener {
btnChangeHeightDown.isVisible=false
@@ -184,6 +188,8 @@ class ActivitySinglePost : AppCompatActivity() {
}
fun loadTags(){
+
+
if(post.tags!=null)
for( item in post.tags!!){
var newbtn = Button(this)
@@ -193,17 +199,23 @@ class ActivitySinglePost : AppCompatActivity() {
50
)
layoutParams.setMargins(3)
- newbtn.layoutParams=layoutParams
+
+ newbtn.layoutParams = layoutParams
newbtn.setBackgroundColor(Color.parseColor("#1C789A"))
newbtn.setTextColor(Color.WHITE)
newbtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F)
- newbtn.setPadding(3,1,3,1)
- newbtn.isClickable=false
+ newbtn.setPadding(3, 1, 3, 1)
+ newbtn.isClickable = false
tagLayout.addView(newbtn)
}
+ }
+ public fun updateratings(rc:Int,r:Double){
+ binding.tvRating.text=r.toString()
+ binding.tvNumberOfRatings.text=rc.toString()
}
+
fun loadFavourite(){
if(post.favourites!=null){
var jwtString=SharedPreferencesHelper.getValue("jwt",this)
@@ -277,7 +289,8 @@ class ActivitySinglePost : AppCompatActivity() {
tvNumberOfRatings.invalidate()
//tvRating.text=String.format("%.2f",data.ratings)
//tvNumberOfRatings.text=String.format("%d",data.ratingscount)
-
+ tvDatePosted.text=post.createdAt.toLocaleString()
+ tvDatePosted.invalidate()
}
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityUserProfile.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityUserProfile.kt
index 4962006..b568d73 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityUserProfile.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityUserProfile.kt
@@ -92,14 +92,16 @@ class ActivityUserProfile : AppCompatActivity() {
call: Call<Boolean>,
response: Response<Boolean>
) {
- unfollowUser.isVisible=true
- unfollowUser.isClickable=true
- unfollowUser.isEnabled=true
- followUser.isVisible=false
- followUser.isClickable=false
- followUser.isEnabled=false
+ if(response.body()==true) {
+ unfollowUser.isVisible = true
+ unfollowUser.isClickable = true
+ unfollowUser.isEnabled = true
+ followUser.isVisible = false
+ followUser.isClickable = false
+ followUser.isEnabled = false
- updateUserData()
+ updateUserData()
+ }
Toast.makeText(
this@ActivityUserProfile, "PRATITE KORISNIKA", Toast.LENGTH_LONG
@@ -123,13 +125,15 @@ class ActivityUserProfile : AppCompatActivity() {
call: Call<Boolean>,
response: Response<Boolean>
) {
- unfollowUser.isVisible = false
- unfollowUser.isClickable = false
- unfollowUser.isEnabled = false
- followUser.isVisible = true
- followUser.isClickable = true
- followUser.isEnabled = true
- updateUserData()
+ if(response.body()==true) {
+ unfollowUser.isVisible = false
+ unfollowUser.isClickable = false
+ unfollowUser.isEnabled = false
+ followUser.isVisible = true
+ followUser.isClickable = true
+ followUser.isEnabled = true
+ updateUserData()
+ }
Toast.makeText(
this@ActivityUserProfile, "VIŠE NE PRATITE KORISNIKA", Toast.LENGTH_LONG
).show();
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 9c489b3..6d8afd6 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
@@ -24,6 +24,7 @@ import com.example.brzodolokacije.Models.MessageReceive
import com.example.brzodolokacije.R
import com.example.brzodolokacije.Services.RetrofitHelper
import com.example.brzodolokacije.Services.SharedPreferencesHelper
+import com.example.brzodolokacije.chat.Notifications
import com.example.brzodolokacije.chat.SignalRListener
import com.example.brzodolokacije.databinding.ActivityChatBinding
import kotlinx.coroutines.MainScope
@@ -50,41 +51,9 @@ class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding= ActivityChatBinding.inflate(layoutInflater)
- permissionLauncher=registerForActivityResult(
- ActivityResultContracts.RequestPermission()
- ) { isGranted: Boolean ->
- if (!isGranted) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- if (Build.VERSION.SDK_INT >= 33) {
- //ako je upravo odbijena dozvola na uredjaju na kome je ona neophodna
- binding.btnNotifications.setImageResource(R.drawable.bell_off)
- }
- else{
- //ako je upravo odbijena dozvola na uredjaju na kome nije ona neophodna
- binding.btnNotifications.setImageResource(R.drawable.bell_on)
- }
- }
- else{
- //ako je upravo odbijena dozvola na uredjaju na kome nije ona neophodna
- binding.btnNotifications.setImageResource(R.drawable.bell_on)
- }
- }
- else{
- //ako je upravo prihvacena dozvola na uredjaju na kome nije ona neophodna
- binding.btnNotifications.setImageResource(R.drawable.bell_on)
- }
- }
- //provera da li je dozvoljeno
- when {
- ContextCompat.checkSelfPermission(this,Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED -> {
- binding.btnNotifications.setImageResource(R.drawable.bell_on)
- }
- else -> {
- binding.btnNotifications.setImageResource(R.drawable.bell_off)
- }
- }
-
-
+ Notifications.makeChannel(this)
+ setPermissionLauncher()
+ checkPermissions()
setContentView(binding.root)
dbConnection= DBHelper(this@ChatActivity,null)
ws=SignalRListener.getInstance(this@ChatActivity)
@@ -106,6 +75,46 @@ class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener {
requestNewMessages()
}
+ fun setPermissionLauncher(){
+ permissionLauncher=registerForActivityResult(
+ ActivityResultContracts.RequestPermission()
+ ) { isGranted: Boolean ->
+ if (!isGranted) {
+ binding.btnNotifications.setImageResource(R.drawable.bell_off)
+ }
+ else{
+ binding.btnNotifications.setImageResource(R.drawable.bell_on)
+ }
+ }
+ }
+
+ fun checkPermissions(){
+ when {
+ //treba proveriti permisije
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU-> {
+ if(ContextCompat.checkSelfPermission(this,Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
+ binding.btnNotifications.setImageResource(R.drawable.bell_on)
+ }
+ else{
+ binding.btnNotifications.setImageResource(R.drawable.bell_off)
+ }
+ }
+ //treba proveriti preference
+ else-> {
+ if(SharedPreferencesHelper.getValue("notifications",this)==null){
+ SharedPreferencesHelper.addValue("notifications","false",this@ChatActivity)
+ }
+ else if (SharedPreferencesHelper.getValue("notifications",this)=="true") {
+ binding.btnNotifications.setImageResource(R.drawable.bell_on)
+ }
+ else{
+ binding.btnNotifications.setImageResource(R.drawable.bell_off)
+ }
+ }
+
+ }
+ }
+
fun launchNotificationPermissionPrompt(){
permissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS)
}
@@ -131,15 +140,28 @@ class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener {
}
findViewById<ImageButton>(R.id.btnNotifications).setOnClickListener {
when {
- ContextCompat.checkSelfPermission(this,Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED -> {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ //treba proveriti permisije
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU-> {
+ if(ContextCompat.checkSelfPermission(this,Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
revokeSelfPermissionOnKill(Manifest.permission.POST_NOTIFICATIONS)
+ launchInfoDialog()
+ }
+ else{
+ launchNotificationPermissionPrompt()
}
- launchInfoDialog()
}
- else -> {
- launchNotificationPermissionPrompt()
+ //treba proveriti preference
+ else-> {
+ if (SharedPreferencesHelper.getValue("notifications",this)=="true") {
+ SharedPreferencesHelper.addValue("notifications","false",this@ChatActivity)
+ binding.btnNotifications.setImageResource(R.drawable.bell_off)
+ }
+ else{
+ SharedPreferencesHelper.addValue("notifications","true",this@ChatActivity)
+ binding.btnNotifications.setImageResource(R.drawable.bell_on)
+ }
}
+
}
}
}
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 04dd9de..b81867e 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
@@ -11,6 +11,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.auth0.android.jwt.JWT
+import com.bumptech.glide.Glide
import com.exam.DBHelper
import com.example.brzodolokacije.Adapters.ChatMessagesAdapter
import com.example.brzodolokacije.Models.Message
@@ -39,6 +40,7 @@ class ChatActivityConversation : AppCompatActivity() {
var webSocketConnection:SignalRListener?=null
var items:MutableList<Message>?=mutableListOf()
var userImage:Bitmap?=null
+ var userImageId:String?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -46,7 +48,12 @@ 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?
+ if(intent.extras?.get("pfp") is Bitmap){
+ userImage=intent.extras?.get("pfp") as Bitmap?
+ }
+ else{
+ userImageId=intent.extras?.get("pfp") as String?
+ }
dbConnection=DBHelper.getInstance(this@ChatActivityConversation)
setHeader()
setRecyclerView()
@@ -172,8 +179,15 @@ class ChatActivityConversation : AppCompatActivity() {
binding.btnBack.setOnClickListener {
finish()
}
- if(userImage!=null)
+ if(userImage!=null){
binding.ivUserImage.setImageBitmap(userImage)
+ }
+ else if(userImageId!=null){
+ Glide.with(this)
+ .load(RetrofitHelper.baseUrl + "/api/post/image/compress/" + userImageId!!)
+ .circleCrop()
+ .into(binding.ivUserImage)
+ }
}
fun setRecyclerView(setParams:Boolean=true){
MainScope().launch {
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 23cbca6..4e355b6 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
@@ -1,18 +1,19 @@
package com.example.brzodolokacije.Activities
import android.content.Intent
-import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
-import android.widget.Button
import android.widget.ImageButton
import android.widget.Toast
-import androidx.appcompat.app.AppCompatDelegate
+import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.example.brzodolokacije.Fragments.*
import com.example.brzodolokacije.R
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.bottomsheet.BottomSheetDialog
+import kotlinx.coroutines.MainScope
+import kotlinx.coroutines.launch
+import net.yslibrary.android.keyboardvisibilityevent.KeyboardVisibilityEvent
class NavigationActivity : AppCompatActivity() {
@@ -33,6 +34,7 @@ class NavigationActivity : AppCompatActivity() {
val profileFragment=FragmentProfile()
bottomNav=findViewById<View>(R.id.bottomNavigationView) as BottomNavigationView
setCurrentFragment(fragmentHomePage)
+ KeyboardEvents()
bottomNav.setOnNavigationItemSelectedListener {
when(it.itemId){
R.id.navHomePage->setCurrentFragment(fragmentHomePage)
@@ -115,5 +117,21 @@ class NavigationActivity : AppCompatActivity() {
}
}
+ fun KeyboardEvents(){
+ KeyboardVisibilityEvent.setEventListener(
+ this
+ ) { isOpen ->
+ if (isOpen) {
+ bottomNav.visibility = View.GONE
+ bottomNav.forceLayout()
+
+ } else {
+ MainScope().launch {
+ bottomNav.visibility = View.VISIBLE
+ bottomNav.forceLayout()
+ }
+ }
+ }
+ }
} \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/MonthViewsAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/MonthViewsAdapter.kt
new file mode 100644
index 0000000..240deb0
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/MonthViewsAdapter.kt
@@ -0,0 +1,63 @@
+package com.example.brzodolokacije.Adapters
+
+import android.app.Activity
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.example.brzodolokacije.Models.MonthlyViews
+import com.example.brzodolokacije.databinding.SingleDateViewBinding
+
+class MonthViewsAdapter (val activity: Activity, val items : MutableList<MonthlyViews>)
+ : RecyclerView.Adapter<MonthViewsAdapter.ViewHolder>() {
+
+
+ private lateinit var binding: SingleDateViewBinding
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+ val inflater = LayoutInflater.from(parent.context)
+ binding = SingleDateViewBinding.inflate(inflater, parent, false)
+ return ViewHolder(binding)
+ }
+
+
+
+
+ override fun getItemCount() = items.size
+ inner class ViewHolder(itemView: SingleDateViewBinding) : RecyclerView.ViewHolder(itemView.root) {
+ fun bind(item: MonthlyViews) {
+ binding.apply {
+ tvMonth.text=numberToMonthName(item.month)
+ tvMonthViews.text=item.views.toString()
+
+ }
+ }
+ }
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ return holder.bind(items[position])
+
+ }
+ fun numberToMonthName(number:Int):String{
+ var text=""
+ when (number) {
+ 1 -> text="Januar"
+ 2 -> text="Februar"
+ 3 -> text="Mart"
+ 4 -> text="April"
+ 5 -> text="Maj"
+ 6 -> text="Jun"
+ 7 -> text="Jul"
+ 8 -> text="Avgust"
+ 9 -> text="Septembar"
+ 10 -> text="Oktobar"
+ 11 -> text="Novembar"
+ 12 -> text="Decembar"
+ else -> {
+ text = "nedefinisan"
+ }
+ }
+
+ return text
+
+ }
+
+}
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/MyPostsAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/MyPostsAdapter.kt
index e557e02..de7d619 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/MyPostsAdapter.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/MyPostsAdapter.kt
@@ -2,12 +2,9 @@ package com.example.brzodolokacije.Adapters
import android.app.Activity
import android.content.Intent
-import android.graphics.BitmapFactory
-import android.os.AsyncTask
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
-import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.brzodolokacije.Activities.ActivitySinglePost
@@ -17,11 +14,6 @@ import com.example.brzodolokacije.Models.PostPreview
import com.example.brzodolokacije.Services.RetrofitHelper
import com.example.brzodolokacije.Services.SharedPreferencesHelper
import com.example.brzodolokacije.databinding.PostPreviewBinding
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
-import okhttp3.ResponseBody
-import retrofit2.Call
-import retrofit2.Response
class MyPostsAdapter (val activity:Activity,val items : MutableList<PostPreview>)
@@ -29,8 +21,6 @@ class MyPostsAdapter (val activity:Activity,val items : MutableList<PostPreview>
private lateinit var token: String
private lateinit var imageApi: IBackendApi
- //constructer has one argument - list of objects that need to be displayed
- //it is bound to xml of single item
private lateinit var binding: PostPreviewBinding
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context)
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/OpenedPostImageAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/OpenedPostImageAdapter.kt
new file mode 100644
index 0000000..525549d
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/OpenedPostImageAdapter.kt
@@ -0,0 +1,47 @@
+package com.example.brzodolokacije.Adapters
+
+import android.app.Activity
+import android.net.Uri
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.example.brzodolokacije.Models.PostImage
+import com.example.brzodolokacije.Services.RetrofitHelper
+import com.example.brzodolokacije.databinding.OpenedPostImageBinding
+import com.github.piasy.biv.BigImageViewer
+import com.github.piasy.biv.loader.glide.GlideImageLoader
+import com.github.piasy.biv.view.BigImageView
+
+class OpenedPostImageAdapter(val items:List<PostImage>?,val activity:Activity): RecyclerView.Adapter<OpenedPostImageAdapter.ViewHolder>() {
+ lateinit var binding:OpenedPostImageBinding
+
+ inner class ViewHolder(itemView: OpenedPostImageBinding) : RecyclerView.ViewHolder(itemView.root) {
+ fun bind(item:PostImage){
+ binding.apply {
+ ivOpenedImage.setInitScaleType(BigImageView.INIT_SCALE_TYPE_FIT_START)
+ ivOpenedImage.showImage(Uri.parse(RetrofitHelper.baseUrl + "/api/post/image/compress/" + item._id))
+ }
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+ BigImageViewer.initialize(GlideImageLoader.with(activity))
+ val inflater = LayoutInflater.from(parent.context)
+ binding= OpenedPostImageBinding.inflate(inflater,parent,false)
+ return ViewHolder(binding)
+ }
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ holder.bind(items!![position])
+ }
+
+ override fun getItemCount(): Int {
+ if(items==null){
+ return 0
+ }
+ else{
+ return items.size
+ }
+ }
+
+} \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostImageAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostImageAdapter.kt
index 74bfd92..f3a8345 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostImageAdapter.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostImageAdapter.kt
@@ -1,17 +1,16 @@
package com.example.brzodolokacije.Adapters
import android.app.Activity
-import android.graphics.BitmapFactory
-import android.media.Image
+import android.content.Intent
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
-import com.example.brzodolokacije.Models.Post
+import com.example.brzodolokacije.Activities.ActivityOpenedImages
+import com.example.brzodolokacije.Activities.ActivitySinglePost
import com.example.brzodolokacije.Models.PostImage
import com.example.brzodolokacije.Services.RetrofitHelper
import com.example.brzodolokacije.databinding.PostImageBinding
-import com.example.brzodolokacije.databinding.PostPreviewBinding
class PostImageAdapter(val activity: Activity, val items : MutableList<PostImage>)
: RecyclerView.Adapter<PostImageAdapter.ViewHolder>(){
@@ -37,6 +36,11 @@ class PostImageAdapter(val activity: Activity, val items : MutableList<PostImage
.into(locationImage)
}
}
+ itemView.setOnClickListener {
+ val intent: Intent = Intent(activity, ActivityOpenedImages::class.java)
+ intent.putExtra("post",(activity as ActivitySinglePost).post)
+ activity.startActivity(intent)
+ }
}
}
} \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentProfileStatistics.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentProfileStatistics.kt
new file mode 100644
index 0000000..fb4c563
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentProfileStatistics.kt
@@ -0,0 +1,98 @@
+package com.example.brzodolokacije
+
+import android.os.Bundle
+import android.util.Log
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import android.widget.Toast
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.example.brzodolokacije.Adapters.MonthViewsAdapter
+import com.example.brzodolokacije.Adapters.MyPostsAdapter
+import com.example.brzodolokacije.Models.MonthlyViews
+import com.example.brzodolokacije.Models.Statistics
+import com.example.brzodolokacije.Models.UserReceive
+import com.example.brzodolokacije.Services.RetrofitHelper
+import com.example.brzodolokacije.Services.SharedPreferencesHelper
+import retrofit2.Call
+import retrofit2.Response
+
+
+class FragmentProfileStatistics : Fragment() {
+
+ private var stats:Statistics?=null
+ private var username:String?=null
+ private lateinit var totalViews:TextView
+ private lateinit var numberOfRatings:TextView
+ private lateinit var averageRatings:TextView
+ private lateinit var numberOfFavourite:TextView
+ private lateinit var rcMonths:RecyclerView
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ var view=inflater.inflate(R.layout.fragment_profile_statistics, container, false)
+ username=this.requireArguments().getString("username")
+ totalViews=view.findViewById(R.id.tvProfileStatisticsViews)
+ numberOfRatings=view.findViewById(R.id.tvProfileStatisticsRatingNumber)
+ averageRatings=view.findViewById(R.id.tvProfileStatisticsAverageRating)
+ numberOfFavourite=view.findViewById(R.id.tvProfileStatisticsFavouriteNumber)
+ rcMonths=view.findViewById(R.id.rvFragmentProfileStatisticsMonths)
+
+
+
+ loadStats()
+
+ return view
+ }
+
+
+ fun loadStats(){
+ val authApi= RetrofitHelper.getInstance()
+ val token= SharedPreferencesHelper.getValue("jwt", requireActivity())
+ val request=authApi.getUserStatsFromUsername("Bearer "+token,username!!)
+
+ request.enqueue(object : retrofit2.Callback<Statistics?> {
+ override fun onResponse(call: Call<Statistics?>, response: Response<Statistics?>) {
+ if(response.isSuccessful()){
+ stats=response.body()
+ loadText()
+ loadMonths()
+
+
+ }
+ }
+ override fun onFailure(call: Call<Statistics?>, t: Throwable) {
+ Toast.makeText(
+ activity, t.toString(), Toast.LENGTH_LONG
+ ).show();
+ }
+ })
+
+ }
+ fun loadText(){
+ totalViews.text=stats!!.totalViews.toString()
+ numberOfRatings.text=stats!!.numberOfRatingsOnPosts.toString()
+ averageRatings.text=stats!!.averagePostRatingOnPosts.toString()
+ numberOfFavourite.text=stats!!.numberOfFavouritePosts.toString()
+ }
+ private fun loadMonths(){
+ rcMonths.apply {
+ layoutManager= GridLayoutManager(requireContext(),1, GridLayoutManager.HORIZONTAL,false)
+ adapter= MonthViewsAdapter(requireActivity(),
+ stats!!.monthlyViews as MutableList<MonthlyViews>
+ )
+
+ }
+ }
+
+
+} \ No newline at end of file
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 82c78a1..df41b3a 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
@@ -8,11 +8,11 @@ import android.widget.Button
import android.widget.ImageButton
import android.widget.LinearLayout
import android.widget.Toast
-import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
import com.example.brzodolokacije.Adapters.ShowPostsHomePageAdapter
import com.example.brzodolokacije.Interfaces.IBackendApi
import com.example.brzodolokacije.Models.LocationType
@@ -20,15 +20,15 @@ import com.example.brzodolokacije.Models.PostPreview
import com.example.brzodolokacije.R
import com.example.brzodolokacije.Services.RetrofitHelper
import com.example.brzodolokacije.Services.SharedPreferencesHelper
-import kotlinx.android.synthetic.main.fragment_home_page_main_scroll.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
-class FragmentHomePageMainScroll : Fragment() {
+class FragmentHomePageMainScroll : Fragment(),OnRefreshListener {
+ private lateinit var swipeRefreshLayout: SwipeRefreshLayout
private lateinit var posts : MutableList<PostPreview>
private lateinit var mostViewedPosts : MutableList<PostPreview>
private lateinit var newestPosts : MutableList<PostPreview>
@@ -79,7 +79,7 @@ private lateinit var change:Button
location_waterfall=view.findViewById(R.id.btnFragmentHomePagelocation_waterfall)
//pokupi sve objave iz baze'
- getAllPosts()
+ //getAllPosts()
var bundle=Bundle()
var fragment=FragmentShowPostsByLocation()
@@ -190,9 +190,29 @@ private lateinit var change:Button
}
*/
+ swipeRefreshLayout = view.findViewById<View>(R.id.swipeContainer) as SwipeRefreshLayout
+ swipeRefreshLayout.setOnRefreshListener(this)
+ swipeRefreshLayout.setColorSchemeResources(
+ R.color.purple_200,
+ R.color.teal_200,
+ R.color.dark_blue_transparent,
+ R.color.purple_700
+ )
+ swipeRefreshLayout.post(kotlinx.coroutines.Runnable {
+ swipeRefreshLayout.isRefreshing=true
+ })
return view
}
+ override fun onRefresh() {
+ getAllPosts()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ getAllPosts()
+ }
+
private fun getAllPosts(){
Toast.makeText(
activity," get all", Toast.LENGTH_LONG
@@ -289,6 +309,7 @@ private lateinit var change:Button
layoutManager= LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL,false)
adapter= ShowPostsHomePageAdapter(newestposts,requireActivity())
}
+ swipeRefreshLayout.isRefreshing=false
}
override fun onFailure(call: Call<MutableList<PostPreview>>, t: Throwable) {
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt
index 23de46e..5d1530d 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt
@@ -1,18 +1,19 @@
package com.example.brzodolokacije.Fragments
+
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
-import androidx.core.content.ContextCompat.startActivity
import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentTransaction
import com.exam.DBHelper
import com.example.brzodolokacije.Activities.ActivityChangePassword
import com.example.brzodolokacije.Activities.ActivityChangeUserData
-import com.example.brzodolokacije.Activities.ActivityForgottenPassword
import com.example.brzodolokacije.Activities.ActivityLoginRegister
+import com.example.brzodolokacije.FragmentProfileStatistics
import com.example.brzodolokacije.R
import com.example.brzodolokacije.Services.SharedPreferencesHelper
@@ -20,6 +21,7 @@ import com.example.brzodolokacije.Services.SharedPreferencesHelper
class FragmentMyProfileInfo : Fragment() {
private lateinit var logout:Button
private lateinit var changeAccount:Button
+ private lateinit var statistics:Button
private lateinit var changePassword:Button
override fun onCreateView(
@@ -31,6 +33,7 @@ class FragmentMyProfileInfo : Fragment() {
logout=view.findViewById<View>(R.id.buttonLogOut) as Button
changeAccount=view.findViewById(R.id.changeAccountData)
+ statistics=view.findViewById<View>(R.id.getAccoutStatistics) as Button
changePassword=view.findViewById(R.id.ChangePassword)
logout.setOnClickListener{
@@ -41,6 +44,31 @@ class FragmentMyProfileInfo : Fragment() {
val intent = Intent (getActivity(), ActivityChangeUserData::class.java)
getActivity()?.startActivity(intent)
}
+
+ statistics.setOnClickListener {
+
+ val manager: androidx.fragment.app.FragmentManager? = fragmentManager
+ val transaction: FragmentTransaction = manager!!.beginTransaction()
+
+ var fragment:FragmentProfileStatistics=FragmentProfileStatistics()
+ val bundle = Bundle()
+ var parentFragment:FragmentProfile=parentFragment as FragmentProfile
+ var username=parentFragment.usernameStringSend
+ bundle.putString("username", username)
+ fragment.arguments=bundle
+
+
+
+ transaction.replace(R.id.flFragmentProfileFragmentContainer,fragment )
+ transaction.commit()
+
+
+
+
+
+ }
+
+
changePassword.setOnClickListener {
val intent = Intent (getActivity(), ActivityChangePassword::class.java)
getActivity()?.startActivity(intent)
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt
index 6fe4678..a9858e2 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt
@@ -60,6 +60,7 @@ class FragmentProfile : Fragment(com.example.brzodolokacije.R.layout.fragment_pr
private lateinit var profilePicturePlus: MaterialButton
private lateinit var showFollowers: TextView
private lateinit var showFollowing: TextView
+ public var usernameStringSend:String?=null
override fun onCreateView(
@@ -208,6 +209,7 @@ class FragmentProfile : Fragment(com.example.brzodolokacije.R.layout.fragment_pr
private fun setUserInfo(user:UserReceive){
name.setText(user.name)
username.setText("@"+user.username)
+ usernameStringSend=user.username
postsCount.setText(user.postcount.toString())
Log.d("follno",user.followersCount.toString())
Log.d("follno","helllllllllllllllllllllppppppppppppppppppppppppppppppp")
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
index 1f17a11..6e37052 100644
--- 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
@@ -1,21 +1,24 @@
package com.example.brzodolokacije.Fragments
+import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import android.widget.ImageButton
+import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
-import android.widget.Toast
+import androidx.core.view.isGone
+import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
+import com.example.brzodolokacije.Activities.ActivitySinglePost
+import com.example.brzodolokacije.Activities.NavigationActivity
import com.example.brzodolokacije.Models.*
import com.example.brzodolokacije.R
import com.example.brzodolokacije.Services.RetrofitHelper
import com.example.brzodolokacije.Services.SharedPreferencesHelper
import com.google.gson.Gson
-import org.w3c.dom.Text
import retrofit2.Call
import retrofit2.Response
@@ -30,6 +33,13 @@ class FragmentSinglePostDescription : Fragment() {
private lateinit var star5:ImageView
private var starNumber:Number=0
private lateinit var post:PostPreview
+ private lateinit var parentact:ActivitySinglePost
+ private lateinit var ocenitext:TextView
+ private lateinit var userid:String
+ private lateinit var del:TextView
+ private lateinit var delbtn:Button
+ private lateinit var delbtnY:Button
+ private lateinit var delbtnN:Button
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
@@ -37,7 +47,7 @@ class FragmentSinglePostDescription : Fragment() {
): View? {
var view=inflater.inflate(R.layout.fragment_single_post_description, container, false)
-
+ parentact = activity as ActivitySinglePost
//uzmi post prosledjen iz single post
@@ -45,10 +55,18 @@ class FragmentSinglePostDescription : Fragment() {
var jsonPostObject = args!!.getString("post")
post= Gson().fromJson(jsonPostObject, PostPreview::class.java)
+
//setuj opis
descriptionContainer=view.findViewById(R.id.tvDescription)
descriptionContainer.text=post.description.toString()
+
+ del=view.findViewById(R.id.tvObrisi)
+ delbtn=view.findViewById(R.id.btnObrisi)
+ delbtnY=view.findViewById(R.id.btnObrisiY)
+ delbtnN=view.findViewById(R.id.btnObrisiN)
+ userid=""
+ ocenitext=view.findViewById(R.id.title)
//setuj zvezdice
star1=view.findViewById(R.id.rateStar1)
star2=view.findViewById(R.id.rateStar2)
@@ -57,15 +75,17 @@ class FragmentSinglePostDescription : Fragment() {
star5=view.findViewById(R.id.rateStar5)
setRatingListeners()
+
val alreadyrated= RatingReceive(starNumber.toInt(),post._id)
requestAddRating(alreadyrated)
-
+ toggleStarRatings()
return view
}
fun setRatingListeners() {
val emptyStar = R.drawable.ic_round_star_outline_24
val fullStar = R.drawable.ic_baseline_star_rate_24
+ val offStar = R.drawable.ic_baseline_star_24
star1.setOnClickListener {
//Toast.makeText(this,"kliknuta prva zvezdica",Toast.LENGTH_SHORT).show()
@@ -140,9 +160,11 @@ class FragmentSinglePostDescription : Fragment() {
"--------------",
data.ratings.toString() + " " + data.ratingscount.toString()
)
+ parentact.updateratings(data.ratingscount,data.ratings)
if(rating.rating==0) {
val emptyStar = R.drawable.empty_star
val fullStar = R.drawable.ic_baseline_star_rate_24
+
when (data.myrating) {
1 -> {
star1.setImageResource(fullStar)
@@ -204,4 +226,97 @@ class FragmentSinglePostDescription : Fragment() {
}
})
}
+ fun toggleStarRatings(){
+ var token= SharedPreferencesHelper.getValue("jwt", requireActivity()).toString()
+ val api= RetrofitHelper.getInstance()
+ val request= api.getUserId("Bearer " + token)
+ request.enqueue(object : retrofit2.Callback<String> {
+ override fun onResponse(call: Call<String>,
+ response: Response<String>
+ ) {
+ if (response.body() == null) {
+ return
+ }
+ userid=response.body().toString()
+ Log.d("UID TEST",userid)
+ if(post.ownerId==userid){
+ //val offStar = R.drawable.ic_baseline_star_24
+ ocenitext.text="Vlasnik posta ne moze ocenjivati sebe"
+ /*star1.setImageResource(offStar)
+ star2.setImageResource(offStar)
+ star3.setImageResource(offStar)
+ star4.setImageResource(offStar)
+ star5.setImageResource(offStar)*/
+ star1.isEnabled=false
+ star2.isEnabled=false
+ star3.isEnabled=false
+ star4.isEnabled=false
+ star5.isEnabled=false
+
+ ocenitext.isVisible=false
+ ocenitext.isGone=true
+ star1.isVisible=false
+ star1.isGone=true
+ star2.isVisible=false
+ star2.isGone=true
+ star3.isVisible=false
+ star3.isGone=true
+ star4.isVisible=false
+ star4.isGone=true
+ star5.isVisible=false
+ star5.isGone=true
+
+ delbtn.isGone=false
+ delbtn.setOnClickListener{
+ del.isGone=false
+ delbtnY.isGone=false
+ delbtnN.isGone=false
+ delbtn.isGone=true
+ delbtnY.setOnClickListener {
+ deletePostreq()
+ }
+ delbtnN.setOnClickListener {
+ del.isGone=true
+ delbtnY.isGone=true
+ delbtnN.isGone=true
+ delbtn.isGone=false
+ }
+ }
+
+
+ }
+ }
+
+ override fun onFailure(call: Call<String>, t: Throwable) {
+
+ }
+ })
+
+
+ }
+
+ fun deletePostreq(){
+ var token= SharedPreferencesHelper.getValue("jwt", requireActivity()).toString()
+ val api= RetrofitHelper.getInstance()
+ val request= api.DeletePost("Bearer " + token,post._id)
+ request.enqueue(object : retrofit2.Callback<String> {
+ override fun onResponse(
+ call: Call<String>,
+ response: Response<String>
+ ) {
+ if(response.isSuccessful){
+ SharedPreferencesHelper.addValue("jwt",token,activity!!)
+ val intent= Intent(activity!!, NavigationActivity::class.java)
+ startActivity(intent)
+ activity!!.finish()
+ }
+
+ }
+
+ override fun onFailure(call: Call<String>, t: Throwable) {
+
+ }
+ })
+ }
+
} \ No newline at end of file
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 960c56d..cc04669 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
@@ -1,10 +1,7 @@
package com.example.brzodolokacije.Interfaces
import com.example.brzodolokacije.Models.*
-import com.example.brzodolokacije.Models.Auth.JustMail
-import com.example.brzodolokacije.Models.Auth.Login
-import com.example.brzodolokacije.Models.Auth.Register
-import com.example.brzodolokacije.Models.Auth.ResetPass
+import com.example.brzodolokacije.Models.Auth.*
import okhttp3.MultipartBody
import okhttp3.RequestBody
import okhttp3.ResponseBody
@@ -123,6 +120,11 @@ interface IBackendApi {
@POST("/api/user/changePass")
- fun changePass(@Header("Authorization") authHeader:String):Call<Int>
-
+ fun changePass(@Header("Authorization") authHeader:String,@Body changePass:ChangePass):Call<Int>
+ @GET("/api/user/{username}/profile/stats")
+ fun getUserStatsFromUsername(@Header("Authorization") authHeader:String,@Path("username") username:String):Call<Statistics>
+ @GET("/api/auth/jwttoid")
+ fun getUserId(@Header("Authorization") authHeader:String):Call<String>
+ @DELETE("api/Post/posts/delete/{id}")
+ fun DeletePost(@Header("Authorization") authHeader:String,@Path("id") id:String):Call<String>
} \ No newline at end of file
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt
index acce7b3..885f7f2 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt
@@ -9,7 +9,6 @@ import com.example.brzodolokacije.Activities.ActivityLoginRegister
import com.example.brzodolokacije.Activities.NavigationActivity
import com.example.brzodolokacije.Services.RetrofitHelper
import com.example.brzodolokacije.Services.SharedPreferencesHelper
-import com.example.brzodolokacije.chat.Notifications
import retrofit2.Call
import retrofit2.Response
@@ -23,7 +22,6 @@ class MainActivity : AppCompatActivity() {
val intent:Intent
if(checkLoggedIn()) {
- Notifications.makeChannel(this)
intent = Intent(this, NavigationActivity::class.java)
}
else
@@ -64,6 +62,9 @@ class MainActivity : AppCompatActivity() {
}else{
if(response.errorBody()!=null)
Toast.makeText(applicationContext, response.errorBody()!!.string(), Toast.LENGTH_LONG).show();
+ intent= Intent(this@MainActivity, ActivityLoginRegister::class.java)
+ SharedPreferencesHelper.removeValue("jwt",this@MainActivity)
+ startActivity(intent)
}
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Auth/ChangePass.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Auth/ChangePass.kt
new file mode 100644
index 0000000..46957df
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Auth/ChangePass.kt
@@ -0,0 +1,6 @@
+package com.example.brzodolokacije.Models.Auth
+
+data class ChangePass(
+ var currentPass:String,
+ var newPass:String
+)
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Statistics.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Statistics.kt
new file mode 100644
index 0000000..4466e05
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Statistics.kt
@@ -0,0 +1,18 @@
+package com.example.brzodolokacije.Models
+
+import android.os.Parcelable
+import kotlinx.android.parcel.Parcelize
+data class Statistics(
+ var totalViews:Int,
+ var numberOfPosts:Int,
+ var numberOfRatingsOnPosts:Int,
+ var averagePostRatingOnPosts:Double,
+ var monthlyViews:List<MonthlyViews>,
+ var numberOfFavouritePosts:Int
+)
+@Parcelize
+data class MonthlyViews(
+ var month:Int,
+ var views:Int
+):Parcelable
+
diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt
index 35088a5..49d76c9 100644
--- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt
+++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt
@@ -2,16 +2,20 @@ package com.example.brzodolokacije.chat
import android.Manifest
import android.app.Activity
+import android.app.PendingIntent
+import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Color
import android.util.Log
import android.widget.Toast
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
+import androidx.core.app.TaskStackBuilder
import androidx.core.content.ContextCompat
import com.auth0.android.jwt.JWT
import com.exam.DBHelper
import com.example.brzodolokacije.Activities.ChatActivity
+import com.example.brzodolokacije.Activities.ChatActivityConversation
import com.example.brzodolokacije.Models.Message
import com.example.brzodolokacije.Models.MessageReceive
import com.example.brzodolokacije.Models.UserReceive
@@ -84,33 +88,40 @@ class SignalRListener private constructor(val activity: Activity){
}
activity.onRefresh()
}
- when {
- ContextCompat.checkSelfPermission(activity,
- Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED -> {
- //poslati notifikaciju
- var api=RetrofitHelper.getInstance()
- var token=SharedPreferencesHelper.getValue("jwt",activity)
- val request2=api?.getProfileFromId("Bearer "+token,
- message.senderId
- )
- request2?.enqueue(object : retrofit2.Callback<UserReceive?> {
- override fun onResponse(call: Call<UserReceive?>, response: Response<UserReceive?>) {
- if(response.isSuccessful()){
- var user=response.body()!!
- createNotification(message,user,activity)
- }
- }
-
- override fun onFailure(call: Call<UserReceive?>, t: Throwable) {
- //TODO("Not yet implemented")
+ if(ContextCompat.checkSelfPermission(activity,
+ Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED || SharedPreferencesHelper.getValue("notifications",activity)=="true"){
+ //poslati notifikaciju
+ var api=RetrofitHelper.getInstance()
+ var token=SharedPreferencesHelper.getValue("jwt",activity)
+ val request2=api?.getProfileFromId("Bearer "+token,
+ message.senderId
+ )
+ request2?.enqueue(object : retrofit2.Callback<UserReceive?> {
+ override fun onResponse(call: Call<UserReceive?>, response: Response<UserReceive?>) {
+ if(response.isSuccessful()){
+ var user=response.body()!!
+ createNotification(message,user,activity)
}
- })
}
- }
+ override fun onFailure(call: Call<UserReceive?>, t: Throwable) {
+ //TODO("Not yet implemented")
+ }
+ })
+ }
}
fun createNotification(message: MessageReceive,user: UserReceive,activity: Activity){
+ val resultIntent = Intent(activity, ChatActivityConversation::class.java)
+ resultIntent.putExtra("userId",user._id)
+ resultIntent.putExtra("username",user.username)
+ resultIntent.putExtra("pfp",user.pfp?._id)
+ val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(activity).run {
+ addNextIntentWithParentStack(resultIntent)
+ getPendingIntent(0,
+ PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
+ }
+
val notificationBuilder = NotificationCompat.Builder(activity, Notifications.CHANNEL_ID)
.setSmallIcon(R.drawable.ic_round_chat_24)
.setAutoCancel(true)
@@ -120,6 +131,7 @@ class SignalRListener private constructor(val activity: Activity){
.setContentTitle(user.username)
.setContentText(message.messagge)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
+ .setContentIntent(resultPendingIntent)
val notificationManager = NotificationManagerCompat.from(activity)
val notification = notificationBuilder.build()
notificationManager.notify(NotificationID.iD, notification)