From d0f30cf2d8fcd745234b45a3cb450de812da7c61 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 8 Dec 2022 13:45:26 +0100 Subject: Follow/Unfollow ispravljen. --- .../Activities/ActivityChangePassword.kt | 1 + .../Activities/ActivitySinglePost.kt | 33 +++++++++++----------- .../Activities/ActivityUserProfile.kt | 32 ++++++++++++--------- 3 files changed, 36 insertions(+), 30 deletions(-) (limited to 'Client') 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 fbe3f4d..08f3e1c 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 @@ -2,6 +2,7 @@ package com.example.brzodolokacije.Activities import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import com.example.brzodolokacije.R class ActivityChangePassword : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { 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 2f5b2d2..139d569 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 @@ -184,22 +184,23 @@ class ActivitySinglePost : AppCompatActivity() { } fun loadTags(){ - if(post.tags!=null) - for( item in post.tags!!){ - var newbtn = Button(this) - newbtn.text = item - var layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - 50 - ) - layoutParams.setMargins(3) - newbtn.layoutParams=layoutParams - newbtn.setBackgroundColor(Color.parseColor("#1C789A")) - newbtn.setTextColor(Color.WHITE) - newbtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) - newbtn.setPadding(3,1,3,1) - newbtn.isClickable=false - tagLayout.addView(newbtn) + if(post.tags!=null) { + for (item in post.tags!!) { + var newbtn = Button(this) + newbtn.text = item + var layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + 50 + ) + layoutParams.setMargins(3) + newbtn.layoutParams = layoutParams + newbtn.setBackgroundColor(Color.parseColor("#1C789A")) + newbtn.setTextColor(Color.WHITE) + newbtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) + newbtn.setPadding(3, 1, 3, 1) + newbtn.isClickable = false + tagLayout.addView(newbtn) + } } } 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, response: Response ) { - 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, response: Response ) { - 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(); -- cgit v1.2.3 From a3dbcdcfbe171ea84fe6870d2d49bf95fe9de148 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 8 Dec 2022 14:30:02 +0100 Subject: Napravljen fragment za prikaz statistike. Odradjen kostur. --- .../brzodolokacije/FragmentProfileStatistics.kt | 27 +++++++ .../Fragments/FragmentMyProfileInfo.kt | 20 ++++- .../app/src/main/res/drawable/ic_total_views.xml | 5 ++ .../res/layout/fragment_profile_statistics.xml | 91 ++++++++++++++++++++++ 4 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentProfileStatistics.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_total_views.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml (limited to 'Client') 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..2ef4d5f --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentProfileStatistics.kt @@ -0,0 +1,27 @@ +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 + + +class FragmentProfileStatistics : Fragment() { + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_profile_statistics, container, false) + } + + +} \ No newline at end of file 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 d6e345b..fdc91f6 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,17 +1,18 @@ 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.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 @@ -19,6 +20,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 override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -29,6 +31,7 @@ class FragmentMyProfileInfo : Fragment() { logout=view.findViewById(R.id.buttonLogOut) as Button changeAccount=view.findViewById(R.id.changeAccountData) + statistics=view.findViewById(R.id.getAccoutStatistics) as Button logout.setOnClickListener{ logOut() @@ -38,6 +41,19 @@ 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() + transaction.replace(R.id.flFragmentProfileFragmentContainer, FragmentProfileStatistics()) + transaction.commit() + + + + + + } + return view } diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_total_views.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_total_views.xml new file mode 100644 index 0000000..3b4e7d5 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_total_views.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml new file mode 100644 index 0000000..2d9dfd5 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.3 From 5890d30b3bb77175d114e7c0630ec4038154365c Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 8 Dec 2022 14:58:31 +0100 Subject: Dodat broj omiljenih objava na back-u. Napravljen dizajn fragmenta za prikaz statistike --- Backend/Api/Api/Models/User.cs | 1 + Backend/Api/Api/Services/PostService.cs | 3 + .../res/drawable/ic_baseline_calendar_month_24.xml | 5 ++ .../main/res/drawable/ic_baseline_favorite_24.xml | 2 +- .../src/main/res/drawable/ic_baseline_star_24.xml | 5 ++ .../main/res/drawable/ic_baseline_star_half_24.xml | 5 ++ .../res/layout/fragment_profile_statistics.xml | 88 ++++++++++++++++++++-- 7 files changed, 100 insertions(+), 9 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_calendar_month_24.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_24.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_half_24.xml (limited to 'Client') diff --git a/Backend/Api/Api/Models/User.cs b/Backend/Api/Api/Models/User.cs index 52d0f24..620c9c8 100644 --- a/Backend/Api/Api/Models/User.cs +++ b/Backend/Api/Api/Models/User.cs @@ -82,6 +82,7 @@ namespace Api.Models public int numberOfRatingsOnPosts { get; set; } public double averagePostRatingOnPosts {get; set; } public List monthlyViews { get; set; } + public int numberOfFavouritePosts { get; set; } } public class MonthlyViews diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index 0799f10..16ebbb7 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -672,6 +672,7 @@ namespace Api.Services stats.numberOfPosts = 0; stats.totalViews = 0; stats.monthlyViews = new List(); + stats.numberOfFavouritePosts = 0; if(posts != null) @@ -691,6 +692,8 @@ namespace Api.Services stats.totalViews += post.views; stats.numberOfRatingsOnPosts += post.ratingscount; stats.numberOfPosts++; + if(post.favourites!=null) + stats.numberOfFavouritePosts+=post.favourites.Count; ratingsum += post.ratings * post.ratingscount; } if(stats.numberOfRatingsOnPosts > 0) //don't forget to check div by 0 jesus diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_calendar_month_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_calendar_month_24.xml new file mode 100644 index 0000000..a278444 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_calendar_month_24.xml @@ -0,0 +1,5 @@ + + + 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 index 84df34b..2dbc440 100644 --- 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 @@ -1,4 +1,4 @@ - diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_24.xml new file mode 100644 index 0000000..88f8d7a --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_half_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_half_24.xml new file mode 100644 index 0000000..d532b23 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_half_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml index d5d72d1..fc1152b 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml @@ -23,7 +23,17 @@ + android:layout_height="match_parent" + android:layout_marginRight="5dp" + android:text="Broj pregleda" + android:gravity="center"/> + @@ -39,11 +49,21 @@ + android:src="@drawable/ic_baseline_star_24" /> + android:layout_height="match_parent" + android:layout_marginRight="5dp" + android:text="Broj ocena" + android:gravity="center"/> + @@ -59,11 +79,52 @@ + android:src="@drawable/ic_baseline_star_half_24" /> + + + + + + + + + + android:layout_height="match_parent" + android:layout_marginRight="5dp" + android:text="Broj omiljenih objava" + android:gravity="center"/> + + @@ -74,18 +135,29 @@ android:orientation="horizontal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/linearLayout5"> + app:layout_constraintTop_toBottomOf="@+id/linearLayout7"> + android:src="@drawable/ic_baseline_calendar_month_24" /> + android:layout_marginRight="5dp" + android:layout_height="match_parent" + android:text="Pregledi po mesecima" + android:gravity="center"/> + + \ No newline at end of file -- cgit v1.2.3 From a23ba361bebd27b58971a266e4fbc11eea0d6fac Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 8 Dec 2022 15:25:59 +0100 Subject: Omogucen prikaz statistike. Napravljen zahtev ka back-u. Dodati modeli. Dobavljane statistike preko username-a korisnika. --- .../brzodolokacije/FragmentProfileStatistics.kt | 63 ++++++++++++++++++++-- .../Fragments/FragmentMyProfileInfo.kt | 12 ++++- .../brzodolokacije/Fragments/FragmentProfile.kt | 2 + .../brzodolokacije/Interfaces/IBackendApi.kt | 2 + .../example/brzodolokacije/Models/Statistics.kt | 18 +++++++ .../res/layout/fragment_profile_statistics.xml | 13 ++++- 6 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Statistics.kt (limited to 'Client') 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 index 2ef4d5f..92da9c0 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentProfileStatistics.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentProfileStatistics.kt @@ -1,15 +1,31 @@ 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.RecyclerView +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) @@ -19,8 +35,49 @@ class FragmentProfileStatistics : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_profile_statistics, container, false) + 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 { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful()){ + stats=response.body() + loadText() + + + } + } + override fun onFailure(call: Call, 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() } 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 0b0ad55..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 @@ -49,7 +49,17 @@ class FragmentMyProfileInfo : Fragment() { val manager: androidx.fragment.app.FragmentManager? = fragmentManager val transaction: FragmentTransaction = manager!!.beginTransaction() - transaction.replace(R.id.flFragmentProfileFragmentContainer, FragmentProfileStatistics()) + + 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() 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/Interfaces/IBackendApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt index 960c56d..f6dfdcf 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 @@ -124,5 +124,7 @@ interface IBackendApi { @POST("/api/user/changePass") fun changePass(@Header("Authorization") authHeader:String):Call + @GET("/api/user/{username}/profile/stats") + fun getUserStatsFromUsername(@Header("Authorization") authHeader:String,@Path("username") username:String):Call } \ No newline at end of file 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, + var numberOfFavouritePosts:Int +) +@Parcelize +data class MonthlyViews( + var month:Int, + var views:Int +):Parcelable + diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml index fc1152b..ce125bb 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml @@ -5,8 +5,17 @@ android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".FragmentProfileStatistics" - android:padding="16dp"> + android:padding="16dp" + > + - + \ No newline at end of file -- cgit v1.2.3 From bb5e7d1282cccfdac13912b3222be85d0a209fc9 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 8 Dec 2022 15:57:00 +0100 Subject: Napravljen adapter za prikaz pregleda po mesecima. Omogucen prikaz pregleda po mesecima. --- .../brzodolokacije/Adapters/MonthViewsAdapter.kt | 63 +++++ .../brzodolokacije/Adapters/MyPostsAdapter.kt | 10 - .../brzodolokacije/FragmentProfileStatistics.kt | 14 ++ .../res/layout/fragment_profile_statistics.xml | 280 +++++++++++---------- .../app/src/main/res/layout/single_date_view.xml | 27 ++ 5 files changed, 248 insertions(+), 146 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/MonthViewsAdapter.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/single_date_view.xml (limited to 'Client') 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) + : RecyclerView.Adapter() { + + + 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) @@ -29,8 +21,6 @@ class MyPostsAdapter (val activity:Activity,val items : MutableList 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/FragmentProfileStatistics.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentProfileStatistics.kt index 92da9c0..fb4c563 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentProfileStatistics.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentProfileStatistics.kt @@ -8,7 +8,11 @@ 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 @@ -61,6 +65,7 @@ class FragmentProfileStatistics : Fragment() { if(response.isSuccessful()){ stats=response.body() loadText() + loadMonths() } @@ -79,6 +84,15 @@ class FragmentProfileStatistics : Fragment() { 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 + ) + + } + } } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml index ce125bb..ca60334 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml @@ -9,154 +9,164 @@ > - - - - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + - + android:layout_height="wrap_content" + android:orientation="horizontal" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/linearLayout5"> + + + + + + + + + + + - + - + - + - @@ -166,7 +176,5 @@ android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/linearLayout6" /> - - + app:layout_constraintTop_toBottomOf="@+id/linearLayout8" /> \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/single_date_view.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/single_date_view.xml new file mode 100644 index 0000000..fd4c568 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/single_date_view.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file -- cgit v1.2.3 From 3fcabd8a0bf53bf6e55c9afd45aef76c7e2bf178 Mon Sep 17 00:00:00 2001 From: Jelena Petrovic Date: Thu, 8 Dec 2022 17:16:49 +0100 Subject: Notifikacije sada rade i na novijim i na starijim android verzijama, na klik notifikacije se odlazi u cet #80 --- .../brzodolokacije/Activities/ChatActivity.kt | 102 +++++++++++++-------- .../Activities/ChatActivityConversation.kt | 18 +++- .../com/example/brzodolokacije/MainActivity.kt | 2 - .../example/brzodolokacije/chat/SignalRListener.kt | 54 ++++++----- 4 files changed, 111 insertions(+), 65 deletions(-) (limited to 'Client') 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(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?=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/MainActivity.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt index acce7b3..b3183b8 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 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 { - override fun onResponse(call: Call, response: Response) { - if(response.isSuccessful()){ - var user=response.body()!! - createNotification(message,user,activity) - } - } - - override fun onFailure(call: Call, 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 { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful()){ + var user=response.body()!! + createNotification(message,user,activity) } - }) } - } + override fun onFailure(call: Call, 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) -- cgit v1.2.3 From dca89c6a85515bf819247b7fc63336d650cd875e Mon Sep 17 00:00:00 2001 From: Jelena Petrovic Date: Fri, 9 Dec 2022 00:20:00 +0100 Subject: Na mapama se sadrzaj pomera sa tastaturom, i navbar se otklanja kada je otvorena tastatura #83 --- Client/BrzoDoLokacije/app/build.gradle | 3 +++ .../app/src/main/AndroidManifest.xml | 6 ++++-- .../Activities/NavigationActivity.kt | 24 +++++++++++++++++++--- 3 files changed, 28 insertions(+), 5 deletions(-) (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/build.gradle b/Client/BrzoDoLokacije/app/build.gradle index cae3d80..9ce9b96 100644 --- a/Client/BrzoDoLokacije/app/build.gradle +++ b/Client/BrzoDoLokacije/app/build.gradle @@ -73,4 +73,7 @@ dependencies { //OSMDROID implementation 'org.osmdroid:osmdroid-android:6.1.14' implementation 'com.github.MKergall:osmbonuspack:6.9.0' + + //KeyboardVisibilityEvents + implementation 'net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:3.0.0-RC3' } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml index 347fdc6..d672708 100644 --- a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml +++ b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml @@ -92,7 +92,8 @@ + android:screenOrientation="portrait" + android:windowSoftInputMode="stateAlwaysHidden|adjustResize" /> @@ -128,7 +129,8 @@ android:screenOrientation="portrait" /> + android:screenOrientation="portrait" + android:windowSoftInputMode="stateAlwaysHidden|adjustResize"/> 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(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 -- cgit v1.2.3 From 1ab59a4b3dc257e5b8bd7dd08eb8eeb043f33dea Mon Sep 17 00:00:00 2001 From: "branislav.radivojevic" Date: Fri, 9 Dec 2022 00:27:43 +0100 Subject: konacne ispravke i feature za Single Post --- Backend/Api/Api/Controllers/AuthController.cs | 10 ++ Backend/Api/Api/Controllers/PostController.cs | 2 +- Backend/Api/Api/Services/PostService.cs | 2 +- .../Activities/ActivitySinglePost.kt | 12 +- .../Fragments/FragmentSinglePostDescription.kt | 125 ++++++++++++++++++++- .../brzodolokacije/Interfaces/IBackendApi.kt | 5 +- .../src/main/res/layout/activity_single_post.xml | 14 ++- .../layout/fragment_single_post_description.xml | 54 ++++++++- 8 files changed, 207 insertions(+), 17 deletions(-) (limited to 'Client') diff --git a/Backend/Api/Api/Controllers/AuthController.cs b/Backend/Api/Api/Controllers/AuthController.cs index abb7adc..b63665b 100644 --- a/Backend/Api/Api/Controllers/AuthController.cs +++ b/Backend/Api/Api/Controllers/AuthController.cs @@ -120,5 +120,15 @@ namespace Api.Controllers return base.Content(html, "text/html"); } } + [HttpGet("jwttoid")] + [Authorize(Roles = "User")] + public async Task> JwtToUserId() + { + var userid = await _userService.UserIdFromJwt(); + if (userid != null) + return Ok(userid); + return BadRequest(); + } + } } diff --git a/Backend/Api/Api/Controllers/PostController.cs b/Backend/Api/Api/Controllers/PostController.cs index 61a4f48..33c240c 100644 --- a/Backend/Api/Api/Controllers/PostController.cs +++ b/Backend/Api/Api/Controllers/PostController.cs @@ -56,7 +56,7 @@ namespace Api.Controllers } return BadRequest(); } - [HttpGet("posts/delete/{id}")] + [HttpDelete("posts/delete/{id}")] [Authorize(Roles = "User")] public async Task> deletePost(string id) { diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index 16ebbb7..07e225e 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -115,7 +115,7 @@ namespace Api.Services foreach (var image in p.images) System.IO.File.Delete(image.path); - await _posts.DeleteOneAsync(postid); + await _posts.FindOneAndDeleteAsync(x => x._id==postid); return 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 74b5f4c..2aff051 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 @@ -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?=mutableListOf() private var starNumber:Number=0 @@ -140,7 +143,6 @@ class ActivitySinglePost : AppCompatActivity() { recyclerViewImages?.setHasFixedSize(true) recyclerViewImages?.layoutManager = layoutManagerImages recyclerViewImages?.adapter = adapterImages - } btnChangeHeightDown.setOnClickListener { btnChangeHeightDown.isVisible=false @@ -206,7 +208,10 @@ class ActivitySinglePost : AppCompatActivity() { } } - + public fun updateratings(rc:Int,r:Double){ + binding.tvRating.text=r.toString() + binding.tvNumberOfRatings.text=rc.toString() + } fun loadFavourite(){ @@ -282,7 +287,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/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 { + override fun onResponse(call: Call, + response: Response + ) { + 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, 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 { + override fun onResponse( + call: Call, + response: Response + ) { + if(response.isSuccessful){ + SharedPreferencesHelper.addValue("jwt",token,activity!!) + val intent= Intent(activity!!, NavigationActivity::class.java) + startActivity(intent) + activity!!.finish() + } + + } + + override fun onFailure(call: Call, 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 f6dfdcf..66a78d3 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 @@ -126,5 +126,8 @@ interface IBackendApi { fun changePass(@Header("Authorization") authHeader:String):Call @GET("/api/user/{username}/profile/stats") fun getUserStatsFromUsername(@Header("Authorization") authHeader:String,@Path("username") username:String):Call - + @GET("/api/auth/jwttoid") + fun getUserId(@Header("Authorization") authHeader:String):Call + @DELETE("api/Post/posts/delete/{id}") + fun DeletePost(@Header("Authorization") authHeader:String,@Path("id") id:String):Call } \ 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 15e81cf..0f8c527 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 @@ -89,11 +89,23 @@ android:gravity="top|start" android:padding="@dimen/text_padding" android:text="User" - android:textSize="17dp" + android:textSize="20dp" android:textStyle="bold" + android:textColor="#FF03DAC5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tvLocationType" /> + + + + + +