From 3fffec28580562d50b8c8c1626b050ec40771176 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Tue, 29 Nov 2022 14:10:12 +0100 Subject: Dodati fragmenti i aktivnost za prikaz praćenja i pratilaca. Omogućen prikaz pratilaca i praćenja. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Backend/Api/Api/Services/UserService.cs | 17 ++- .../ActivityShowFollowersAndFollowing.kt | 91 ++++++++++++++-- .../Activities/ActivityUserProfile.kt | 80 +++++++++----- .../brzodolokacije/Adapters/FollowersAdapter.kt | 4 +- .../Fragments/FragmentUserFollowers.kt | 71 +++++++++++++ .../Fragments/FragmentUserFollowing.kt | 65 ++++++++++++ .../activity_show_followers_and_following.xml | 115 ++++++++++++--------- .../src/main/res/layout/activity_user_profile.xml | 41 ++++++-- .../app/src/main/res/layout/follower_item.xml | 10 +- .../main/res/layout/fragment_user_followers.xml | 18 ++++ .../main/res/layout/fragment_user_following.xml | 18 ++++ 11 files changed, 424 insertions(+), 106 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserFollowers.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserFollowing.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_followers.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_following.xml diff --git a/Backend/Api/Api/Services/UserService.cs b/Backend/Api/Api/Services/UserService.cs index cc75533..d95b5eb 100644 --- a/Backend/Api/Api/Services/UserService.cs +++ b/Backend/Api/Api/Services/UserService.cs @@ -395,11 +395,17 @@ namespace Api.Services public async Task AddFollower(string followerId) { + string id = null; if (_httpContext.HttpContext.User.FindFirstValue("id") != null) { id = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); } + + if (followerId == id) + { + return false; + } User f = await _users.Find(user => user._id == followerId).FirstOrDefaultAsync(); User u = await _users.Find(user => user._id == id).FirstOrDefaultAsync(); @@ -413,7 +419,8 @@ namespace Api.Services f.followers.Add(id); f.followersCount =f.followers.Count(); - + _users.ReplaceOne(user => user._id == followerId, f); + if (u.following == null) { u.following = new List(); @@ -423,7 +430,7 @@ namespace Api.Services u.followingCount =u.following.Count(); _users.ReplaceOne(user=>user._id==id, u); - _users.ReplaceOne(user => user._id == followerId, f); + // updateUserFollowerFollowingCount(u.followers, u.following, u._id); //updateUserFollowerFollowingCount(f.followers, f.following, f._id); @@ -452,9 +459,12 @@ namespace Api.Services continue; } UserSend follower = new UserSend(); + follower.creationDate = utemp.creationDate; + follower.name = utemp.name; follower.pfp = utemp.pfp; follower.username = utemp.username; follower.email = utemp.username; + follower.following = utemp.following; follower.followers = utemp.followers; follower._id = utemp._id; @@ -484,9 +494,12 @@ namespace Api.Services continue; } UserSend follower = new UserSend(); + follower.creationDate = utemp.creationDate; + follower.name = utemp.name; follower.pfp = utemp.pfp; follower.username = utemp.username; follower.email = utemp.username; + follower.following = utemp.following; follower.followers = utemp.followers; follower._id = utemp._id; diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowFollowersAndFollowing.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowFollowersAndFollowing.kt index 845021e..fe0d546 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowFollowersAndFollowing.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowFollowersAndFollowing.kt @@ -1,39 +1,110 @@ package com.example.brzodolokacije.Activities +import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import android.widget.Button -import android.widget.FrameLayout +import android.widget.* import androidx.fragment.app.FragmentTransaction -import com.example.brzodolokacije.Fragments.FragmentFollowers -import com.example.brzodolokacije.Fragments.FragmentFollowing -import com.example.brzodolokacije.Fragments.FragmentRegister +import com.example.brzodolokacije.Fragments.* +import com.example.brzodolokacije.Models.UserReceive import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import com.google.gson.Gson +import kotlinx.android.synthetic.main.list_item.* +import retrofit2.Call +import retrofit2.Response class ActivityShowFollowersAndFollowing : AppCompatActivity() { - private lateinit var showFollowers:Button - private lateinit var showFollowing:Button + // private lateinit var showFollowers:Button + //private lateinit var showFollowing:Button private lateinit var fragmentContainer:FrameLayout + private lateinit var followersOrFollowing:String + private lateinit var userId:String + private lateinit var text:TextView + private lateinit var back: ImageView + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_show_followers_and_following) + val bundle = intent.extras + if (bundle != null){ + userId= bundle.getString("userId").toString().trim() + followersOrFollowing=bundle.get("show").toString().trim() + } + + fragmentContainer=findViewById(R.id.flActivityShowFollowerAndFollowing) + text=findViewById(R.id.tvActivityShowFollowersOrFollowingShow) + back=findViewById(R.id.btnActivityShowFollowersAndFollowingBackToUser) + + if(followersOrFollowing=="followers"){ + text.text="Pratioci" + val mFragmentManager = supportFragmentManager + val mFragmentTransaction = mFragmentManager.beginTransaction() + val mFragment = FragmentUserFollowers() + val mBundle = Bundle() + mBundle.putString("userId",userId) + mFragment.arguments = mBundle + mFragmentTransaction.replace(R.id.flActivityShowFollowerAndFollowing, mFragment).commit() + } + + if(followersOrFollowing=="following"){ + text.text="Praćenja" + val mFragmentManager = supportFragmentManager + val mFragmentTransaction = mFragmentManager.beginTransaction() + val mFragment = FragmentUserFollowing() + val mBundle = Bundle() + mBundle.putString("userId",userId) + mFragment.arguments = mBundle + mFragmentTransaction.replace(R.id.flActivityShowFollowerAndFollowing, mFragment).commit() + } + + back.setOnClickListener { + var token= SharedPreferencesHelper.getValue("jwt", this).toString() + val api= RetrofitHelper.getInstance() + val request= api.getProfileFromId("Bearer " + token, userId) + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, + response: Response + ) { + if (response.body() == null) { + return + } + var userData = response.body()!! + val intent: Intent = Intent(this@ActivityShowFollowersAndFollowing,ActivityUserProfile::class.java) + var b= Bundle() + intent.putExtra("user", Gson().toJson(userData)) + startActivity(intent) + } + + override fun onFailure(call: Call, t: Throwable) { + + } + }) + + } + + +/* showFollowers=findViewById(R.id.btnActivityShowFollowersAndFollowingShowFollowers) showFollowing=findViewById(R.id.btnActivityShowFollowersAndFollowingShowFollowing) fragmentContainer=findViewById(R.id.flActivityShowFollowerAndFollowing) showFollowers.setOnClickListener { + followersOrFollowing="followers" var fm: FragmentTransaction =supportFragmentManager.beginTransaction() - fm.replace(R.id.flActivityShowFollowerAndFollowing, FragmentFollowers()) + fm.replace(R.id.flActivityShowFollowerAndFollowing, FragmentUserFollowers()) fm.commit() } showFollowing.setOnClickListener { + followersOrFollowing="following" var fm: FragmentTransaction =supportFragmentManager.beginTransaction() - fm.replace(R.id.flActivityShowFollowerAndFollowing, FragmentFollowing()) + fm.replace(R.id.flActivityShowFollowerAndFollowing, FragmentUserFollowing()) fm.commit() } - +*/ } } \ No newline at end of file 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 5119da9..61a5db1 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 @@ -1,6 +1,7 @@ package com.example.brzodolokacije.Activities import android.annotation.SuppressLint +import android.content.Intent import android.os.Bundle import android.util.Log import android.widget.* @@ -34,6 +35,9 @@ class ActivityUserProfile : AppCompatActivity() { private lateinit var openChat:ImageButton private lateinit var unfollowUser:Button + private lateinit var showFollowers:Button + private lateinit var showFollowing:Button + private var follow:Boolean=false override fun onCreate(savedInstanceState: Bundle?) { @@ -50,6 +54,8 @@ class ActivityUserProfile : AppCompatActivity() { showUserPosts=findViewById(id.btnActivityUserProfileShowPosts) fragmentContainer=findViewById(id.flActivityProfileFragmentContainer) openChat=findViewById(id.activityUserProfileOpenChat) + showFollowing=findViewById(id.tvActivityUserProfileFollow) + showFollowers=findViewById(R.id.tvActivityUserProfileFollowers) val jsonMyObject: String val extras = intent.extras @@ -65,7 +71,7 @@ class ActivityUserProfile : AppCompatActivity() { followingNumber.text=userObject?.followingCount.toString() if(userObject.pfp!=null) { - Glide.with(this) + Glide.with(this@ActivityUserProfile) .load(RetrofitHelper.baseUrl + "/api/post/image/" + userObject.pfp!!._id) .circleCrop()//Round image .into(profilePicture) @@ -91,6 +97,7 @@ class ActivityUserProfile : AppCompatActivity() { followUser.isVisible=false followUser.isClickable=false followUser.isEnabled=false + updateUserData() Toast.makeText( @@ -107,35 +114,53 @@ class ActivityUserProfile : AppCompatActivity() { } unfollowUser.setOnClickListener { - val api = RetrofitHelper.getInstance() - val token = SharedPreferencesHelper.getValue("jwt", this@ActivityUserProfile) - var data = api.unfollow("Bearer " + token, userObject._id); - data.enqueue(object : Callback { - override fun onResponse( - call: Call, - response: Response - ) { - 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(); - } + val api = RetrofitHelper.getInstance() + val token = SharedPreferencesHelper.getValue("jwt", this@ActivityUserProfile) + var data = api.unfollow("Bearer " + token, userObject._id); + data.enqueue(object : Callback { + override fun onResponse( + call: Call, + response: Response + ) { + 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(); + } - override fun onFailure(call: Call, t: Throwable) { - Toast.makeText( - this@ActivityUserProfile, t.toString(), Toast.LENGTH_LONG - ).show(); - } - }) + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText( + this@ActivityUserProfile, t.toString(), Toast.LENGTH_LONG + ).show(); + } + }) + } + showFollowers.setOnClickListener { + val bundle = Bundle() + bundle.putString("userId", userObject._id.toString()) + bundle.putString("show","followers") + val intent = Intent(this@ActivityUserProfile,ActivityShowFollowersAndFollowing::class.java) + intent.putExtras(bundle) + startActivity(intent) + + } + + showFollowing.setOnClickListener { + val bundle = Bundle() + bundle.putString("userId", userObject._id.toString()) + bundle.putString("show","following") + val intent = Intent(this@ActivityUserProfile,ActivityShowFollowersAndFollowing::class.java) + intent.putExtras(bundle) + startActivity(intent) + } - } showUserPosts.setOnClickListener { var fm: FragmentTransaction =supportFragmentManager.beginTransaction() @@ -212,6 +237,7 @@ class ActivityUserProfile : AppCompatActivity() { response: Response ) { var userData=response.body()!! + name.text=userData.name postsNumber.text=userData.postNumber.toString() followersNumber.text=userData.followersCount.toString() diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/FollowersAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/FollowersAdapter.kt index e439d0e..5381ebc 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/FollowersAdapter.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/FollowersAdapter.kt @@ -33,10 +33,10 @@ class FollowersAdapter (var followers:MutableList, val activity: Ac inner class FollowerViewHolder(view: View): RecyclerView.ViewHolder(view){ private val name: TextView =view.findViewById(R.id.tvFollowerItemName) - private val username:TextView=view.findViewById(R.id.tvFolloewItemUsername) + private val username:TextView=view.findViewById(R.id.tvFollowerItemUsername) fun bindView(follower: UserReceive){ name.text=follower.name - username.text=follower.username + username.text="@"+follower.username } } } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserFollowers.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserFollowers.kt new file mode 100644 index 0000000..09920dc --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserFollowers.kt @@ -0,0 +1,71 @@ +package com.example.brzodolokacije.Fragments + +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 androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Adapters.FollowersAdapter +import com.example.brzodolokacije.Adapters.ShowPostsHomePageAdapter +import com.example.brzodolokacije.Models.PostPreview +import com.example.brzodolokacije.Models.UserReceive +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class FragmentUserFollowers : Fragment() { + + private lateinit var followers:MutableList + private lateinit var rvFollowers:RecyclerView + private lateinit var userId:String + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + var view=inflater.inflate(R.layout.fragment_user_followers, container, false) + + val bundle = arguments + userId = bundle!!.getString("userId").toString() + + rvFollowers=view.findViewById(R.id.rvFragmentUserFollowers) + + getFollowers() + + return view + } + + fun getFollowers(){ + val api = RetrofitHelper.getInstance() + val token= SharedPreferencesHelper.getValue("jwt", requireActivity()) + val data=api.getFollowers("Bearer "+token,userId) + + data.enqueue(object : Callback> { + + override fun onResponse( + call: Call>, + response: Response> + ) { + if (response.body() == null) { + return + } + followers = response.body()!!.toMutableList() + rvFollowers.apply { + layoutManager= LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL,false) + adapter= FollowersAdapter(followers,requireActivity()) + + } + } + override fun onFailure(call: Call>, t: Throwable) { + Log.d("Followers","Faillllllllllllllllllllllllll") + Log.d("Followers",t.toString()) + } + }) + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserFollowing.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserFollowing.kt new file mode 100644 index 0000000..0f6323f --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserFollowing.kt @@ -0,0 +1,65 @@ +package com.example.brzodolokacije.Fragments + +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 androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Adapters.FollowersAdapter +import com.example.brzodolokacije.Models.UserReceive +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + + +class FragmentUserFollowing : Fragment() { + + private lateinit var following:MutableList + private lateinit var rvFollowing: RecyclerView + private lateinit var userId:String + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + var view=inflater.inflate(R.layout.fragment_user_following, container, false) + val bundle = arguments + userId = bundle!!.getString("userId").toString() + rvFollowing=view.findViewById(R.id.rvFragmentUserFollowing) + + getFollowing() + + return view + } + + fun getFollowing(){ + val api = RetrofitHelper.getInstance() + val token= SharedPreferencesHelper.getValue("jwt", requireActivity()) + val data=api.getFollowing("Bearer "+token,userId) + data.enqueue(object : Callback> { + override fun onResponse(call: Call>, response: Response>) { + if (response.body() == null) { + return + } + Log.d("Following","Sucesssssssssssssssssssssssssssssss") + following = response.body()!!.toMutableList() + rvFollowing.apply { + layoutManager= LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL,false) + adapter= FollowersAdapter(following,requireActivity()) + } + } + override fun onFailure(call: Call>, t: Throwable) { + Log.d("Following","Faillllllllllllllllllllllllll") + } + }) + } + +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_followers_and_following.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_followers_and_following.xml index 18c519b..7ee4cbe 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_followers_and_following.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_followers_and_following.xml @@ -2,67 +2,82 @@ -