From df6852bf7b47835a31dd0ffeb5cfddccbf70aeba Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Wed, 2 Nov 2022 22:39:46 +0100 Subject: Napravljeni modeli za File, Location, Post, PostReceive i PostSend --- Backend/Api/Api/Models/File.cs | 13 +++++++++ Backend/Api/Api/Models/Location.cs | 29 ++++++++++++++++++++ Backend/Api/Api/Models/Post.cs | 56 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 Backend/Api/Api/Models/File.cs create mode 100644 Backend/Api/Api/Models/Location.cs create mode 100644 Backend/Api/Api/Models/Post.cs diff --git a/Backend/Api/Api/Models/File.cs b/Backend/Api/Api/Models/File.cs new file mode 100644 index 0000000..c3a1e1b --- /dev/null +++ b/Backend/Api/Api/Models/File.cs @@ -0,0 +1,13 @@ +using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Bson; + +namespace Api.Models +{ + public class File + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string _id { get; set; } + public String path { get; set; } + } +} diff --git a/Backend/Api/Api/Models/Location.cs b/Backend/Api/Api/Models/Location.cs new file mode 100644 index 0000000..5e723e4 --- /dev/null +++ b/Backend/Api/Api/Models/Location.cs @@ -0,0 +1,29 @@ +using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Bson; + +namespace Api.Models +{ + public class Location + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public String _id { get; set; } + public String name { get; set; } + public String city { get; set; } + public String country { get; set; } + public String adress { get; set; } + public double latitude { get; set; } + public double longitude { get; set; } + public LocationType type { get; set; } + + } + + + public enum LocationType + { + Plaza, + Grad, + Zgrada, + Itd + } +} diff --git a/Backend/Api/Api/Models/Post.cs b/Backend/Api/Api/Models/Post.cs new file mode 100644 index 0000000..456fcea --- /dev/null +++ b/Backend/Api/Api/Models/Post.cs @@ -0,0 +1,56 @@ +using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Bson; + +namespace Api.Models +{ + public class Post + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string _id { get; set; } + public string ownerId { get; set; } + public Location location { get; set; } + public string description { get; set; } + public List views { get; set; } + public List reports { get; set; } + public List ratings { get; set; } + public List comments { get; set; } + public List images { get; set; } + } + public class PostReceive + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string _id { get; set; } + public Location location { get; set; } + public string description { get; set; } + public List images { get; set; } + + + } + public class PostSend + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string _id { get; set; } + public string ownerId { get; set; } + public Location location { get; set; } + public string description { get; set; } + public int views { get; set; } + public float ratings { get; set; } + public List comments { get; set; } + public List images { get; set; } + } + public class Rating + { + public string userId { get; set; } + public int rating { get; set; } + } + public class Comment + { + public string userId { get; set; } + public string comment { get; set; } + public Comment parent { get; set; } + public DateTime timestamp { get; set; } + } +} -- cgit v1.2.3 From 00cf63fbf357e0068834487f622ba7faade51992 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Wed, 2 Nov 2022 23:35:35 +0100 Subject: Dodata splash page. --- .../brzodolokacije/Activities/SplashPage.kt | 11 ++ .../Adapters/Fragments/FragmentAddPost.kt | 48 +++++++ .../Adapters/Fragments/FragmentBrowse.kt | 60 ++++++++ .../Adapters/Fragments/FragmentHome.kt | 61 ++++++++ .../Adapters/Fragments/FragmentLogin.kt | 156 ++++++++++++++++++++ .../Adapters/Fragments/FragmentMyProfileInfo.kt | 60 ++++++++ .../Adapters/Fragments/FragmentMyRecensions.kt | 60 ++++++++ .../Adapters/Fragments/FragmentProfile.kt | 93 ++++++++++++ .../Adapters/Fragments/FragmentRegister.kt | 158 +++++++++++++++++++++ .../Adapters/Fragments/FragmentUserPosts.kt | 60 ++++++++ .../brzodolokacije/Fragments/FragmentAddPost.kt | 48 ------- .../brzodolokacije/Fragments/FragmentBrowse.kt | 60 -------- .../brzodolokacije/Fragments/FragmentHome.kt | 61 -------- .../brzodolokacije/Fragments/FragmentLogin.kt | 156 -------------------- .../Fragments/FragmentMyProfileInfo.kt | 60 -------- .../Fragments/FragmentMyRecensions.kt | 60 -------- .../brzodolokacije/Fragments/FragmentProfile.kt | 93 ------------ .../brzodolokacije/Fragments/FragmentRegister.kt | 158 --------------------- .../brzodolokacije/Fragments/FragmentUserPosts.kt | 60 -------- .../src/main/res/layout/activity_splash_page.xml | 9 ++ 20 files changed, 776 insertions(+), 756 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/SplashPage.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentAddPost.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentBrowse.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentHome.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentLogin.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyProfileInfo.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyRecensions.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentProfile.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentRegister.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentUserPosts.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHome.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyRecensions.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPosts.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/activity_splash_page.xml diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/SplashPage.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/SplashPage.kt new file mode 100644 index 0000000..2d3a73b --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/SplashPage.kt @@ -0,0 +1,11 @@ +package com.example.brzodolokacije.Activities + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle + +class SplashPage : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_splash_page) + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentAddPost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentAddPost.kt new file mode 100644 index 0000000..c00cbc5 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentAddPost.kt @@ -0,0 +1,48 @@ +package com.example.brzodolokacije.Adapters.Fragments + +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import com.example.brzodolokacije.Activities.ActivityLoginRegister +import com.example.brzodolokacije.Activities.NavigationActivity +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.SharedPreferencesHelper + + +class FragmentAddPost : Fragment(R.layout.fragment_add_post) { + + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view:View=inflater.inflate(R.layout.fragment_add_post, container, false) + // Inflate the layout for this fragment + val logOutButton=view.findViewById(R.id.btnFragmentAddLogOut) as Button + logOutButton.setOnClickListener{ + logOut() + } + return view; + } + + fun logOut(){ + if(SharedPreferencesHelper.removeValue("jwt",requireActivity())) + { + val intent= Intent(requireActivity(), ActivityLoginRegister::class.java) + startActivity(intent) + } + } + + +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentBrowse.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentBrowse.kt new file mode 100644 index 0000000..51745fe --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentBrowse.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Adapters.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentBrowse.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentBrowse : Fragment(R.layout.fragment_browse) { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_browse, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentBrowse. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentBrowse().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentHome.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentHome.kt new file mode 100644 index 0000000..bb9e0cb --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentHome.kt @@ -0,0 +1,61 @@ +package com.example.brzodolokacije.Adapters.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 android.widget.Button +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Adapters.SampleAdapter +import com.example.brzodolokacije.Models.ListItemModel +import com.example.brzodolokacije.R +import com.example.brzodolokacije.databinding.FragmentHomeBinding + +/** + * A simple [Fragment] subclass. + * Use the [FragmentHome.newInstance] factory method to + * create an instance of this fragment. + */ + +class FragmentHome : Fragment(R.layout.fragment_home) { + + private lateinit var binding: FragmentHomeBinding + private var nameList : MutableList = mutableListOf() + private var layoutManagerVar: RecyclerView.LayoutManager? = null + private var adapterVar: RecyclerView.Adapter? = null + private var recyclerView:RecyclerView?=null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + //load data for the list + loadData() + //instantiate adapter and linearLayout + adapterVar=SampleAdapter(nameList) + layoutManagerVar=LinearLayoutManager(activity) + } + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val rootView = inflater?.inflate(R.layout.fragment_home, container, false) + recyclerView = rootView?.findViewById(R.id.rvMain) + // set recyclerView attributes + recyclerView?.setHasFixedSize(true) + recyclerView?.layoutManager = layoutManagerVar + recyclerView?.adapter = adapterVar + return rootView + } + fun loadData(){ + nameList.add(ListItemModel(1,"Sample 1")) + nameList.add(ListItemModel(2,"Sample 2")) + nameList.add(ListItemModel(3,"Sample 3")) + nameList.add(ListItemModel(4,"Sample 4")) + nameList.add(ListItemModel(5,"Sample 5")) + nameList.add(ListItemModel(6,"Sample 6")) + } +} diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentLogin.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentLogin.kt new file mode 100644 index 0000000..a81505b --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentLogin.kt @@ -0,0 +1,156 @@ +package com.example.brzodolokacije.Adapters.Fragments + +import android.content.Intent +import android.graphics.Color +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.EditText +import android.widget.TextView +import android.widget.Toast + +import com.example.brzodolokacije.Activities.ActivityLoginRegister +import com.example.brzodolokacije.Activities.NavigationActivity + +import com.example.brzodolokacije.Activities.ActivityForgottenPassword + + +import com.example.brzodolokacije.Interfaces.IAuthApi +import com.example.brzodolokacije.Models.Auth.Login +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import retrofit2.Call +import retrofit2.Response + + +class FragmentLogin : Fragment() { + // TODO: Rename and change types of parameters + private lateinit var password: EditText + private lateinit var email: EditText + private lateinit var forgottenPassword: TextView + private lateinit var login: Button + private lateinit var passwordString:String + private lateinit var emailString:String + + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + val view:View=inflater.inflate(R.layout.fragment_login, container, false) + + + email = view.findViewById(R.id.etFragmentLoginEmail) as EditText + password = view.findViewById(R.id.etFragmentLoginPassword) as EditText + forgottenPassword = view.findViewById(R.id.tvFragmentLoginForgottenPassword) as TextView + login=view.findViewById(R.id.btnFragmentLoginLogin) as Button + + //osluskivanje unosa + + login.setOnClickListener{ + emailString=email.text.toString().trim() + passwordString=password.text.toString().trim() + //prazan unos? + if(emailString.isEmpty()) + { + email.hint="Unesite Email adresu" + email.setHintTextColor(Color.RED) + }/* + else{ + if(checkEmail(emailString)==false){ + email.hint="Pogrešan unos, unesite ispravnu Email adresu" + email.setHintTextColor(Color.RED) + } + }*/ + if(passwordString.isEmpty()) + { + password.hint = "Unesite lozinku" + password.setHintTextColor(Color.RED) + + }/* + else{ + if(checkPassword(passwordString)==false) { + password.hint = "Lozinka mora imati najmanje 6 karaktera" + password.setHintTextColor(Color.RED) + } + } +*/ + if(!emailString.isEmpty() && !passwordString.isEmpty()&& checkPassword(passwordString)==true && checkEmail(emailString)==true) { + + var loginData= Login(emailString,passwordString) + val authApi= RetrofitHelper.getInstance().create(IAuthApi::class.java) + val request=authApi.login(loginData) + + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful()){ + val token=response.body().toString() + Toast.makeText( + activity, token, Toast.LENGTH_LONG + ).show(); + //TODO(navigate to main page) + SharedPreferencesHelper.addValue("jwt",token,activity!!) + val intent= Intent(activity!!, NavigationActivity::class.java) + startActivity(intent) + }else{ + if(response.errorBody()!=null) + Toast.makeText(activity, response.errorBody()!!.string(), Toast.LENGTH_LONG).show(); + } + + + } + + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText( + activity, t.toString(), Toast.LENGTH_LONG + ).show(); + } + }) + + } + } + + // zaboravljena lozinka + forgottenPassword.setOnClickListener{ + val intent = Intent (getActivity(), ActivityForgottenPassword::class.java) + getActivity()?.startActivity(intent) + } + + + + + + return view + + } + fun checkEmail(emailString:String):Boolean{ + val emailRegex = "^[A-Za-z](.*)([@]{1})(.{1,})(\\.)(.{1,})" + if(!(emailRegex.toRegex().matches(emailString))){ + Toast.makeText( + activity, "Email adresa nije validna, pokušajte ponovo", Toast.LENGTH_LONG + ).show(); + email.setHintTextColor(Color.RED) + return false + } + else{ + return true + } + } + + fun checkPassword(passwordString:String):Boolean{ + if(passwordString.length<6){ + Toast.makeText( + activity, "Uneta lozinka nije validna, pokušajte ponovo", Toast.LENGTH_LONG + ).show(); + return false + } + return true + } + +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyProfileInfo.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyProfileInfo.kt new file mode 100644 index 0000000..e846695 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyProfileInfo.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Adapters.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentMyProfileInfo.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentMyProfileInfo : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_my_profile_info, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentMyProfileInfo. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentMyProfileInfo().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyRecensions.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyRecensions.kt new file mode 100644 index 0000000..10bdc21 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyRecensions.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Adapters.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentMyRecensions.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentMyRecensions : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_my_recensions, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentMyRecensions. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentMyRecensions().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentProfile.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentProfile.kt new file mode 100644 index 0000000..566e1cf --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentProfile.kt @@ -0,0 +1,93 @@ +package com.example.brzodolokacije.Adapters.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 android.widget.Button +import android.widget.EditText +import android.widget.TextView +import androidx.fragment.app.FragmentTransaction +import com.example.brzodolokacije.R +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentProfile.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentProfile : Fragment(R.layout.fragment_profile) { + // TODO: Rename and change types of parameters + private lateinit var username: TextView + private lateinit var name: TextView + private lateinit var postsCount: TextView + private lateinit var followersCount: TextView + private lateinit var followingCount:TextView + private lateinit var usernameString: String + private lateinit var nameString: String + private lateinit var postsCountString: String + private lateinit var followersCountString: String + private lateinit var followingCountString:String + private lateinit var showMyPosts: Button + private lateinit var showMyData: Button + private lateinit var showMyRecensions: Button + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + val view:View= inflater.inflate(R.layout.fragment_profile, container, false) + name = view.findViewById(R.id.tvFragmentProfileName) as TextView + username = view.findViewById(R.id.tvFragmentProfileUserName) as TextView + postsCount = view.findViewById(R.id.tvFragmentProfilePostsNo) as TextView + followersCount = view.findViewById(R.id.tvFragmentProfileFollowersNo) as TextView + followingCount = view.findViewById(R.id.tvFragmentProfileFollowNo) as TextView + + showMyPosts=view.findViewById(R.id.btnFragmentProfileShowMyPosts) as Button + showMyData=view.findViewById(R.id.btnFragmentProfileShowMyData) as Button + showMyRecensions=view.findViewById(R.id.btnFragmentProfileShowMyRecensions) as Button + //podaci iz baze + + + + showMyPosts.setOnClickListener{ + + var fm: FragmentTransaction =childFragmentManager.beginTransaction() + + fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentUserPosts()) + fm.commit() + } + + + showMyData.setOnClickListener{ + + var fm: FragmentTransaction =childFragmentManager.beginTransaction() + + fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentMyProfileInfo()) + fm.commit() + } + + showMyRecensions.setOnClickListener{ + + var fm: FragmentTransaction =childFragmentManager.beginTransaction() + + fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentMyRecensions()) + fm.commit() + } + + return view + } + + +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentRegister.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentRegister.kt new file mode 100644 index 0000000..db681a3 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentRegister.kt @@ -0,0 +1,158 @@ +package com.example.brzodolokacije.Adapters.Fragments + +import android.graphics.BitmapFactory +import android.graphics.Color +import android.os.Bundle +import android.util.Base64 +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.EditText +import android.widget.Toast +import com.example.brzodolokacije.Interfaces.IAuthApi +import com.example.brzodolokacije.Models.Auth.Register +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.Response +import javax.security.auth.callback.Callback + +class FragmentRegister : Fragment() { + // TODO: Rename and change types of parameters + private lateinit var password: EditText + private lateinit var email: EditText + private lateinit var username: EditText + private lateinit var name: EditText + private lateinit var register: Button + private lateinit var usernameString:String + private lateinit var nameString:String + private lateinit var passwordString:String + private lateinit var emailString:String + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + val view:View=inflater.inflate(R.layout.fragment_register, container, false) + + email = view.findViewById(R.id.etFragmentRegisterEmail) as EditText + password = view.findViewById(R.id.etFragmentRegisterPassword) as EditText + username = view.findViewById(R.id.etFragmentRegisterUser) as EditText + name = view.findViewById(R.id.etFragmentRegisterName) as EditText + register=view.findViewById(R.id.btnFragmentRegisterRegister) as Button + + //osluskivanje unosa + + register.setOnClickListener{ + emailString=email.text.toString().trim() + usernameString=username.text.toString().trim() + nameString=name.text.toString().trim() + passwordString=password.text.toString().trim() + + //prazan unos? neispravan email + if(emailString.isEmpty()) + { + email.hint="Unesite Email adresu" + email.setHintTextColor(Color.RED) + } + if(passwordString.isEmpty()) + { + password.hint = "Unesite lozinku" + password.setHintTextColor(Color.RED) + } + if(usernameString.isEmpty()) + { + username.hint = "Unesite korisničko ime" + username.setHintTextColor(Color.RED) + } + if(nameString.isEmpty()) + { + name.hint = "Unesite ime i prezime" + name.setHintTextColor(Color.RED) + } + if(!emailString.isEmpty() && !passwordString.isEmpty() && !nameString.isEmpty() + && !usernameString.isEmpty() && checkPassword(passwordString)==true + && checkEmail(emailString)==true && checkUsername(usernameString)==true) { + + var registerData=Register(nameString,usernameString,emailString,passwordString) + + val authApi=RetrofitHelper.getInstance().create(IAuthApi::class.java) + + val request=authApi.register(registerData) + + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful()){ + Toast.makeText( + activity, "Uspesna registracija. Verifikujte email.", Toast.LENGTH_LONG + ).show(); + //TODO(navigate to login) + }else{ + if(response.errorBody()!=null) { + Toast.makeText( + activity, + response.errorBody()!!.string(), + Toast.LENGTH_LONG + ).show() + } + } + + + } + + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText( + activity, "Greska, pokusajte ponovo.", Toast.LENGTH_LONG + ).show(); + } + }) + + + + //***DODATI broj karaktera lozinke, provera da li je email sa @ i .com + + } + } + + + return view + } + fun checkEmail(emailString:String):Boolean{ + val emailRegex = "^[A-Za-z](.*)([@]{1})(.{1,})(\\.)(.{1,})" + if(!(emailRegex.toRegex().matches(emailString))){ + Toast.makeText( + activity, "Email adresa nije validna, pokušajte ponovo", Toast.LENGTH_LONG + ).show(); + email.setHintTextColor(Color.RED) + return false + } + else{ + return true + } + } + + fun checkPassword(passwordString:String):Boolean{ + if(passwordString.length<6){ + Toast.makeText( + activity, "Izaberite sigurniju lozinku", Toast.LENGTH_LONG + ).show(); + return false + } + return true + } + + fun checkUsername(usernameString:String):Boolean{ + if(usernameString.length<4){ + Toast.makeText( + activity, "Izaberite korisničko ime sa 4 ili više karaktera ", Toast.LENGTH_LONG + ).show(); + return false + } + return true + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentUserPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentUserPosts.kt new file mode 100644 index 0000000..866c0f8 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentUserPosts.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Adapters.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentUserPosts.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentUserPosts : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_user_posts, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentUserPosts. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentUserPosts().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt deleted file mode 100644 index b6452e9..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.example.brzodolokacije.Fragments - -import android.content.Intent -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import com.example.brzodolokacije.Activities.ActivityLoginRegister -import com.example.brzodolokacije.Activities.NavigationActivity -import com.example.brzodolokacije.R -import com.example.brzodolokacije.Services.SharedPreferencesHelper - - -class FragmentAddPost : Fragment(R.layout.fragment_add_post) { - - - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val view:View=inflater.inflate(R.layout.fragment_add_post, container, false) - // Inflate the layout for this fragment - val logOutButton=view.findViewById(R.id.btnFragmentAddLogOut) as Button - logOutButton.setOnClickListener{ - logOut() - } - return view; - } - - fun logOut(){ - if(SharedPreferencesHelper.removeValue("jwt",requireActivity())) - { - val intent= Intent(requireActivity(), ActivityLoginRegister::class.java) - startActivity(intent) - } - } - - -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt deleted file mode 100644 index 1bd98a0..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.example.brzodolokacije.Fragments - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.example.brzodolokacije.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [FragmentBrowse.newInstance] factory method to - * create an instance of this fragment. - */ -class FragmentBrowse : Fragment(R.layout.fragment_browse) { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_browse, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment FragmentBrowse. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - FragmentBrowse().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHome.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHome.kt deleted file mode 100644 index fd5aa33..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHome.kt +++ /dev/null @@ -1,61 +0,0 @@ -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 android.widget.Button -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.example.brzodolokacije.Adapters.SampleAdapter -import com.example.brzodolokacije.Models.ListItemModel -import com.example.brzodolokacije.R -import com.example.brzodolokacije.databinding.FragmentHomeBinding - -/** - * A simple [Fragment] subclass. - * Use the [FragmentHome.newInstance] factory method to - * create an instance of this fragment. - */ - -class FragmentHome : Fragment(R.layout.fragment_home) { - - private lateinit var binding: FragmentHomeBinding - private var nameList : MutableList = mutableListOf() - private var layoutManagerVar: RecyclerView.LayoutManager? = null - private var adapterVar: RecyclerView.Adapter? = null - private var recyclerView:RecyclerView?=null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - //load data for the list - loadData() - //instantiate adapter and linearLayout - adapterVar=SampleAdapter(nameList) - layoutManagerVar=LinearLayoutManager(activity) - } - - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val rootView = inflater?.inflate(R.layout.fragment_home, container, false) - recyclerView = rootView?.findViewById(R.id.rvMain) - // set recyclerView attributes - recyclerView?.setHasFixedSize(true) - recyclerView?.layoutManager = layoutManagerVar - recyclerView?.adapter = adapterVar - return rootView - } - fun loadData(){ - nameList.add(ListItemModel(1,"Sample 1")) - nameList.add(ListItemModel(2,"Sample 2")) - nameList.add(ListItemModel(3,"Sample 3")) - nameList.add(ListItemModel(4,"Sample 4")) - nameList.add(ListItemModel(5,"Sample 5")) - nameList.add(ListItemModel(6,"Sample 6")) - } -} diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt deleted file mode 100644 index b9568df..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt +++ /dev/null @@ -1,156 +0,0 @@ -package com.example.brzodolokacije.Fragments - -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import android.widget.EditText -import android.widget.TextView -import android.widget.Toast - -import com.example.brzodolokacije.Activities.ActivityLoginRegister -import com.example.brzodolokacije.Activities.NavigationActivity - -import com.example.brzodolokacije.Activities.ActivityForgottenPassword - - -import com.example.brzodolokacije.Interfaces.IAuthApi -import com.example.brzodolokacije.Models.Auth.Login -import com.example.brzodolokacije.R -import com.example.brzodolokacije.Services.RetrofitHelper -import com.example.brzodolokacije.Services.SharedPreferencesHelper -import retrofit2.Call -import retrofit2.Response - - -class FragmentLogin : Fragment() { - // TODO: Rename and change types of parameters - private lateinit var password: EditText - private lateinit var email: EditText - private lateinit var forgottenPassword: TextView - private lateinit var login: Button - private lateinit var passwordString:String - private lateinit var emailString:String - - - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - val view:View=inflater.inflate(R.layout.fragment_login, container, false) - - - email = view.findViewById(R.id.etFragmentLoginEmail) as EditText - password = view.findViewById(R.id.etFragmentLoginPassword) as EditText - forgottenPassword = view.findViewById(R.id.tvFragmentLoginForgottenPassword) as TextView - login=view.findViewById(R.id.btnFragmentLoginLogin) as Button - - //osluskivanje unosa - - login.setOnClickListener{ - emailString=email.text.toString().trim() - passwordString=password.text.toString().trim() - //prazan unos? - if(emailString.isEmpty()) - { - email.hint="Unesite Email adresu" - email.setHintTextColor(Color.RED) - }/* - else{ - if(checkEmail(emailString)==false){ - email.hint="Pogrešan unos, unesite ispravnu Email adresu" - email.setHintTextColor(Color.RED) - } - }*/ - if(passwordString.isEmpty()) - { - password.hint = "Unesite lozinku" - password.setHintTextColor(Color.RED) - - }/* - else{ - if(checkPassword(passwordString)==false) { - password.hint = "Lozinka mora imati najmanje 6 karaktera" - password.setHintTextColor(Color.RED) - } - } -*/ - if(!emailString.isEmpty() && !passwordString.isEmpty()&& checkPassword(passwordString)==true && checkEmail(emailString)==true) { - - var loginData= Login(emailString,passwordString) - val authApi= RetrofitHelper.getInstance().create(IAuthApi::class.java) - val request=authApi.login(loginData) - - request.enqueue(object : retrofit2.Callback { - override fun onResponse(call: Call, response: Response) { - if(response.isSuccessful()){ - val token=response.body().toString() - Toast.makeText( - activity, token, Toast.LENGTH_LONG - ).show(); - //TODO(navigate to main page) - SharedPreferencesHelper.addValue("jwt",token,activity!!) - val intent= Intent(activity!!, NavigationActivity::class.java) - startActivity(intent) - }else{ - if(response.errorBody()!=null) - Toast.makeText(activity, response.errorBody()!!.string(), Toast.LENGTH_LONG).show(); - } - - - } - - override fun onFailure(call: Call, t: Throwable) { - Toast.makeText( - activity, t.toString(), Toast.LENGTH_LONG - ).show(); - } - }) - - } - } - - // zaboravljena lozinka - forgottenPassword.setOnClickListener{ - val intent = Intent (getActivity(), ActivityForgottenPassword::class.java) - getActivity()?.startActivity(intent) - } - - - - - - return view - - } - fun checkEmail(emailString:String):Boolean{ - val emailRegex = "^[A-Za-z](.*)([@]{1})(.{1,})(\\.)(.{1,})" - if(!(emailRegex.toRegex().matches(emailString))){ - Toast.makeText( - activity, "Email adresa nije validna, pokušajte ponovo", Toast.LENGTH_LONG - ).show(); - email.setHintTextColor(Color.RED) - return false - } - else{ - return true - } - } - - fun checkPassword(passwordString:String):Boolean{ - if(passwordString.length<6){ - Toast.makeText( - activity, "Uneta lozinka nije validna, pokušajte ponovo", Toast.LENGTH_LONG - ).show(); - return false - } - return true - } - -} \ 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 deleted file mode 100644 index 9c4c370..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.example.brzodolokacije.Fragments - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.example.brzodolokacije.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [FragmentMyProfileInfo.newInstance] factory method to - * create an instance of this fragment. - */ -class FragmentMyProfileInfo : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_my_profile_info, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment FragmentMyProfileInfo. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - FragmentMyProfileInfo().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyRecensions.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyRecensions.kt deleted file mode 100644 index ce8679a..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyRecensions.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.example.brzodolokacije.Fragments - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.example.brzodolokacije.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [FragmentMyRecensions.newInstance] factory method to - * create an instance of this fragment. - */ -class FragmentMyRecensions : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_my_recensions, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment FragmentMyRecensions. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - FragmentMyRecensions().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt deleted file mode 100644 index a8176b0..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt +++ /dev/null @@ -1,93 +0,0 @@ -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 android.widget.Button -import android.widget.EditText -import android.widget.TextView -import androidx.fragment.app.FragmentTransaction -import com.example.brzodolokacije.R -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [FragmentProfile.newInstance] factory method to - * create an instance of this fragment. - */ -class FragmentProfile : Fragment(R.layout.fragment_profile) { - // TODO: Rename and change types of parameters - private lateinit var username: TextView - private lateinit var name: TextView - private lateinit var postsCount: TextView - private lateinit var followersCount: TextView - private lateinit var followingCount:TextView - private lateinit var usernameString: String - private lateinit var nameString: String - private lateinit var postsCountString: String - private lateinit var followersCountString: String - private lateinit var followingCountString:String - private lateinit var showMyPosts: Button - private lateinit var showMyData: Button - private lateinit var showMyRecensions: Button - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - val view:View= inflater.inflate(R.layout.fragment_profile, container, false) - name = view.findViewById(R.id.tvFragmentProfileName) as TextView - username = view.findViewById(R.id.tvFragmentProfileUserName) as TextView - postsCount = view.findViewById(R.id.tvFragmentProfilePostsNo) as TextView - followersCount = view.findViewById(R.id.tvFragmentProfileFollowersNo) as TextView - followingCount = view.findViewById(R.id.tvFragmentProfileFollowNo) as TextView - - showMyPosts=view.findViewById(R.id.btnFragmentProfileShowMyPosts) as Button - showMyData=view.findViewById(R.id.btnFragmentProfileShowMyData) as Button - showMyRecensions=view.findViewById(R.id.btnFragmentProfileShowMyRecensions) as Button - //podaci iz baze - - - - showMyPosts.setOnClickListener{ - - var fm: FragmentTransaction =childFragmentManager.beginTransaction() - - fm.replace(R.id.flFragmentProfileFragmentContainer,FragmentUserPosts()) - fm.commit() - } - - - showMyData.setOnClickListener{ - - var fm: FragmentTransaction =childFragmentManager.beginTransaction() - - fm.replace(R.id.flFragmentProfileFragmentContainer,FragmentMyProfileInfo()) - fm.commit() - } - - showMyRecensions.setOnClickListener{ - - var fm: FragmentTransaction =childFragmentManager.beginTransaction() - - fm.replace(R.id.flFragmentProfileFragmentContainer,FragmentMyRecensions()) - fm.commit() - } - - return view - } - - -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt deleted file mode 100644 index c9102ab..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt +++ /dev/null @@ -1,158 +0,0 @@ -package com.example.brzodolokacije.Fragments - -import android.graphics.BitmapFactory -import android.graphics.Color -import android.os.Bundle -import android.util.Base64 -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import android.widget.EditText -import android.widget.Toast -import com.example.brzodolokacije.Interfaces.IAuthApi -import com.example.brzodolokacije.Models.Auth.Register -import com.example.brzodolokacije.R -import com.example.brzodolokacije.Services.RetrofitHelper -import okhttp3.ResponseBody -import retrofit2.Call -import retrofit2.Response -import javax.security.auth.callback.Callback - -class FragmentRegister : Fragment() { - // TODO: Rename and change types of parameters - private lateinit var password: EditText - private lateinit var email: EditText - private lateinit var username: EditText - private lateinit var name: EditText - private lateinit var register: Button - private lateinit var usernameString:String - private lateinit var nameString:String - private lateinit var passwordString:String - private lateinit var emailString:String - - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - val view:View=inflater.inflate(R.layout.fragment_register, container, false) - - email = view.findViewById(R.id.etFragmentRegisterEmail) as EditText - password = view.findViewById(R.id.etFragmentRegisterPassword) as EditText - username = view.findViewById(R.id.etFragmentRegisterUser) as EditText - name = view.findViewById(R.id.etFragmentRegisterName) as EditText - register=view.findViewById(R.id.btnFragmentRegisterRegister) as Button - - //osluskivanje unosa - - register.setOnClickListener{ - emailString=email.text.toString().trim() - usernameString=username.text.toString().trim() - nameString=name.text.toString().trim() - passwordString=password.text.toString().trim() - - //prazan unos? neispravan email - if(emailString.isEmpty()) - { - email.hint="Unesite Email adresu" - email.setHintTextColor(Color.RED) - } - if(passwordString.isEmpty()) - { - password.hint = "Unesite lozinku" - password.setHintTextColor(Color.RED) - } - if(usernameString.isEmpty()) - { - username.hint = "Unesite korisničko ime" - username.setHintTextColor(Color.RED) - } - if(nameString.isEmpty()) - { - name.hint = "Unesite ime i prezime" - name.setHintTextColor(Color.RED) - } - if(!emailString.isEmpty() && !passwordString.isEmpty() && !nameString.isEmpty() - && !usernameString.isEmpty() && checkPassword(passwordString)==true - && checkEmail(emailString)==true && checkUsername(usernameString)==true) { - - var registerData=Register(nameString,usernameString,emailString,passwordString) - - val authApi=RetrofitHelper.getInstance().create(IAuthApi::class.java) - - val request=authApi.register(registerData) - - request.enqueue(object : retrofit2.Callback { - override fun onResponse(call: Call, response: Response) { - if(response.isSuccessful()){ - Toast.makeText( - activity, "Uspesna registracija. Verifikujte email.", Toast.LENGTH_LONG - ).show(); - //TODO(navigate to login) - }else{ - if(response.errorBody()!=null) { - Toast.makeText( - activity, - response.errorBody()!!.string(), - Toast.LENGTH_LONG - ).show() - } - } - - - } - - override fun onFailure(call: Call, t: Throwable) { - Toast.makeText( - activity, "Greska, pokusajte ponovo.", Toast.LENGTH_LONG - ).show(); - } - }) - - - - //***DODATI broj karaktera lozinke, provera da li je email sa @ i .com - - } - } - - - return view - } - fun checkEmail(emailString:String):Boolean{ - val emailRegex = "^[A-Za-z](.*)([@]{1})(.{1,})(\\.)(.{1,})" - if(!(emailRegex.toRegex().matches(emailString))){ - Toast.makeText( - activity, "Email adresa nije validna, pokušajte ponovo", Toast.LENGTH_LONG - ).show(); - email.setHintTextColor(Color.RED) - return false - } - else{ - return true - } - } - - fun checkPassword(passwordString:String):Boolean{ - if(passwordString.length<6){ - Toast.makeText( - activity, "Izaberite sigurniju lozinku", Toast.LENGTH_LONG - ).show(); - return false - } - return true - } - - fun checkUsername(usernameString:String):Boolean{ - if(usernameString.length<4){ - Toast.makeText( - activity, "Izaberite korisničko ime sa 4 ili više karaktera ", Toast.LENGTH_LONG - ).show(); - return false - } - return true - } -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPosts.kt deleted file mode 100644 index 561de10..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPosts.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.example.brzodolokacije.Fragments - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.example.brzodolokacije.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [FragmentUserPosts.newInstance] factory method to - * create an instance of this fragment. - */ -class FragmentUserPosts : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_user_posts, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment FragmentUserPosts. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - FragmentUserPosts().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_splash_page.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_splash_page.xml new file mode 100644 index 0000000..240bfbb --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_splash_page.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file -- cgit v1.2.3 From a8c1194dd3ec6683548d8e8fe0bb24c4b8974454 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Wed, 2 Nov 2022 23:36:21 +0100 Subject: Dodata splash page. --- .../app/src/main/AndroidManifest.xml | 19 +++++--- .../brzodolokacije/Activities/SplashPage.kt | 14 +++++- .../src/main/res/layout/activity_splash_page.xml | 51 ++++++++++++++++++++++ 3 files changed, 76 insertions(+), 8 deletions(-) diff --git a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml index edf65a2..c22f8a3 100644 --- a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml +++ b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml @@ -15,19 +15,24 @@ android:theme="@style/Theme.BrzoDoLokacije" android:usesCleartextTraffic="true" tools:targetApi="31"> - - - - - - + + + + + + + diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/SplashPage.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/SplashPage.kt index 2d3a73b..3d2f923 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/SplashPage.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/SplashPage.kt @@ -1,11 +1,23 @@ package com.example.brzodolokacije.Activities +import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.os.Handler +import com.example.brzodolokacije.MainActivity +import com.example.brzodolokacije.R class SplashPage : AppCompatActivity() { + private val time:Long = 4000 + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash_page) + + Handler().postDelayed({ + startActivity(Intent(this, MainActivity::class.java)) + + // close this activity + finish() }, time) } -} \ No newline at end of file +} diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_splash_page.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_splash_page.xml index 240bfbb..7035b22 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_splash_page.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_splash_page.xml @@ -4,6 +4,57 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="#FFFFFF" + android:backgroundTint="#388DAC" tools:context=".Activities.SplashPage"> + + + + + + + \ No newline at end of file -- cgit v1.2.3 From ca1fcebee0fa73bb24fd348785d29f059c86edfb Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Thu, 3 Nov 2022 14:27:11 +0100 Subject: Izmenjena lokacija foldera sa fragmentima. --- .../Adapters/Fragments/FragmentAddPost.kt | 48 ------- .../Adapters/Fragments/FragmentBrowse.kt | 60 -------- .../Adapters/Fragments/FragmentHome.kt | 61 -------- .../Adapters/Fragments/FragmentLogin.kt | 156 -------------------- .../Adapters/Fragments/FragmentMyProfileInfo.kt | 60 -------- .../Adapters/Fragments/FragmentMyRecensions.kt | 60 -------- .../Adapters/Fragments/FragmentProfile.kt | 93 ------------ .../Adapters/Fragments/FragmentRegister.kt | 158 --------------------- .../Adapters/Fragments/FragmentUserPosts.kt | 60 -------- .../brzodolokacije/Fragments/FragmentAddPost.kt | 48 +++++++ .../brzodolokacije/Fragments/FragmentBrowse.kt | 60 ++++++++ .../brzodolokacije/Fragments/FragmentHome.kt | 61 ++++++++ .../brzodolokacije/Fragments/FragmentLogin.kt | 156 ++++++++++++++++++++ .../Fragments/FragmentMyProfileInfo.kt | 60 ++++++++ .../Fragments/FragmentMyRecensions.kt | 60 ++++++++ .../brzodolokacije/Fragments/FragmentProfile.kt | 93 ++++++++++++ .../brzodolokacije/Fragments/FragmentRegister.kt | 158 +++++++++++++++++++++ .../brzodolokacije/Fragments/FragmentUserPosts.kt | 60 ++++++++ 18 files changed, 756 insertions(+), 756 deletions(-) delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentAddPost.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentBrowse.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentHome.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentLogin.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyProfileInfo.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyRecensions.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentProfile.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentRegister.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentUserPosts.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHome.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyRecensions.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPosts.kt diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentAddPost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentAddPost.kt deleted file mode 100644 index c00cbc5..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentAddPost.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.example.brzodolokacije.Adapters.Fragments - -import android.content.Intent -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import com.example.brzodolokacije.Activities.ActivityLoginRegister -import com.example.brzodolokacije.Activities.NavigationActivity -import com.example.brzodolokacije.R -import com.example.brzodolokacije.Services.SharedPreferencesHelper - - -class FragmentAddPost : Fragment(R.layout.fragment_add_post) { - - - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val view:View=inflater.inflate(R.layout.fragment_add_post, container, false) - // Inflate the layout for this fragment - val logOutButton=view.findViewById(R.id.btnFragmentAddLogOut) as Button - logOutButton.setOnClickListener{ - logOut() - } - return view; - } - - fun logOut(){ - if(SharedPreferencesHelper.removeValue("jwt",requireActivity())) - { - val intent= Intent(requireActivity(), ActivityLoginRegister::class.java) - startActivity(intent) - } - } - - -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentBrowse.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentBrowse.kt deleted file mode 100644 index 51745fe..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentBrowse.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.example.brzodolokacije.Adapters.Fragments - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.example.brzodolokacije.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [FragmentBrowse.newInstance] factory method to - * create an instance of this fragment. - */ -class FragmentBrowse : Fragment(R.layout.fragment_browse) { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_browse, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment FragmentBrowse. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - FragmentBrowse().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentHome.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentHome.kt deleted file mode 100644 index bb9e0cb..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentHome.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.example.brzodolokacije.Adapters.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 android.widget.Button -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.example.brzodolokacije.Adapters.SampleAdapter -import com.example.brzodolokacije.Models.ListItemModel -import com.example.brzodolokacije.R -import com.example.brzodolokacije.databinding.FragmentHomeBinding - -/** - * A simple [Fragment] subclass. - * Use the [FragmentHome.newInstance] factory method to - * create an instance of this fragment. - */ - -class FragmentHome : Fragment(R.layout.fragment_home) { - - private lateinit var binding: FragmentHomeBinding - private var nameList : MutableList = mutableListOf() - private var layoutManagerVar: RecyclerView.LayoutManager? = null - private var adapterVar: RecyclerView.Adapter? = null - private var recyclerView:RecyclerView?=null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - //load data for the list - loadData() - //instantiate adapter and linearLayout - adapterVar=SampleAdapter(nameList) - layoutManagerVar=LinearLayoutManager(activity) - } - - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val rootView = inflater?.inflate(R.layout.fragment_home, container, false) - recyclerView = rootView?.findViewById(R.id.rvMain) - // set recyclerView attributes - recyclerView?.setHasFixedSize(true) - recyclerView?.layoutManager = layoutManagerVar - recyclerView?.adapter = adapterVar - return rootView - } - fun loadData(){ - nameList.add(ListItemModel(1,"Sample 1")) - nameList.add(ListItemModel(2,"Sample 2")) - nameList.add(ListItemModel(3,"Sample 3")) - nameList.add(ListItemModel(4,"Sample 4")) - nameList.add(ListItemModel(5,"Sample 5")) - nameList.add(ListItemModel(6,"Sample 6")) - } -} diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentLogin.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentLogin.kt deleted file mode 100644 index a81505b..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentLogin.kt +++ /dev/null @@ -1,156 +0,0 @@ -package com.example.brzodolokacije.Adapters.Fragments - -import android.content.Intent -import android.graphics.Color -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import android.widget.EditText -import android.widget.TextView -import android.widget.Toast - -import com.example.brzodolokacije.Activities.ActivityLoginRegister -import com.example.brzodolokacije.Activities.NavigationActivity - -import com.example.brzodolokacije.Activities.ActivityForgottenPassword - - -import com.example.brzodolokacije.Interfaces.IAuthApi -import com.example.brzodolokacije.Models.Auth.Login -import com.example.brzodolokacije.R -import com.example.brzodolokacije.Services.RetrofitHelper -import com.example.brzodolokacije.Services.SharedPreferencesHelper -import retrofit2.Call -import retrofit2.Response - - -class FragmentLogin : Fragment() { - // TODO: Rename and change types of parameters - private lateinit var password: EditText - private lateinit var email: EditText - private lateinit var forgottenPassword: TextView - private lateinit var login: Button - private lateinit var passwordString:String - private lateinit var emailString:String - - - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - val view:View=inflater.inflate(R.layout.fragment_login, container, false) - - - email = view.findViewById(R.id.etFragmentLoginEmail) as EditText - password = view.findViewById(R.id.etFragmentLoginPassword) as EditText - forgottenPassword = view.findViewById(R.id.tvFragmentLoginForgottenPassword) as TextView - login=view.findViewById(R.id.btnFragmentLoginLogin) as Button - - //osluskivanje unosa - - login.setOnClickListener{ - emailString=email.text.toString().trim() - passwordString=password.text.toString().trim() - //prazan unos? - if(emailString.isEmpty()) - { - email.hint="Unesite Email adresu" - email.setHintTextColor(Color.RED) - }/* - else{ - if(checkEmail(emailString)==false){ - email.hint="Pogrešan unos, unesite ispravnu Email adresu" - email.setHintTextColor(Color.RED) - } - }*/ - if(passwordString.isEmpty()) - { - password.hint = "Unesite lozinku" - password.setHintTextColor(Color.RED) - - }/* - else{ - if(checkPassword(passwordString)==false) { - password.hint = "Lozinka mora imati najmanje 6 karaktera" - password.setHintTextColor(Color.RED) - } - } -*/ - if(!emailString.isEmpty() && !passwordString.isEmpty()&& checkPassword(passwordString)==true && checkEmail(emailString)==true) { - - var loginData= Login(emailString,passwordString) - val authApi= RetrofitHelper.getInstance().create(IAuthApi::class.java) - val request=authApi.login(loginData) - - request.enqueue(object : retrofit2.Callback { - override fun onResponse(call: Call, response: Response) { - if(response.isSuccessful()){ - val token=response.body().toString() - Toast.makeText( - activity, token, Toast.LENGTH_LONG - ).show(); - //TODO(navigate to main page) - SharedPreferencesHelper.addValue("jwt",token,activity!!) - val intent= Intent(activity!!, NavigationActivity::class.java) - startActivity(intent) - }else{ - if(response.errorBody()!=null) - Toast.makeText(activity, response.errorBody()!!.string(), Toast.LENGTH_LONG).show(); - } - - - } - - override fun onFailure(call: Call, t: Throwable) { - Toast.makeText( - activity, t.toString(), Toast.LENGTH_LONG - ).show(); - } - }) - - } - } - - // zaboravljena lozinka - forgottenPassword.setOnClickListener{ - val intent = Intent (getActivity(), ActivityForgottenPassword::class.java) - getActivity()?.startActivity(intent) - } - - - - - - return view - - } - fun checkEmail(emailString:String):Boolean{ - val emailRegex = "^[A-Za-z](.*)([@]{1})(.{1,})(\\.)(.{1,})" - if(!(emailRegex.toRegex().matches(emailString))){ - Toast.makeText( - activity, "Email adresa nije validna, pokušajte ponovo", Toast.LENGTH_LONG - ).show(); - email.setHintTextColor(Color.RED) - return false - } - else{ - return true - } - } - - fun checkPassword(passwordString:String):Boolean{ - if(passwordString.length<6){ - Toast.makeText( - activity, "Uneta lozinka nije validna, pokušajte ponovo", Toast.LENGTH_LONG - ).show(); - return false - } - return true - } - -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyProfileInfo.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyProfileInfo.kt deleted file mode 100644 index e846695..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyProfileInfo.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.example.brzodolokacije.Adapters.Fragments - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.example.brzodolokacije.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [FragmentMyProfileInfo.newInstance] factory method to - * create an instance of this fragment. - */ -class FragmentMyProfileInfo : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_my_profile_info, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment FragmentMyProfileInfo. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - FragmentMyProfileInfo().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyRecensions.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyRecensions.kt deleted file mode 100644 index 10bdc21..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentMyRecensions.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.example.brzodolokacije.Adapters.Fragments - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.example.brzodolokacije.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [FragmentMyRecensions.newInstance] factory method to - * create an instance of this fragment. - */ -class FragmentMyRecensions : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_my_recensions, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment FragmentMyRecensions. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - FragmentMyRecensions().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentProfile.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentProfile.kt deleted file mode 100644 index 566e1cf..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentProfile.kt +++ /dev/null @@ -1,93 +0,0 @@ -package com.example.brzodolokacije.Adapters.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 android.widget.Button -import android.widget.EditText -import android.widget.TextView -import androidx.fragment.app.FragmentTransaction -import com.example.brzodolokacije.R -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [FragmentProfile.newInstance] factory method to - * create an instance of this fragment. - */ -class FragmentProfile : Fragment(R.layout.fragment_profile) { - // TODO: Rename and change types of parameters - private lateinit var username: TextView - private lateinit var name: TextView - private lateinit var postsCount: TextView - private lateinit var followersCount: TextView - private lateinit var followingCount:TextView - private lateinit var usernameString: String - private lateinit var nameString: String - private lateinit var postsCountString: String - private lateinit var followersCountString: String - private lateinit var followingCountString:String - private lateinit var showMyPosts: Button - private lateinit var showMyData: Button - private lateinit var showMyRecensions: Button - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - val view:View= inflater.inflate(R.layout.fragment_profile, container, false) - name = view.findViewById(R.id.tvFragmentProfileName) as TextView - username = view.findViewById(R.id.tvFragmentProfileUserName) as TextView - postsCount = view.findViewById(R.id.tvFragmentProfilePostsNo) as TextView - followersCount = view.findViewById(R.id.tvFragmentProfileFollowersNo) as TextView - followingCount = view.findViewById(R.id.tvFragmentProfileFollowNo) as TextView - - showMyPosts=view.findViewById(R.id.btnFragmentProfileShowMyPosts) as Button - showMyData=view.findViewById(R.id.btnFragmentProfileShowMyData) as Button - showMyRecensions=view.findViewById(R.id.btnFragmentProfileShowMyRecensions) as Button - //podaci iz baze - - - - showMyPosts.setOnClickListener{ - - var fm: FragmentTransaction =childFragmentManager.beginTransaction() - - fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentUserPosts()) - fm.commit() - } - - - showMyData.setOnClickListener{ - - var fm: FragmentTransaction =childFragmentManager.beginTransaction() - - fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentMyProfileInfo()) - fm.commit() - } - - showMyRecensions.setOnClickListener{ - - var fm: FragmentTransaction =childFragmentManager.beginTransaction() - - fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentMyRecensions()) - fm.commit() - } - - return view - } - - -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentRegister.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentRegister.kt deleted file mode 100644 index db681a3..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentRegister.kt +++ /dev/null @@ -1,158 +0,0 @@ -package com.example.brzodolokacije.Adapters.Fragments - -import android.graphics.BitmapFactory -import android.graphics.Color -import android.os.Bundle -import android.util.Base64 -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import android.widget.EditText -import android.widget.Toast -import com.example.brzodolokacije.Interfaces.IAuthApi -import com.example.brzodolokacije.Models.Auth.Register -import com.example.brzodolokacije.R -import com.example.brzodolokacije.Services.RetrofitHelper -import okhttp3.ResponseBody -import retrofit2.Call -import retrofit2.Response -import javax.security.auth.callback.Callback - -class FragmentRegister : Fragment() { - // TODO: Rename and change types of parameters - private lateinit var password: EditText - private lateinit var email: EditText - private lateinit var username: EditText - private lateinit var name: EditText - private lateinit var register: Button - private lateinit var usernameString:String - private lateinit var nameString:String - private lateinit var passwordString:String - private lateinit var emailString:String - - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - val view:View=inflater.inflate(R.layout.fragment_register, container, false) - - email = view.findViewById(R.id.etFragmentRegisterEmail) as EditText - password = view.findViewById(R.id.etFragmentRegisterPassword) as EditText - username = view.findViewById(R.id.etFragmentRegisterUser) as EditText - name = view.findViewById(R.id.etFragmentRegisterName) as EditText - register=view.findViewById(R.id.btnFragmentRegisterRegister) as Button - - //osluskivanje unosa - - register.setOnClickListener{ - emailString=email.text.toString().trim() - usernameString=username.text.toString().trim() - nameString=name.text.toString().trim() - passwordString=password.text.toString().trim() - - //prazan unos? neispravan email - if(emailString.isEmpty()) - { - email.hint="Unesite Email adresu" - email.setHintTextColor(Color.RED) - } - if(passwordString.isEmpty()) - { - password.hint = "Unesite lozinku" - password.setHintTextColor(Color.RED) - } - if(usernameString.isEmpty()) - { - username.hint = "Unesite korisničko ime" - username.setHintTextColor(Color.RED) - } - if(nameString.isEmpty()) - { - name.hint = "Unesite ime i prezime" - name.setHintTextColor(Color.RED) - } - if(!emailString.isEmpty() && !passwordString.isEmpty() && !nameString.isEmpty() - && !usernameString.isEmpty() && checkPassword(passwordString)==true - && checkEmail(emailString)==true && checkUsername(usernameString)==true) { - - var registerData=Register(nameString,usernameString,emailString,passwordString) - - val authApi=RetrofitHelper.getInstance().create(IAuthApi::class.java) - - val request=authApi.register(registerData) - - request.enqueue(object : retrofit2.Callback { - override fun onResponse(call: Call, response: Response) { - if(response.isSuccessful()){ - Toast.makeText( - activity, "Uspesna registracija. Verifikujte email.", Toast.LENGTH_LONG - ).show(); - //TODO(navigate to login) - }else{ - if(response.errorBody()!=null) { - Toast.makeText( - activity, - response.errorBody()!!.string(), - Toast.LENGTH_LONG - ).show() - } - } - - - } - - override fun onFailure(call: Call, t: Throwable) { - Toast.makeText( - activity, "Greska, pokusajte ponovo.", Toast.LENGTH_LONG - ).show(); - } - }) - - - - //***DODATI broj karaktera lozinke, provera da li je email sa @ i .com - - } - } - - - return view - } - fun checkEmail(emailString:String):Boolean{ - val emailRegex = "^[A-Za-z](.*)([@]{1})(.{1,})(\\.)(.{1,})" - if(!(emailRegex.toRegex().matches(emailString))){ - Toast.makeText( - activity, "Email adresa nije validna, pokušajte ponovo", Toast.LENGTH_LONG - ).show(); - email.setHintTextColor(Color.RED) - return false - } - else{ - return true - } - } - - fun checkPassword(passwordString:String):Boolean{ - if(passwordString.length<6){ - Toast.makeText( - activity, "Izaberite sigurniju lozinku", Toast.LENGTH_LONG - ).show(); - return false - } - return true - } - - fun checkUsername(usernameString:String):Boolean{ - if(usernameString.length<4){ - Toast.makeText( - activity, "Izaberite korisničko ime sa 4 ili više karaktera ", Toast.LENGTH_LONG - ).show(); - return false - } - return true - } -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentUserPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentUserPosts.kt deleted file mode 100644 index 866c0f8..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/Fragments/FragmentUserPosts.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.example.brzodolokacije.Adapters.Fragments - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.example.brzodolokacije.R - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [FragmentUserPosts.newInstance] factory method to - * create an instance of this fragment. - */ -class FragmentUserPosts : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_user_posts, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment FragmentUserPosts. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - FragmentUserPosts().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt new file mode 100644 index 0000000..b6452e9 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt @@ -0,0 +1,48 @@ +package com.example.brzodolokacije.Fragments + +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import com.example.brzodolokacije.Activities.ActivityLoginRegister +import com.example.brzodolokacije.Activities.NavigationActivity +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.SharedPreferencesHelper + + +class FragmentAddPost : Fragment(R.layout.fragment_add_post) { + + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view:View=inflater.inflate(R.layout.fragment_add_post, container, false) + // Inflate the layout for this fragment + val logOutButton=view.findViewById(R.id.btnFragmentAddLogOut) as Button + logOutButton.setOnClickListener{ + logOut() + } + return view; + } + + fun logOut(){ + if(SharedPreferencesHelper.removeValue("jwt",requireActivity())) + { + val intent= Intent(requireActivity(), ActivityLoginRegister::class.java) + startActivity(intent) + } + } + + +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt new file mode 100644 index 0000000..1bd98a0 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentBrowse.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentBrowse.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentBrowse : Fragment(R.layout.fragment_browse) { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_browse, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentBrowse. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentBrowse().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHome.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHome.kt new file mode 100644 index 0000000..fd5aa33 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentHome.kt @@ -0,0 +1,61 @@ +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 android.widget.Button +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Adapters.SampleAdapter +import com.example.brzodolokacije.Models.ListItemModel +import com.example.brzodolokacije.R +import com.example.brzodolokacije.databinding.FragmentHomeBinding + +/** + * A simple [Fragment] subclass. + * Use the [FragmentHome.newInstance] factory method to + * create an instance of this fragment. + */ + +class FragmentHome : Fragment(R.layout.fragment_home) { + + private lateinit var binding: FragmentHomeBinding + private var nameList : MutableList = mutableListOf() + private var layoutManagerVar: RecyclerView.LayoutManager? = null + private var adapterVar: RecyclerView.Adapter? = null + private var recyclerView:RecyclerView?=null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + //load data for the list + loadData() + //instantiate adapter and linearLayout + adapterVar=SampleAdapter(nameList) + layoutManagerVar=LinearLayoutManager(activity) + } + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val rootView = inflater?.inflate(R.layout.fragment_home, container, false) + recyclerView = rootView?.findViewById(R.id.rvMain) + // set recyclerView attributes + recyclerView?.setHasFixedSize(true) + recyclerView?.layoutManager = layoutManagerVar + recyclerView?.adapter = adapterVar + return rootView + } + fun loadData(){ + nameList.add(ListItemModel(1,"Sample 1")) + nameList.add(ListItemModel(2,"Sample 2")) + nameList.add(ListItemModel(3,"Sample 3")) + nameList.add(ListItemModel(4,"Sample 4")) + nameList.add(ListItemModel(5,"Sample 5")) + nameList.add(ListItemModel(6,"Sample 6")) + } +} diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt new file mode 100644 index 0000000..b9568df --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt @@ -0,0 +1,156 @@ +package com.example.brzodolokacije.Fragments + +import android.content.Intent +import android.graphics.Color +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.EditText +import android.widget.TextView +import android.widget.Toast + +import com.example.brzodolokacije.Activities.ActivityLoginRegister +import com.example.brzodolokacije.Activities.NavigationActivity + +import com.example.brzodolokacije.Activities.ActivityForgottenPassword + + +import com.example.brzodolokacije.Interfaces.IAuthApi +import com.example.brzodolokacije.Models.Auth.Login +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import retrofit2.Call +import retrofit2.Response + + +class FragmentLogin : Fragment() { + // TODO: Rename and change types of parameters + private lateinit var password: EditText + private lateinit var email: EditText + private lateinit var forgottenPassword: TextView + private lateinit var login: Button + private lateinit var passwordString:String + private lateinit var emailString:String + + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + val view:View=inflater.inflate(R.layout.fragment_login, container, false) + + + email = view.findViewById(R.id.etFragmentLoginEmail) as EditText + password = view.findViewById(R.id.etFragmentLoginPassword) as EditText + forgottenPassword = view.findViewById(R.id.tvFragmentLoginForgottenPassword) as TextView + login=view.findViewById(R.id.btnFragmentLoginLogin) as Button + + //osluskivanje unosa + + login.setOnClickListener{ + emailString=email.text.toString().trim() + passwordString=password.text.toString().trim() + //prazan unos? + if(emailString.isEmpty()) + { + email.hint="Unesite Email adresu" + email.setHintTextColor(Color.RED) + }/* + else{ + if(checkEmail(emailString)==false){ + email.hint="Pogrešan unos, unesite ispravnu Email adresu" + email.setHintTextColor(Color.RED) + } + }*/ + if(passwordString.isEmpty()) + { + password.hint = "Unesite lozinku" + password.setHintTextColor(Color.RED) + + }/* + else{ + if(checkPassword(passwordString)==false) { + password.hint = "Lozinka mora imati najmanje 6 karaktera" + password.setHintTextColor(Color.RED) + } + } +*/ + if(!emailString.isEmpty() && !passwordString.isEmpty()&& checkPassword(passwordString)==true && checkEmail(emailString)==true) { + + var loginData= Login(emailString,passwordString) + val authApi= RetrofitHelper.getInstance().create(IAuthApi::class.java) + val request=authApi.login(loginData) + + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful()){ + val token=response.body().toString() + Toast.makeText( + activity, token, Toast.LENGTH_LONG + ).show(); + //TODO(navigate to main page) + SharedPreferencesHelper.addValue("jwt",token,activity!!) + val intent= Intent(activity!!, NavigationActivity::class.java) + startActivity(intent) + }else{ + if(response.errorBody()!=null) + Toast.makeText(activity, response.errorBody()!!.string(), Toast.LENGTH_LONG).show(); + } + + + } + + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText( + activity, t.toString(), Toast.LENGTH_LONG + ).show(); + } + }) + + } + } + + // zaboravljena lozinka + forgottenPassword.setOnClickListener{ + val intent = Intent (getActivity(), ActivityForgottenPassword::class.java) + getActivity()?.startActivity(intent) + } + + + + + + return view + + } + fun checkEmail(emailString:String):Boolean{ + val emailRegex = "^[A-Za-z](.*)([@]{1})(.{1,})(\\.)(.{1,})" + if(!(emailRegex.toRegex().matches(emailString))){ + Toast.makeText( + activity, "Email adresa nije validna, pokušajte ponovo", Toast.LENGTH_LONG + ).show(); + email.setHintTextColor(Color.RED) + return false + } + else{ + return true + } + } + + fun checkPassword(passwordString:String):Boolean{ + if(passwordString.length<6){ + Toast.makeText( + activity, "Uneta lozinka nije validna, pokušajte ponovo", Toast.LENGTH_LONG + ).show(); + return false + } + return true + } + +} \ 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 new file mode 100644 index 0000000..9c4c370 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentMyProfileInfo.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentMyProfileInfo : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_my_profile_info, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentMyProfileInfo. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentMyProfileInfo().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyRecensions.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyRecensions.kt new file mode 100644 index 0000000..ce8679a --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyRecensions.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentMyRecensions.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentMyRecensions : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_my_recensions, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentMyRecensions. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentMyRecensions().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt new file mode 100644 index 0000000..c9ce8cc --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt @@ -0,0 +1,93 @@ +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 android.widget.Button +import android.widget.EditText +import android.widget.TextView +import androidx.fragment.app.FragmentTransaction +import com.example.brzodolokacije.R +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentProfile.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentProfile : Fragment(R.layout.fragment_profile) { + // TODO: Rename and change types of parameters + private lateinit var username: TextView + private lateinit var name: TextView + private lateinit var postsCount: TextView + private lateinit var followersCount: TextView + private lateinit var followingCount:TextView + private lateinit var usernameString: String + private lateinit var nameString: String + private lateinit var postsCountString: String + private lateinit var followersCountString: String + private lateinit var followingCountString:String + private lateinit var showMyPosts: Button + private lateinit var showMyData: Button + private lateinit var showMyRecensions: Button + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + val view:View= inflater.inflate(R.layout.fragment_profile, container, false) + name = view.findViewById(R.id.tvFragmentProfileName) as TextView + username = view.findViewById(R.id.tvFragmentProfileUserName) as TextView + postsCount = view.findViewById(R.id.tvFragmentProfilePostsNo) as TextView + followersCount = view.findViewById(R.id.tvFragmentProfileFollowersNo) as TextView + followingCount = view.findViewById(R.id.tvFragmentProfileFollowNo) as TextView + + showMyPosts=view.findViewById(R.id.btnFragmentProfileShowMyPosts) as Button + showMyData=view.findViewById(R.id.btnFragmentProfileShowMyData) as Button + showMyRecensions=view.findViewById(R.id.btnFragmentProfileShowMyRecensions) as Button + //podaci iz baze + + + + showMyPosts.setOnClickListener{ + + var fm: FragmentTransaction =childFragmentManager.beginTransaction() + + fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentUserPosts()) + fm.commit() + } + + + showMyData.setOnClickListener{ + + var fm: FragmentTransaction =childFragmentManager.beginTransaction() + + fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentMyProfileInfo()) + fm.commit() + } + + showMyRecensions.setOnClickListener{ + + var fm: FragmentTransaction =childFragmentManager.beginTransaction() + + fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentMyRecensions()) + fm.commit() + } + + return view + } + + +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt new file mode 100644 index 0000000..c9102ab --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt @@ -0,0 +1,158 @@ +package com.example.brzodolokacije.Fragments + +import android.graphics.BitmapFactory +import android.graphics.Color +import android.os.Bundle +import android.util.Base64 +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.EditText +import android.widget.Toast +import com.example.brzodolokacije.Interfaces.IAuthApi +import com.example.brzodolokacije.Models.Auth.Register +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.Response +import javax.security.auth.callback.Callback + +class FragmentRegister : Fragment() { + // TODO: Rename and change types of parameters + private lateinit var password: EditText + private lateinit var email: EditText + private lateinit var username: EditText + private lateinit var name: EditText + private lateinit var register: Button + private lateinit var usernameString:String + private lateinit var nameString:String + private lateinit var passwordString:String + private lateinit var emailString:String + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + val view:View=inflater.inflate(R.layout.fragment_register, container, false) + + email = view.findViewById(R.id.etFragmentRegisterEmail) as EditText + password = view.findViewById(R.id.etFragmentRegisterPassword) as EditText + username = view.findViewById(R.id.etFragmentRegisterUser) as EditText + name = view.findViewById(R.id.etFragmentRegisterName) as EditText + register=view.findViewById(R.id.btnFragmentRegisterRegister) as Button + + //osluskivanje unosa + + register.setOnClickListener{ + emailString=email.text.toString().trim() + usernameString=username.text.toString().trim() + nameString=name.text.toString().trim() + passwordString=password.text.toString().trim() + + //prazan unos? neispravan email + if(emailString.isEmpty()) + { + email.hint="Unesite Email adresu" + email.setHintTextColor(Color.RED) + } + if(passwordString.isEmpty()) + { + password.hint = "Unesite lozinku" + password.setHintTextColor(Color.RED) + } + if(usernameString.isEmpty()) + { + username.hint = "Unesite korisničko ime" + username.setHintTextColor(Color.RED) + } + if(nameString.isEmpty()) + { + name.hint = "Unesite ime i prezime" + name.setHintTextColor(Color.RED) + } + if(!emailString.isEmpty() && !passwordString.isEmpty() && !nameString.isEmpty() + && !usernameString.isEmpty() && checkPassword(passwordString)==true + && checkEmail(emailString)==true && checkUsername(usernameString)==true) { + + var registerData=Register(nameString,usernameString,emailString,passwordString) + + val authApi=RetrofitHelper.getInstance().create(IAuthApi::class.java) + + val request=authApi.register(registerData) + + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful()){ + Toast.makeText( + activity, "Uspesna registracija. Verifikujte email.", Toast.LENGTH_LONG + ).show(); + //TODO(navigate to login) + }else{ + if(response.errorBody()!=null) { + Toast.makeText( + activity, + response.errorBody()!!.string(), + Toast.LENGTH_LONG + ).show() + } + } + + + } + + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText( + activity, "Greska, pokusajte ponovo.", Toast.LENGTH_LONG + ).show(); + } + }) + + + + //***DODATI broj karaktera lozinke, provera da li je email sa @ i .com + + } + } + + + return view + } + fun checkEmail(emailString:String):Boolean{ + val emailRegex = "^[A-Za-z](.*)([@]{1})(.{1,})(\\.)(.{1,})" + if(!(emailRegex.toRegex().matches(emailString))){ + Toast.makeText( + activity, "Email adresa nije validna, pokušajte ponovo", Toast.LENGTH_LONG + ).show(); + email.setHintTextColor(Color.RED) + return false + } + else{ + return true + } + } + + fun checkPassword(passwordString:String):Boolean{ + if(passwordString.length<6){ + Toast.makeText( + activity, "Izaberite sigurniju lozinku", Toast.LENGTH_LONG + ).show(); + return false + } + return true + } + + fun checkUsername(usernameString:String):Boolean{ + if(usernameString.length<4){ + Toast.makeText( + activity, "Izaberite korisničko ime sa 4 ili više karaktera ", Toast.LENGTH_LONG + ).show(); + return false + } + return true + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPosts.kt new file mode 100644 index 0000000..561de10 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPosts.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentUserPosts.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentUserPosts : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_user_posts, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentUserPosts. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentUserPosts().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file -- cgit v1.2.3 From 52c9954d4eb3461849d8c7519d8820508a5e57ec Mon Sep 17 00:00:00 2001 From: Jelena Petrovic Date: Thu, 3 Nov 2022 16:31:04 +0100 Subject: Generisana aktivnost za listu objava i potrebni xml fajlovi, zapocet rad na izgledu liste objava #17 --- .../app/src/main/AndroidManifest.xml | 9 +++ .../brzodolokacije/Activities/ActivityShowPosts.kt | 12 +++ .../app/src/main/res/drawable/filter.png | Bin 0 -> 829 bytes .../res/drawable/rounded_picture_background.xml | 5 ++ .../app/src/main/res/drawable/sort.png | Bin 0 -> 3953 bytes .../src/main/res/layout/activity_show_posts.xml | 7 ++ .../app/src/main/res/layout/post_preview.xml | 84 +++++++++++++++++++++ .../app/src/main/res/values-land/dimens.xml | 3 + .../app/src/main/res/values-w1240dp/dimens.xml | 3 + .../app/src/main/res/values-w600dp/dimens.xml | 3 + .../app/src/main/res/values/colors.xml | 2 +- .../app/src/main/res/values/dimens.xml | 3 + 12 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowPosts.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/filter.png create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/sort.png create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_posts.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/values-land/dimens.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/values-w1240dp/dimens.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/values-w600dp/dimens.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/values/dimens.xml diff --git a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml index c22f8a3..7a257ec 100644 --- a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml +++ b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml @@ -15,13 +15,22 @@ android:theme="@style/Theme.BrzoDoLokacije" android:usesCleartextTraffic="true" tools:targetApi="31"> + + + + + diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowPosts.kt new file mode 100644 index 0000000..d1ad0a9 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowPosts.kt @@ -0,0 +1,12 @@ +package com.example.brzodolokacije.Activities + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.example.brzodolokacije.R + +class ActivityShowPosts : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_show_posts) + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/filter.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/filter.png new file mode 100644 index 0000000..8cf4b39 Binary files /dev/null and b/Client/BrzoDoLokacije/app/src/main/res/drawable/filter.png differ diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml new file mode 100644 index 0000000..85f54be --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/sort.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/sort.png new file mode 100644 index 0000000..828cd01 Binary files /dev/null and b/Client/BrzoDoLokacije/app/src/main/res/drawable/sort.png differ diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_posts.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_posts.xml new file mode 100644 index 0000000..20c7560 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_posts.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml new file mode 100644 index 0000000..abbd549 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/values-land/dimens.xml b/Client/BrzoDoLokacije/app/src/main/res/values-land/dimens.xml new file mode 100644 index 0000000..10125a3 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/values-land/dimens.xml @@ -0,0 +1,3 @@ + + 48dp + \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/values-w1240dp/dimens.xml b/Client/BrzoDoLokacije/app/src/main/res/values-w1240dp/dimens.xml new file mode 100644 index 0000000..ec434d3 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/values-w1240dp/dimens.xml @@ -0,0 +1,3 @@ + + 200dp + \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/values-w600dp/dimens.xml b/Client/BrzoDoLokacije/app/src/main/res/values-w600dp/dimens.xml new file mode 100644 index 0000000..10125a3 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/values-w600dp/dimens.xml @@ -0,0 +1,3 @@ + + 48dp + \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/values/colors.xml b/Client/BrzoDoLokacije/app/src/main/res/values/colors.xml index 588b9cf..0d4da4f 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/values/colors.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/values/colors.xml @@ -7,5 +7,5 @@ #FF018786 #FF000000 #FFFFFFFF - + #DE093A4C \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/values/dimens.xml b/Client/BrzoDoLokacije/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..b789d50 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/values/dimens.xml @@ -0,0 +1,3 @@ + + 16dp + \ No newline at end of file -- cgit v1.2.3 From dbb8e2ed722c71916664c9a0a9bd19cc5f5ff1f1 Mon Sep 17 00:00:00 2001 From: "branislav.radivojevic" Date: Thu, 3 Nov 2022 18:03:51 +0100 Subject: Back verification pages,pass reset, code cleanup --- Backend/Api/Api/Assets/VerifyFailed.html | 13 ++++++ Backend/Api/Api/Assets/VerifySuccess.html | 14 ++++++ Backend/Api/Api/Assets/logotima.png | Bin 0 -> 377184 bytes Backend/Api/Api/Controllers/AuthController.cs | 52 +++++++++++++++++---- Backend/Api/Api/Interfaces/IJwtService.cs | 3 +- Backend/Api/Api/Interfaces/IUserService.cs | 6 ++- Backend/Api/Api/Program.cs | 5 +- Backend/Api/Api/Services/JwtService.cs | 34 ++------------ Backend/Api/Api/Services/UserService.cs | 64 ++++++++++++++++++++++---- Backend/Api/Api/appsettings.json | 14 ++++-- 10 files changed, 145 insertions(+), 60 deletions(-) create mode 100644 Backend/Api/Api/Assets/VerifyFailed.html create mode 100644 Backend/Api/Api/Assets/VerifySuccess.html create mode 100644 Backend/Api/Api/Assets/logotima.png diff --git a/Backend/Api/Api/Assets/VerifyFailed.html b/Backend/Api/Api/Assets/VerifyFailed.html new file mode 100644 index 0000000..f1e41e4 --- /dev/null +++ b/Backend/Api/Api/Assets/VerifyFailed.html @@ -0,0 +1,13 @@ + + + + + Verification Failed + + +
+ +

Token timed out

+
+ + \ No newline at end of file diff --git a/Backend/Api/Api/Assets/VerifySuccess.html b/Backend/Api/Api/Assets/VerifySuccess.html new file mode 100644 index 0000000..50c01d2 --- /dev/null +++ b/Backend/Api/Api/Assets/VerifySuccess.html @@ -0,0 +1,14 @@ + + + + + Verification Successful + + +
+ +

Welcome to BrzoDoLokacije

+

We are glad to have you, {{name}} as a member.

+
+ + \ No newline at end of file diff --git a/Backend/Api/Api/Assets/logotima.png b/Backend/Api/Api/Assets/logotima.png new file mode 100644 index 0000000..85137ac Binary files /dev/null and b/Backend/Api/Api/Assets/logotima.png differ diff --git a/Backend/Api/Api/Controllers/AuthController.cs b/Backend/Api/Api/Controllers/AuthController.cs index d835d97..cbd5eb8 100644 --- a/Backend/Api/Api/Controllers/AuthController.cs +++ b/Backend/Api/Api/Controllers/AuthController.cs @@ -1,5 +1,6 @@ using Api.Interfaces; using Api.Models; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Api.Controllers @@ -8,12 +9,14 @@ namespace Api.Controllers public class AuthController : Controller { private readonly IUserService _userService; - public AuthController(IUserService userService) + private readonly IJwtService _jwtService; + public AuthController(IUserService userService,IJwtService jwtService) { _userService = userService; + _jwtService = jwtService; } - [HttpPost("register")] + [HttpPost("registerdeprecated")] public async Task> Register([FromBody] Register creds) { //this is beyond scuffed and will be cleaned up later, when users,login and controllers are made @@ -47,19 +50,26 @@ namespace Api.Controllers } return BadRequest("Pogresno uneti podaci"); } - [HttpPost("registeractual")] + [HttpPost("register")] public async Task> RegisterActual([FromBody] Register creds) { var msg = await _userService.Register(creds); - if (msg == "Email Exists") - return Forbid(msg); - if (msg == "Username Exists") - return Forbid(msg); - return Ok(msg); + switch (msg) + { + case "User Registered": + return Ok(msg); + default: + return BadRequest(msg); + } } [HttpPost("verify")] public async Task> VerifyEmail([FromBody] VerifyUser creds) { + var vrfchk = new Login(); + vrfchk.email = creds.email; + vrfchk.password = creds.password; + if (await _userService.CheckVerification(vrfchk)) + return Ok("User already verified"); var uspeh = await _userService.VerifyUser(creds); if (!uspeh) return BadRequest("Kod netacan ili istekao"); @@ -73,5 +83,31 @@ namespace Api.Controllers return BadRequest("Kod netacan ili istekao"); return Ok("Sifra uspesno resetovana"); } + [HttpPost("forgotpass")] + public async Task> ForgotPass([FromBody] JustMail justMail) + { + if (await _userService.ForgotPassword(justMail)) + return Ok("Email poslat"); + return BadRequest("Email nema registrovan nalog"); + } + [HttpGet("verifytoken/{token}")] + public async Task> VerifyEmailToken(string token) + { + var username =_jwtService.EmailTokenToClaim(token,"username"); + string html; + if (username == null) + { + html = await System.IO.File.ReadAllTextAsync(@"./Assets/VerifyFailed.html"); + return base.Content(html, "text/html"); + } + else + { + html = await System.IO.File.ReadAllTextAsync(@"./Assets/VerifySuccess.html"); + html = html.Replace("{{name}}", username); + + await _userService.VerifyFromToken(token); + return base.Content(html, "text/html"); + } + } } } diff --git a/Backend/Api/Api/Interfaces/IJwtService.cs b/Backend/Api/Api/Interfaces/IJwtService.cs index 6274bf9..8d0038f 100644 --- a/Backend/Api/Api/Interfaces/IJwtService.cs +++ b/Backend/Api/Api/Interfaces/IJwtService.cs @@ -7,7 +7,6 @@ namespace Api.Interfaces string GenToken(User user); string TokenToId(string token); public string GenEmailToken(User user); - public string EmailTokenToId(string token); - public string EmailTokenToKod(string token); + public string EmailTokenToClaim(string token,string claim); } } \ No newline at end of file diff --git a/Backend/Api/Api/Interfaces/IUserService.cs b/Backend/Api/Api/Interfaces/IUserService.cs index 5205028..218c67a 100644 --- a/Backend/Api/Api/Interfaces/IUserService.cs +++ b/Backend/Api/Api/Interfaces/IUserService.cs @@ -17,10 +17,12 @@ namespace Api.Interfaces Task Register(Register register); Task VerifyUser(VerifyUser login); Task UserIdFromJwt(); - Task ResendVerifyKod(Login login); - Boolean SendEmailKod(User user); + Task ResendVerifyEmail(Login login); + Boolean SendEmailKod(User user,int msgid); Task ForgotPassword(JustMail jm); Task ResetPassword(ResetPass rp); + Task CheckVerification(Login login); + Task VerifyFromToken(string token); } } diff --git a/Backend/Api/Api/Program.cs b/Backend/Api/Api/Program.cs index 4643937..6c96331 100644 --- a/Backend/Api/Api/Program.cs +++ b/Backend/Api/Api/Program.cs @@ -1,4 +1,3 @@ -using System.Text; using Api.Database; using Api.Interfaces; using Api.Services; @@ -6,6 +5,7 @@ using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using MongoDB.Driver; +using System.Text; var builder = WebApplication.CreateBuilder(args); @@ -30,7 +30,8 @@ builder.Services.AddHttpContextAccessor(); //Add Authentication builder.Services.AddAuthentication( - JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => { + JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => + { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, diff --git a/Backend/Api/Api/Services/JwtService.cs b/Backend/Api/Api/Services/JwtService.cs index 9d928f7..fbf5724 100644 --- a/Backend/Api/Api/Services/JwtService.cs +++ b/Backend/Api/Api/Services/JwtService.cs @@ -72,7 +72,7 @@ namespace Api.Services return tokenHandler.WriteToken(token); } - public string EmailTokenToId(string token) + public string EmailTokenToClaim(string token,string claim) { if (token == null) return null; @@ -90,41 +90,13 @@ namespace Api.Services }, out SecurityToken validatedToken); var jwtToken = (JwtSecurityToken)validatedToken; - var username = (jwtToken.Claims.First(x => x.Type == "username").Value.ToString()); - return username; + var result = (jwtToken.Claims.First(x => x.Type == claim).Value.ToString()); + return result; } catch { return null; } } - - public string EmailTokenToKod(string token) - { - if (token == null) - return null; - var tokenHandler = new JwtSecurityTokenHandler(); - var key = Encoding.ASCII.GetBytes(_config.GetSection("AppSettings:EmailToken").Value.ToString()); - try - { - tokenHandler.ValidateToken(token, new TokenValidationParameters - { - ValidateIssuerSigningKey = true, - IssuerSigningKey = new SymmetricSecurityKey(key), - ValidateIssuer = false, - ValidateAudience = false, - ClockSkew = TimeSpan.Zero - }, - out SecurityToken validatedToken); - var jwtToken = (JwtSecurityToken)validatedToken; - var kod = (jwtToken.Claims.First(x => x.Type == "kod").Value.ToString()); - return kod; - } - catch - { - return null; - } - } - } } diff --git a/Backend/Api/Api/Services/UserService.cs b/Backend/Api/Api/Services/UserService.cs index 3002f34..034c494 100644 --- a/Backend/Api/Api/Services/UserService.cs +++ b/Backend/Api/Api/Services/UserService.cs @@ -114,9 +114,16 @@ namespace Api.Services foreach(var usr in unverified) { //ako user nema validan emailtoken, a nije verifikovan prethodno, onda se brise iz baze - if (_jwtService.EmailTokenToId(usr.emailToken) == null) + if (_jwtService.EmailTokenToClaim(usr.emailToken,"id") == null) await _users.FindOneAndDeleteAsync(x => x._id == usr._id); } + foreach (var usr in unverified) + { + if (usr.email == register.email && _jwtService.EmailTokenToClaim(usr.emailToken,"id") != null) + return "Unverified Email Exists, check your inbox"; + if (usr.username == register.username && _jwtService.EmailTokenToClaim(usr.emailToken,"id") != null) + return "Unverified Username Exists, please select another"; + } } } @@ -133,7 +140,7 @@ namespace Api.Services user.emailToken = _jwtService.GenEmailToken(user); await _users.ReplaceOneAsync(x => x._id == user._id, user); - SendEmailKod(user); + SendEmailKod(user,1); return "User Registered"; } @@ -143,11 +150,12 @@ namespace Api.Services User user = await _users.FindAsync(x => x.email == login.email).Result.FirstOrDefaultAsync(); if (user != null && checkPassword(login.password, user.password)) { - var basekod = _jwtService.EmailTokenToKod(user.emailToken); + var basekod = _jwtService.EmailTokenToClaim(user.emailToken,"kod"); if (basekod != null) if (String.Compare(login.kod,basekod) == 0) { user.verified = true; + user.emailToken = ""; await _users.ReplaceOneAsync(x => x._id == user._id, user); return true; } @@ -188,33 +196,47 @@ namespace Api.Services return id; } - public async Task ResendVerifyKod(Login login) + public async Task ResendVerifyEmail(Login login) { User user = await _users.FindAsync(x => x.email == login.email).Result.FirstOrDefaultAsync(); if (user != null && checkPassword(login.password, user.password)) { user.emailToken = _jwtService.GenEmailToken(user); await _users.ReplaceOneAsync(x => x._id == user._id, user); - SendEmailKod(user); + SendEmailKod(user,1); return true; } return false; } - public Boolean SendEmailKod(User user) + + public Boolean SendEmailKod(User user,int msgid) //1 - email verification, 2 - password reset { MimeMessage message = new MimeMessage(); message.From.Add(new MailboxAddress("Tim Oddyssey", _configuration.GetSection("EmailCfg:Email").Value)); message.To.Add(MailboxAddress.Parse(user.email)); message.Subject = "Vas Oddyssey verifikacioni kod"; //think of something better yeah? - var kod = _jwtService.EmailTokenToKod(user.emailToken); + var kod = _jwtService.EmailTokenToClaim(user.emailToken,"kod"); if (kod == null) return false; var bodybuilder = new BodyBuilder(); - bodybuilder.HtmlBody = String.Format(@"

Verfikacioni kod:

"+kod+"


Kod traje 30 minuta

"); + switch(msgid){ + case 1: + //bodybuilder.HtmlBody = String.Format(@"

Verfikacioni kod:

" + kod + "


Kod traje 30 minuta

"); + bodybuilder.HtmlBody = String.Format(@"

Link za verifikaciju emaila:


" + + "
" + + "" + + "
" + + "

Link traje 30 minuta

"); + break; + case 2: + bodybuilder.HtmlBody = String.Format(@"

Verfikacioni kod:

" + kod + "


Kod traje 30 minuta

"); + break; + } + message.Body = bodybuilder.ToMessageBody(); SmtpClient client = new SmtpClient(); @@ -244,7 +266,7 @@ namespace Api.Services { user.emailToken = _jwtService.GenEmailToken(user); await _users.ReplaceOneAsync(x => x._id == user._id, user); - SendEmailKod(user); + SendEmailKod(user,2); return true; } @@ -256,16 +278,38 @@ namespace Api.Services User user = await _users.FindAsync(x => x.email == rp.email && x.verified == true).Result.FirstOrDefaultAsync(); if (user != null) { - var basekod = _jwtService.EmailTokenToKod(user.emailToken); + var basekod = _jwtService.EmailTokenToClaim(user.emailToken,"kod"); if (basekod != null) if (String.Compare(rp.kod, basekod) == 0) { user.password = hashPassword(rp.newpass); + user.emailToken = ""; await _users.ReplaceOneAsync(x => x._id == user._id, user); return true; } } return false; } + public async Task CheckVerification(Login login) + { + User user = await _users.FindAsync(x => x.email == login.email).Result.FirstOrDefaultAsync(); + if (user != null && checkPassword(login.password, user.password) && user.verified == true) + { + return true; + } + return false; + } + public async Task VerifyFromToken(string token) + { + User user = await _users.FindAsync(x => x.emailToken == token).Result.FirstOrDefaultAsync(); + if(user != null) + { + user.verified = true; + user.emailToken = ""; + await _users.ReplaceOneAsync(x => x._id == user._id, user); + return true; + } + return false; + } } } diff --git a/Backend/Api/Api/appsettings.json b/Backend/Api/Api/appsettings.json index 48086f3..74cfa27 100644 --- a/Backend/Api/Api/appsettings.json +++ b/Backend/Api/Api/appsettings.json @@ -18,9 +18,13 @@ "UserCollectionName": "users" }, - "EmailCfg": { - "Email": "oddyssey.brzodolokacije@gmail.com", - "SmtpServer": "smtp.gmail.com", - "Password": "nrokhfcwahfbqnpp" //msbs#556 - } + "EmailCfg": { + "Email": "oddyssey.brzodolokacije@gmail.com", + "SmtpServer": "smtp.gmail.com", + "Password": "nrokhfcwahfbqnpp" //msbs#556 + }, + "URLs": { + "localhost": "http://localhost:5279/", + "actual":"add url when back put onto server" + } } -- cgit v1.2.3 From 1513d1b5eba692d50c733e7c682c1e31d515158a Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 3 Nov 2022 20:06:46 +0100 Subject: Napravljeni kosturi za PostController i PostServices. Dodata nova kolekcija u bazi. --- Backend/Api/Api/Controllers/PostController.cs | 18 ++++++++++++++++++ Backend/Api/Api/Database/DatabaseConnection.cs | 1 + Backend/Api/Api/Interfaces/IDatabaseConnection.cs | 1 + Backend/Api/Api/Interfaces/IPostService.cs | 9 +++++++++ Backend/Api/Api/Program.cs | 1 + Backend/Api/Api/Services/PostService.cs | 22 ++++++++++++++++++++++ Backend/Api/Api/appsettings.json | 3 ++- 7 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 Backend/Api/Api/Controllers/PostController.cs create mode 100644 Backend/Api/Api/Interfaces/IPostService.cs create mode 100644 Backend/Api/Api/Services/PostService.cs diff --git a/Backend/Api/Api/Controllers/PostController.cs b/Backend/Api/Api/Controllers/PostController.cs new file mode 100644 index 0000000..4bac0e5 --- /dev/null +++ b/Backend/Api/Api/Controllers/PostController.cs @@ -0,0 +1,18 @@ +using Api.Interfaces; +using Microsoft.AspNetCore.Mvc; + +// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 + +namespace Api.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class PostController : ControllerBase + { + private readonly IPostService _postService; + public PostController(IPostService postService) + { + _postService = postService; + } + } +} diff --git a/Backend/Api/Api/Database/DatabaseConnection.cs b/Backend/Api/Api/Database/DatabaseConnection.cs index 65f4f52..c2fea05 100644 --- a/Backend/Api/Api/Database/DatabaseConnection.cs +++ b/Backend/Api/Api/Database/DatabaseConnection.cs @@ -7,5 +7,6 @@ namespace Api.Database public string ConnectionString { get; set; } = String.Empty; public string DatabaseName { get; set; } = String.Empty; public string UserCollectionName { get; set; } = String.Empty; + public string PostCollectionName { get; set; } = String.Empty; } } diff --git a/Backend/Api/Api/Interfaces/IDatabaseConnection.cs b/Backend/Api/Api/Interfaces/IDatabaseConnection.cs index 8938127..e3fc60c 100644 --- a/Backend/Api/Api/Interfaces/IDatabaseConnection.cs +++ b/Backend/Api/Api/Interfaces/IDatabaseConnection.cs @@ -5,5 +5,6 @@ string ConnectionString { get; set; } string DatabaseName { get; set; } string UserCollectionName { get; set; } + string PostCollectionName { get; set; } } } diff --git a/Backend/Api/Api/Interfaces/IPostService.cs b/Backend/Api/Api/Interfaces/IPostService.cs new file mode 100644 index 0000000..6c34e69 --- /dev/null +++ b/Backend/Api/Api/Interfaces/IPostService.cs @@ -0,0 +1,9 @@ +using Api.Models; + +namespace Api.Interfaces +{ + public interface IPostService + { + PostSend addPost(PostReceive post); + } +} \ No newline at end of file diff --git a/Backend/Api/Api/Program.cs b/Backend/Api/Api/Program.cs index 6c96331..9b80f3c 100644 --- a/Backend/Api/Api/Program.cs +++ b/Backend/Api/Api/Program.cs @@ -22,6 +22,7 @@ builder.Services.AddSingleton(s => builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHttpContextAccessor(); diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs new file mode 100644 index 0000000..2a5e789 --- /dev/null +++ b/Backend/Api/Api/Services/PostService.cs @@ -0,0 +1,22 @@ +using Api.Interfaces; +using Api.Models; +using MongoDB.Driver; + +namespace Api.Services +{ + public class PostService : IPostService + { + private readonly MongoClient _client; + private readonly IMongoCollection _posts; + public PostService(IDatabaseConnection settings, IMongoClient mongoClient) + { + var database = mongoClient.GetDatabase(settings.DatabaseName); + _posts = database.GetCollection(settings.PostCollectionName); + } + + public PostSend addPost(PostReceive post) + { + return null; + } + } +} diff --git a/Backend/Api/Api/appsettings.json b/Backend/Api/Api/appsettings.json index 74cfa27..2be2426 100644 --- a/Backend/Api/Api/appsettings.json +++ b/Backend/Api/Api/appsettings.json @@ -15,7 +15,8 @@ "ConnectionString": "mongodb://127.0.0.1:27017/", "DatabaseName": "Odyssey", - "UserCollectionName": "users" + "UserCollectionName": "users", + "PostCollectionName": "posts" }, "EmailCfg": { -- cgit v1.2.3 From 718a4a30cad0205e00b7d4acdee58c1b7f8cdb08 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 3 Nov 2022 20:32:42 +0100 Subject: Napravljene metode za dodavanje i vracanje objava u servisu i kontroleru. --- Backend/Api/Api/Controllers/PostController.cs | 38 +++++++++++++++++++++ Backend/Api/Api/Interfaces/IPostService.cs | 5 ++- Backend/Api/Api/Services/PostService.cs | 49 ++++++++++++++++++++++++--- 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/Backend/Api/Api/Controllers/PostController.cs b/Backend/Api/Api/Controllers/PostController.cs index 4bac0e5..8db68a8 100644 --- a/Backend/Api/Api/Controllers/PostController.cs +++ b/Backend/Api/Api/Controllers/PostController.cs @@ -1,4 +1,7 @@ using Api.Interfaces; +using Api.Models; +using Api.Services; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 @@ -14,5 +17,40 @@ namespace Api.Controllers { _postService = postService; } + + [HttpPost("add")] + [Authorize(Roles ="User")] + public async Task> addPost([FromBody] PostReceive post) + { + var res = await _postService.addPost(post); + if (res != null) + { + return Ok(res); + } + return BadRequest(); + } + [HttpGet] + [Authorize(Roles = "User")] + public async Task>> getAllPosts() + { + var res = await _postService.getAllPosts(); + if (res != null) + { + return Ok(res); + } + return BadRequest(); + } + [HttpGet("posts /{id}")] + [Authorize(Roles = "User")] + public async Task> getPostByid(string id) + { + var res = await _postService.getPostById(id); + if (res != null) + { + return Ok(res); + } + return BadRequest(); + } + } } diff --git a/Backend/Api/Api/Interfaces/IPostService.cs b/Backend/Api/Api/Interfaces/IPostService.cs index 6c34e69..31e80cd 100644 --- a/Backend/Api/Api/Interfaces/IPostService.cs +++ b/Backend/Api/Api/Interfaces/IPostService.cs @@ -4,6 +4,9 @@ namespace Api.Interfaces { public interface IPostService { - PostSend addPost(PostReceive post); + Task addPost(PostReceive post); + Task> getAllPosts(); + Task getPostById(string id); + PostSend postToPostSend(Post post); } } \ No newline at end of file diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index 2a5e789..49c92cb 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -1,4 +1,5 @@ -using Api.Interfaces; +using System.Security.Claims; +using Api.Interfaces; using Api.Models; using MongoDB.Driver; @@ -8,15 +9,55 @@ namespace Api.Services { private readonly MongoClient _client; private readonly IMongoCollection _posts; - public PostService(IDatabaseConnection settings, IMongoClient mongoClient) + private readonly IHttpContextAccessor _httpContext; + public PostService(IDatabaseConnection settings, IMongoClient mongoClient, IHttpContextAccessor httpContext) { var database = mongoClient.GetDatabase(settings.DatabaseName); _posts = database.GetCollection(settings.PostCollectionName); + _httpContext = httpContext; } - public PostSend addPost(PostReceive post) + public async Task addPost(PostReceive post) { - return null; + Post p = new Post(); + p._id = ""; + p.ownerId = _httpContext.HttpContext.User.FindFirstValue("id"); + p.location = post.location; + p.description = post.description; + p.views = new List(); + p.reports = new List(); + p.ratings = new List(); + p.comments = new List(); + //add file + //add to database + return postToPostSend(p); + + } + public PostSend postToPostSend(Post post) + { + PostSend p = new PostSend(); + //Convert post to post send (TODO) + p._id = post._id; + return p; + } + + public async Task> getAllPosts() + { + List posts = await _posts.Find(_ => true).ToListAsync(); + List temp = new List(); + foreach (var post in posts) + { + temp.Add(postToPostSend(post)); + } + return temp; + } + + public async Task getPostById(string id) + { + Post p = await _posts.Find(post => post._id == id).FirstOrDefaultAsync(); + return postToPostSend(p); + } + //(TODO) ADD Delete and update } } -- cgit v1.2.3 From e39a826718441946a48e7e8c28a84933c2882d8a Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 3 Nov 2022 21:23:05 +0100 Subject: Napravljena kolekcija za fajlove. Omoguceno uplodovanje fajlova kada se dodaje objava. Dodat role za User-a u jwt-ju. --- Backend/Api/Api/.gitignore | 1 + Backend/Api/Api/Api.csproj | 4 ++ Backend/Api/Api/Controllers/PostController.cs | 2 +- Backend/Api/Api/Database/DatabaseConnection.cs | 1 + Backend/Api/Api/Interfaces/IDatabaseConnection.cs | 1 + Backend/Api/Api/Models/Post.cs | 5 ++- Backend/Api/Api/Program.cs | 5 ++- Backend/Api/Api/Services/FileService.cs | 28 +++++++++++++ Backend/Api/Api/Services/IFileService.cs | 8 ++++ Backend/Api/Api/Services/JwtService.cs | 3 +- Backend/Api/Api/Services/PostService.cs | 49 +++++++++++++++++++++-- Backend/Api/Api/appsettings.json | 13 +++--- 12 files changed, 104 insertions(+), 16 deletions(-) create mode 100644 Backend/Api/Api/.gitignore create mode 100644 Backend/Api/Api/Services/FileService.cs create mode 100644 Backend/Api/Api/Services/IFileService.cs diff --git a/Backend/Api/Api/.gitignore b/Backend/Api/Api/.gitignore new file mode 100644 index 0000000..f4b4ba8 --- /dev/null +++ b/Backend/Api/Api/.gitignore @@ -0,0 +1 @@ +Files/* \ No newline at end of file diff --git a/Backend/Api/Api/Api.csproj b/Backend/Api/Api/Api.csproj index 93e31b7..b09c2fd 100644 --- a/Backend/Api/Api/Api.csproj +++ b/Backend/Api/Api/Api.csproj @@ -15,4 +15,8 @@ + + + + diff --git a/Backend/Api/Api/Controllers/PostController.cs b/Backend/Api/Api/Controllers/PostController.cs index 8db68a8..31dbeef 100644 --- a/Backend/Api/Api/Controllers/PostController.cs +++ b/Backend/Api/Api/Controllers/PostController.cs @@ -20,7 +20,7 @@ namespace Api.Controllers [HttpPost("add")] [Authorize(Roles ="User")] - public async Task> addPost([FromBody] PostReceive post) + public async Task> addPost([FromForm]PostReceive post) { var res = await _postService.addPost(post); if (res != null) diff --git a/Backend/Api/Api/Database/DatabaseConnection.cs b/Backend/Api/Api/Database/DatabaseConnection.cs index c2fea05..24b2b08 100644 --- a/Backend/Api/Api/Database/DatabaseConnection.cs +++ b/Backend/Api/Api/Database/DatabaseConnection.cs @@ -8,5 +8,6 @@ namespace Api.Database public string DatabaseName { get; set; } = String.Empty; public string UserCollectionName { get; set; } = String.Empty; public string PostCollectionName { get; set; } = String.Empty; + public string FileCollectionName { get; set; } = String.Empty; } } diff --git a/Backend/Api/Api/Interfaces/IDatabaseConnection.cs b/Backend/Api/Api/Interfaces/IDatabaseConnection.cs index e3fc60c..744461b 100644 --- a/Backend/Api/Api/Interfaces/IDatabaseConnection.cs +++ b/Backend/Api/Api/Interfaces/IDatabaseConnection.cs @@ -6,5 +6,6 @@ string DatabaseName { get; set; } string UserCollectionName { get; set; } string PostCollectionName { get; set; } + string FileCollectionName { get; set; } } } diff --git a/Backend/Api/Api/Models/Post.cs b/Backend/Api/Api/Models/Post.cs index 456fcea..ee84e0f 100644 --- a/Backend/Api/Api/Models/Post.cs +++ b/Backend/Api/Api/Models/Post.cs @@ -1,5 +1,6 @@ using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson; +using System.ComponentModel.DataAnnotations; namespace Api.Models { @@ -9,7 +10,7 @@ namespace Api.Models [BsonRepresentation(BsonType.ObjectId)] public string _id { get; set; } public string ownerId { get; set; } - public Location location { get; set; } + public string locationId { get; set; } public string description { get; set; } public List views { get; set; } public List reports { get; set; } @@ -22,7 +23,7 @@ namespace Api.Models [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string _id { get; set; } - public Location location { get; set; } + public string locationId { get; set; } public string description { get; set; } public List images { get; set; } diff --git a/Backend/Api/Api/Program.cs b/Backend/Api/Api/Program.cs index 9b80f3c..8dee088 100644 --- a/Backend/Api/Api/Program.cs +++ b/Backend/Api/Api/Program.cs @@ -23,6 +23,7 @@ builder.Services.AddSingleton(s => builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHttpContextAccessor(); @@ -70,11 +71,11 @@ if (app.Environment.IsDevelopment()) app.UseSwaggerUI(); } -app.UseAuthorization(); + //Add Authentication app.UseAuthentication(); - +app.UseAuthorization(); app.MapControllers(); app.Run(); diff --git a/Backend/Api/Api/Services/FileService.cs b/Backend/Api/Api/Services/FileService.cs new file mode 100644 index 0000000..1937c10 --- /dev/null +++ b/Backend/Api/Api/Services/FileService.cs @@ -0,0 +1,28 @@ +using Api.Interfaces; +using Api.Models; +using MongoDB.Driver; +using File = Api.Models.File; + +namespace Api.Services +{ + public class FileService : IFileService + { + private readonly MongoClient _client; + private readonly IMongoCollection _files; + private readonly IHttpContextAccessor _httpContext; + public FileService(IDatabaseConnection settings, IMongoClient mongoClient) + { + var database = mongoClient.GetDatabase(settings.DatabaseName); + _files = database.GetCollection(settings.FileCollectionName); + } + public async Task add(File file) + { + await _files.InsertOneAsync(file); + return file; + } + public async Task getById(string id) + { + return await _files.Find(file => file._id == id).FirstOrDefaultAsync(); + } + } +} diff --git a/Backend/Api/Api/Services/IFileService.cs b/Backend/Api/Api/Services/IFileService.cs new file mode 100644 index 0000000..269e202 --- /dev/null +++ b/Backend/Api/Api/Services/IFileService.cs @@ -0,0 +1,8 @@ +namespace Api.Services +{ + public interface IFileService + { + Task add(Models.File file); + Task getById(string id); + } +} \ No newline at end of file diff --git a/Backend/Api/Api/Services/JwtService.cs b/Backend/Api/Api/Services/JwtService.cs index fbf5724..c199484 100644 --- a/Backend/Api/Api/Services/JwtService.cs +++ b/Backend/Api/Api/Services/JwtService.cs @@ -24,7 +24,8 @@ namespace Api.Services var key = Encoding.ASCII.GetBytes(_config.GetSection("AppSettings:JwtToken").Value); var tokenDescriptor = new SecurityTokenDescriptor { - Subject = new ClaimsIdentity(new[] { new Claim("id", user._id) }), + Subject = new ClaimsIdentity(new[] { new Claim("id", user._id), + new Claim("role","User")}), Expires = DateTime.UtcNow.AddDays(7), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index 49c92cb..2f29366 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -10,11 +10,13 @@ namespace Api.Services private readonly MongoClient _client; private readonly IMongoCollection _posts; private readonly IHttpContextAccessor _httpContext; - public PostService(IDatabaseConnection settings, IMongoClient mongoClient, IHttpContextAccessor httpContext) + private readonly IFileService _fileService; + public PostService(IDatabaseConnection settings, IMongoClient mongoClient, IHttpContextAccessor httpContext, IFileService fileService) { var database = mongoClient.GetDatabase(settings.DatabaseName); _posts = database.GetCollection(settings.PostCollectionName); _httpContext = httpContext; + _fileService = fileService; } public async Task addPost(PostReceive post) @@ -22,14 +24,53 @@ namespace Api.Services Post p = new Post(); p._id = ""; p.ownerId = _httpContext.HttpContext.User.FindFirstValue("id"); - p.location = post.location; + + p.locationId = post.locationId; p.description = post.description; p.views = new List(); p.reports = new List(); p.ratings = new List(); p.comments = new List(); - //add file - //add to database + p.images = new List(); + + var folderPath = Path.Combine(Directory.GetCurrentDirectory(), "Files", p.ownerId); + if (!Directory.Exists(folderPath)) + { + Directory.CreateDirectory(folderPath); + } + + foreach (var image in post.images) + { + var filename = image.FileName; + var ext=Path.GetExtension(filename).ToLowerInvariant(); + var name = Path.GetFileNameWithoutExtension(filename).ToLowerInvariant(); + var fullPath=Path.Combine(folderPath, name); + int i = 0; + while (System.IO.File.Exists(fullPath)) + { + i++; + fullPath=Path.Combine(folderPath, name+i.ToString()+ext); + } + using(var stream=new FileStream(fullPath, FileMode.Create)) + { + await image.CopyToAsync(stream); + } + var f = new Models.File(); + f.path = fullPath; + f._id = ""; + f=await _fileService.add(f); + p.images.Add(f); + + } + await _posts.InsertOneAsync(p); + + + + + + + + return postToPostSend(p); } diff --git a/Backend/Api/Api/appsettings.json b/Backend/Api/Api/appsettings.json index 2be2426..d506b33 100644 --- a/Backend/Api/Api/appsettings.json +++ b/Backend/Api/Api/appsettings.json @@ -11,14 +11,15 @@ } }, "AllowedHosts": "*", - "DatabaseSettings": { + "DatabaseSettings": { - "ConnectionString": "mongodb://127.0.0.1:27017/", - "DatabaseName": "Odyssey", - "UserCollectionName": "users", - "PostCollectionName": "posts" + "ConnectionString": "mongodb://127.0.0.1:27017/", + "DatabaseName": "Odyssey", + "UserCollectionName": "users", + "PostCollectionName": "posts", + "FileCollectionName": "files" - }, + }, "EmailCfg": { "Email": "oddyssey.brzodolokacije@gmail.com", "SmtpServer": "smtp.gmail.com", -- cgit v1.2.3 From 43b5ce5b1c2a0976142a41e77f7caeb378dfd5ba Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 3 Nov 2022 21:36:59 +0100 Subject: Dodata kolekcija za lokacije. Napravljen kontroler i servis za lokacije. Todo(google maps api). --- Backend/Api/Api/Controllers/LocationController.cs | 54 +++++++++++++++++++++++ Backend/Api/Api/Database/DatabaseConnection.cs | 1 + Backend/Api/Api/Interfaces/IDatabaseConnection.cs | 1 + Backend/Api/Api/Interfaces/IFileService.cs | 8 ++++ Backend/Api/Api/Interfaces/ILocationService.cs | 11 +++++ Backend/Api/Api/Program.cs | 1 + Backend/Api/Api/Services/IFileService.cs | 8 ---- Backend/Api/Api/Services/LocationService.cs | 32 ++++++++++++++ Backend/Api/Api/appsettings.json | 3 +- 9 files changed, 110 insertions(+), 9 deletions(-) create mode 100644 Backend/Api/Api/Controllers/LocationController.cs create mode 100644 Backend/Api/Api/Interfaces/IFileService.cs create mode 100644 Backend/Api/Api/Interfaces/ILocationService.cs delete mode 100644 Backend/Api/Api/Services/IFileService.cs create mode 100644 Backend/Api/Api/Services/LocationService.cs diff --git a/Backend/Api/Api/Controllers/LocationController.cs b/Backend/Api/Api/Controllers/LocationController.cs new file mode 100644 index 0000000..bb0b0ab --- /dev/null +++ b/Backend/Api/Api/Controllers/LocationController.cs @@ -0,0 +1,54 @@ +using Api.Interfaces; +using Api.Models; +using Microsoft.AspNetCore.Authorization; +using System.Data; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace Api.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class LocationController : ControllerBase + { + private readonly ILocationService _locationService; + public LocationController(ILocationService locationService) + { + _locationService = locationService; + } + + [HttpPost("add")] + [Authorize(Roles = "User")] + public async Task> addPost([FromBody] Location loc) + { + var res = await _locationService.add(loc); + if (res != null) + { + return Ok(res); + } + return BadRequest(); + } + [HttpGet] + [Authorize(Roles = "User")] + public async Task>> getAllPosts() + { + var res = await _locationService.getAllLocation(); + if (res != null) + { + return Ok(res); + } + return BadRequest(); + } + [HttpGet("loc /{id}")] + [Authorize(Roles = "User")] + public async Task> getLocationByid(string id) + { + var res = await _locationService.getById(id); + if (res != null) + { + return Ok(res); + } + return BadRequest(); + } + } +} diff --git a/Backend/Api/Api/Database/DatabaseConnection.cs b/Backend/Api/Api/Database/DatabaseConnection.cs index 24b2b08..f26b88e 100644 --- a/Backend/Api/Api/Database/DatabaseConnection.cs +++ b/Backend/Api/Api/Database/DatabaseConnection.cs @@ -9,5 +9,6 @@ namespace Api.Database public string UserCollectionName { get; set; } = String.Empty; public string PostCollectionName { get; set; } = String.Empty; public string FileCollectionName { get; set; } = String.Empty; + public string LocationCollectionName { get; set; } = String.Empty; } } diff --git a/Backend/Api/Api/Interfaces/IDatabaseConnection.cs b/Backend/Api/Api/Interfaces/IDatabaseConnection.cs index 744461b..17b5262 100644 --- a/Backend/Api/Api/Interfaces/IDatabaseConnection.cs +++ b/Backend/Api/Api/Interfaces/IDatabaseConnection.cs @@ -7,5 +7,6 @@ string UserCollectionName { get; set; } string PostCollectionName { get; set; } string FileCollectionName { get; set; } + string LocationCollectionName { get; set; } } } diff --git a/Backend/Api/Api/Interfaces/IFileService.cs b/Backend/Api/Api/Interfaces/IFileService.cs new file mode 100644 index 0000000..e736305 --- /dev/null +++ b/Backend/Api/Api/Interfaces/IFileService.cs @@ -0,0 +1,8 @@ +namespace Api.Interfaces +{ + public interface IFileService + { + Task add(Models.File file); + Task getById(string id); + } +} \ No newline at end of file diff --git a/Backend/Api/Api/Interfaces/ILocationService.cs b/Backend/Api/Api/Interfaces/ILocationService.cs new file mode 100644 index 0000000..16e00a0 --- /dev/null +++ b/Backend/Api/Api/Interfaces/ILocationService.cs @@ -0,0 +1,11 @@ +using Api.Models; + +namespace Api.Interfaces +{ + public interface ILocationService + { + Task add(Location loc); + Task getById(string id); + Task> getAllLocation(); + } +} \ No newline at end of file diff --git a/Backend/Api/Api/Program.cs b/Backend/Api/Api/Program.cs index 8dee088..16b0241 100644 --- a/Backend/Api/Api/Program.cs +++ b/Backend/Api/Api/Program.cs @@ -24,6 +24,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHttpContextAccessor(); diff --git a/Backend/Api/Api/Services/IFileService.cs b/Backend/Api/Api/Services/IFileService.cs deleted file mode 100644 index 269e202..0000000 --- a/Backend/Api/Api/Services/IFileService.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Api.Services -{ - public interface IFileService - { - Task add(Models.File file); - Task getById(string id); - } -} \ No newline at end of file diff --git a/Backend/Api/Api/Services/LocationService.cs b/Backend/Api/Api/Services/LocationService.cs new file mode 100644 index 0000000..b44f983 --- /dev/null +++ b/Backend/Api/Api/Services/LocationService.cs @@ -0,0 +1,32 @@ +using Api.Interfaces; +using Api.Models; +using MongoDB.Driver; + +namespace Api.Services +{ + public class LocationService : ILocationService + { + private readonly MongoClient _client; + private readonly IMongoCollection _locations; + private readonly IHttpContextAccessor _httpContext; + public LocationService(IDatabaseConnection settings, IMongoClient mongoClient) + { + var database = mongoClient.GetDatabase(settings.DatabaseName); + _locations = database.GetCollection(settings.FileCollectionName); + } + public async Task add(Location loc) + { + //TODO GOOGLE MAPS API CALL FOR info + await _locations.InsertOneAsync(loc); + return loc; + } + public async Task getById(string id) + { + return await _locations.Find(loc => loc._id == id).FirstOrDefaultAsync(); + } + public async Task> getAllLocation() + { + return await _locations.Find(_=>true).ToListAsync(); + } + } +} diff --git a/Backend/Api/Api/appsettings.json b/Backend/Api/Api/appsettings.json index d506b33..b7f25b2 100644 --- a/Backend/Api/Api/appsettings.json +++ b/Backend/Api/Api/appsettings.json @@ -17,7 +17,8 @@ "DatabaseName": "Odyssey", "UserCollectionName": "users", "PostCollectionName": "posts", - "FileCollectionName": "files" + "FileCollectionName": "files", + "LocationCollectionname": "locations" }, "EmailCfg": { -- cgit v1.2.3 From 759414e3138e02a540cbb74a9675d6dec6362004 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 3 Nov 2022 21:39:34 +0100 Subject: Typo fix. --- Backend/Api/Api/Services/LocationService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Backend/Api/Api/Services/LocationService.cs b/Backend/Api/Api/Services/LocationService.cs index b44f983..629c2a7 100644 --- a/Backend/Api/Api/Services/LocationService.cs +++ b/Backend/Api/Api/Services/LocationService.cs @@ -12,7 +12,7 @@ namespace Api.Services public LocationService(IDatabaseConnection settings, IMongoClient mongoClient) { var database = mongoClient.GetDatabase(settings.DatabaseName); - _locations = database.GetCollection(settings.FileCollectionName); + _locations = database.GetCollection(settings.LocationCollectionName); } public async Task add(Location loc) { -- cgit v1.2.3 From 3ba0c0557213a9444211b58a6a65ff4a2af09ea3 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 3 Nov 2022 21:54:29 +0100 Subject: fixed typo. --- Backend/Api/Api/Models/Location.cs | 2 +- Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Backend/Api/Api/Models/Location.cs b/Backend/Api/Api/Models/Location.cs index 5e723e4..8cc4377 100644 --- a/Backend/Api/Api/Models/Location.cs +++ b/Backend/Api/Api/Models/Location.cs @@ -11,7 +11,7 @@ namespace Api.Models public String name { get; set; } public String city { get; set; } public String country { get; set; } - public String adress { get; set; } + public String address { get; set; } public double latitude { get; set; } public double longitude { get; set; } public LocationType type { get; set; } diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml index abbd549..48a3289 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml @@ -4,7 +4,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_padding="5dp" android:layout_margin="0dp" android:background="@drawable/rounded_picture_background" android:clipToOutline="true" @@ -14,7 +13,6 @@ android:id="@+id/imageView8" android:layout_width="match_parent" android:layout_height="330dp" - android:layout_padding="0dp" android:outlineProvider="background" android:src="@drawable/b1" app:layout_constraintBottom_toBottomOf="parent" -- cgit v1.2.3 From 2810fdbe7dbf6e9d555ee8c697c6505910e65051 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Thu, 3 Nov 2022 23:19:35 +0100 Subject: Dodati i izmenjeni modeli. --- .../Fragments/FragmentAddRecension.kt | 60 ++++++++++++++++++++++ .../java/com/example/brzodolokacije/Models/File.kt | 6 +++ .../com/example/brzodolokacije/Models/Location.kt | 14 +++++ .../example/brzodolokacije/Models/LocationType.kt | 7 +++ .../example/brzodolokacije/Models/LocationTypes.kt | 4 -- .../java/com/example/brzodolokacije/Models/Post.kt | 30 ++++++++--- .../app/src/main/res/layout/fragment_add_post.xml | 10 ++-- .../src/main/res/layout/fragment_add_recension.xml | 13 +++++ 8 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddRecension.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/File.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Location.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationType.kt delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationTypes.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_recension.xml diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddRecension.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddRecension.kt new file mode 100644 index 0000000..16709f7 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddRecension.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentAddRecension.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentAddRecension : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_add_recension, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentAddRecension. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentAddRecension().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/File.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/File.kt new file mode 100644 index 0000000..030f658 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/File.kt @@ -0,0 +1,6 @@ +package com.example.brzodolokacije.Models + +data class File ( + var _id:String, + var path:String + ) \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Location.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Location.kt new file mode 100644 index 0000000..25125cd --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Location.kt @@ -0,0 +1,14 @@ +package com.example.brzodolokacije.Models + +import com.example.brzodolokacije.Models.LocationType + +data class Location ( + var _id:String, + var name:String, + var city:String, + var country:String, + var adress:String, + var latitude:Double, + var longitude:Double, + var type:LocationType + ) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationType.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationType.kt new file mode 100644 index 0000000..a078863 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationType.kt @@ -0,0 +1,7 @@ +package com.example.brzodolokacije.Models + +enum class LocationType { + GRAD,ULICA,JEZERO,REKA,PLAZA,OKEAN, MORE, MOREUZ, MOST,BANJA, + PLANINA, VISORAVAN, PIRAMIDA, LIVADA, SELO, OSTRVO, POLUOSTRVO, KLISURA, ARHIPELAG, + ADA, DELTA, FJORD, GEJZIR, IZVOR, KOTLINA, MINERALNI_IZVOR, PECINA ,SUMA, VODOPAD,VULKAN +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationTypes.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationTypes.kt deleted file mode 100644 index c599dae..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationTypes.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.brzodolokacije.Models - -enum class LocationTypes { -} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt index 9c0eae1..3fa1f70 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt @@ -1,12 +1,30 @@ package com.example.brzodolokacije.Models +import java.time.LocalDateTime import java.util.* data class Post ( var _id:String, - var creationDate: Date, - var country:String,//drzava - var city:String, - var location:String,//naziv grada/naziv planine/naziv jezera/....... - var type:LocationTypes //tip lokacije - ) \ No newline at end of file + var location:Location, + var ownerId:String, + var description:String, + var views:List, + var reports:List, + var ratings:List, + var comments:List, + var images:List + + + ) + +data class Comment ( + var userId:String, + var comment:String, + var parent:Comment, + var timeStamp: LocalDateTime +) + +data class Rating( + var useridval :String, + var rating:Int +) \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_post.xml index 2cf3c8c..c106fcd 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_post.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_post.xml @@ -6,10 +6,14 @@ tools:context=".Fragments.FragmentAddPost"> + + android:layout_height="20dp"/> + + + + \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_recension.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_recension.xml new file mode 100644 index 0000000..433ae0e --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_recension.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file -- cgit v1.2.3 From 52ada664d8d786a5eff353fc75ee3b781eceb267 Mon Sep 17 00:00:00 2001 From: Jelena Petrovic Date: Fri, 4 Nov 2022 00:23:49 +0100 Subject: Dodati modeli potrebni za objave, osnovni elementi izgleda liste objava, hardkodovane vrednosti #17 --- .../app/src/main/AndroidManifest.xml | 7 -- .../brzodolokacije/Activities/ActivityShowPosts.kt | 12 --- .../Activities/NavigationActivity.kt | 11 +-- .../brzodolokacije/Adapters/ShowPostsAdapter.kt | 35 +++++++++ .../brzodolokacije/Fragments/FragmentShowPosts.kt | 69 ++++++++++++++++++ .../com/example/brzodolokacije/Models/Location.kt | 12 +++ .../example/brzodolokacije/Models/LocationTypes.kt | 4 + .../java/com/example/brzodolokacije/Models/Post.kt | 13 ++-- .../app/src/main/res/drawable/filter.png | Bin 829 -> 1509 bytes .../app/src/main/res/drawable/grid.png | Bin 0 -> 661 bytes .../app/src/main/res/drawable/list.webp | Bin 0 -> 174 bytes .../res/drawable/rounded_picture_background.xml | 2 +- .../src/main/res/layout/activity_show_posts.xml | 7 -- .../src/main/res/layout/fragment_show_posts.xml | 81 +++++++++++++++++++++ .../app/src/main/res/layout/post_preview.xml | 31 ++++---- 15 files changed, 227 insertions(+), 57 deletions(-) delete mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowPosts.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/ShowPostsAdapter.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Location.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/grid.png create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/list.webp delete mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_posts.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml diff --git a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml index 7a257ec..f6e0fc5 100644 --- a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml +++ b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml @@ -15,13 +15,6 @@ android:theme="@style/Theme.BrzoDoLokacije" android:usesCleartextTraffic="true" tools:targetApi="31"> - - - diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowPosts.kt deleted file mode 100644 index d1ad0a9..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityShowPosts.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.brzodolokacije.Activities - -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle -import com.example.brzodolokacije.R - -class ActivityShowPosts : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_show_posts) - } -} \ No newline at end of file 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 0933460..d36dbae 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 @@ -5,10 +5,7 @@ import android.os.Bundle import android.view.View import android.widget.Button import androidx.fragment.app.Fragment -import com.example.brzodolokacije.Fragments.FragmentAddPost -import com.example.brzodolokacije.Fragments.FragmentBrowse -import com.example.brzodolokacije.Fragments.FragmentHome -import com.example.brzodolokacije.Fragments.FragmentProfile +import com.example.brzodolokacije.Fragments.* import com.example.brzodolokacije.R import com.google.android.material.bottomnavigation.BottomNavigationView @@ -17,15 +14,15 @@ class NavigationActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_navigation) - val homeFragment=FragmentHome() + val fragmentShowPosts=FragmentShowPosts() val browseFragment=FragmentBrowse() val addPostFragment=FragmentAddPost() val profileFragment=FragmentProfile() val bottomNav=findViewById(R.id.bottomNavigationView) as BottomNavigationView - setCurrentFragment(homeFragment) + setCurrentFragment(fragmentShowPosts) bottomNav.setOnNavigationItemSelectedListener { when(it.itemId){ - R.id.navHome->setCurrentFragment(homeFragment) + R.id.navHome->setCurrentFragment(fragmentShowPosts) R.id.navAddPost->setCurrentFragment(addPostFragment) R.id.navBrowse->setCurrentFragment(browseFragment) R.id.navProfile->setCurrentFragment(profileFragment) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/ShowPostsAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/ShowPostsAdapter.kt new file mode 100644 index 0000000..c8a0b77 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/ShowPostsAdapter.kt @@ -0,0 +1,35 @@ +package com.example.brzodolokacije.Adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Models.ListItemModel +import com.example.brzodolokacije.Models.Post +import com.example.brzodolokacije.databinding.ListItemBinding +import com.example.brzodolokacije.databinding.PostPreviewBinding + +class ShowPostsAdapter (val items : MutableList) + : RecyclerView.Adapter(){ + //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) + binding=PostPreviewBinding.inflate(inflater,parent,false) + return ViewHolder(binding) + } + override fun onBindViewHolder(holder: ViewHolder, position: Int){ + //sets components of particular item + holder.bind(items[position]) + } + override fun getItemCount() = items.size + inner class ViewHolder(itemView : PostPreviewBinding) : RecyclerView.ViewHolder(itemView.root){ + fun bind(item : Post){ + binding.apply { + tvTitle.text=item.location.name + tvLocationParent.text=item.location.country + tvLocationType.text=item.location.type.toString() + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt new file mode 100644 index 0000000..8dcef02 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt @@ -0,0 +1,69 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Adapters.SampleAdapter +import com.example.brzodolokacije.Adapters.ShowPostsAdapter +import com.example.brzodolokacije.Models.ListItemModel +import com.example.brzodolokacije.Models.Location +import com.example.brzodolokacije.Models.LocationTypes +import com.example.brzodolokacije.Models.Post +import com.example.brzodolokacije.R +import com.example.brzodolokacije.databinding.FragmentHomeBinding + + +class FragmentShowPosts : Fragment() { + + private lateinit var binding: FragmentShowPosts + private var posts : MutableList = mutableListOf() + private var layoutManagerVar: RecyclerView.LayoutManager? = null + private var adapterVar: RecyclerView.Adapter? = null + private var recyclerView: RecyclerView?=null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + //load data for the list + loadData() + //instantiate adapter and linearLayout + adapterVar=ShowPostsAdapter(posts) + layoutManagerVar= LinearLayoutManager(activity) + } + + private fun loadData() { + posts.add(Post("123","213", + Location("asd","Ajfelov toranj","Pariz", + "Francuska","idk","asda","asdsd",LocationTypes.Grad),"opsiopsaid",1.1,56, + mutableListOf(),mutableListOf())) + posts.add(Post("123","213", + Location("asd","Ajfelov toranj","Pariz", + "Francuska","idk","asda","asdsd",LocationTypes.Grad),"opsiopsaid",1.1,56, + mutableListOf(),mutableListOf(),)) + posts.add(Post("123","213", + Location("asd","Ajfelov toranj","Pariz", + "Francuska","idk","asda","asdsd",LocationTypes.Grad),"opsiopsaid",1.1,56, + mutableListOf(),mutableListOf(),)) + posts.add(Post("123","213", + Location("asd","Ajfelov toranj","Pariz", + "Francuska","idk","asda","asdsd",LocationTypes.Grad),"opsiopsaid",1.1,56, + mutableListOf(),mutableListOf(),)) + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val rootView = inflater?.inflate(R.layout.fragment_show_posts, container, false) + recyclerView = rootView?.findViewById(R.id.rvMain) + // set recyclerView attributes + recyclerView?.setHasFixedSize(true) + recyclerView?.layoutManager = layoutManagerVar + recyclerView?.adapter = adapterVar + return rootView + } + +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Location.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Location.kt new file mode 100644 index 0000000..ab47149 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Location.kt @@ -0,0 +1,12 @@ +package com.example.brzodolokacije.Models + +data class Location( + val _id:String, + val name:String, + val city:String, + val country:String, + val address:String, + val latitude:String, + val longitude:String, + val type:LocationTypes +) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationTypes.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationTypes.kt index c599dae..cc61526 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationTypes.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/LocationTypes.kt @@ -1,4 +1,8 @@ package com.example.brzodolokacije.Models enum class LocationTypes { + Plaza, + Grad, + Zgrada, + Setaliste } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt index 9c0eae1..4359cea 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt @@ -1,12 +1,15 @@ package com.example.brzodolokacije.Models +import java.io.File import java.util.* data class Post ( var _id:String, - var creationDate: Date, - var country:String,//drzava - var city:String, - var location:String,//naziv grada/naziv planine/naziv jezera/....... - var type:LocationTypes //tip lokacije + var ownerId:String, + var location:Location, + var description:String, + var ratings:Number, + var views:Int, + var reviews:List, + var images:List ) \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/filter.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/filter.png index 8cf4b39..4342c2c 100644 Binary files a/Client/BrzoDoLokacije/app/src/main/res/drawable/filter.png and b/Client/BrzoDoLokacije/app/src/main/res/drawable/filter.png differ diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/grid.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/grid.png new file mode 100644 index 0000000..03d9ef9 Binary files /dev/null and b/Client/BrzoDoLokacije/app/src/main/res/drawable/grid.png differ diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/list.webp b/Client/BrzoDoLokacije/app/src/main/res/drawable/list.webp new file mode 100644 index 0000000..608932f Binary files /dev/null and b/Client/BrzoDoLokacije/app/src/main/res/drawable/list.webp differ diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml index 85f54be..2f898b0 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml @@ -1,5 +1,5 @@ - + diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_posts.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_posts.xml deleted file mode 100644 index 20c7560..0000000 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_show_posts.xml +++ /dev/null @@ -1,7 +0,0 @@ - - \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml new file mode 100644 index 0000000..4565b74 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml index abbd549..e8ad501 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml @@ -4,17 +4,15 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_padding="5dp" - android:layout_margin="0dp" + android:layout_margin="5dp" android:background="@drawable/rounded_picture_background" android:clipToOutline="true" > -- cgit v1.2.3 From d42269e5bf6dcb4f125c395868a88295686a7895 Mon Sep 17 00:00:00 2001 From: Jelena Petrovic Date: Fri, 4 Nov 2022 01:20:58 +0100 Subject: prepravke posle merge-a --- .vs/ProjectSettings.json | 3 +++ .vs/VSWorkspaceState.json | 6 +++++ .vs/brzodolokacije/v17/.suo | Bin 0 -> 16896 bytes .vs/slnx.sqlite | Bin 0 -> 262144 bytes .../brzodolokacije/Fragments/FragmentAddPost.kt | 4 ++-- .../brzodolokacije/Fragments/FragmentShowPosts.kt | 26 ++++++++++----------- .../res/drawable/rounded_picture_background.xml | 7 ++++++ .../app/src/main/res/layout/post_preview.xml | 4 +--- 8 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/brzodolokacije/v17/.suo create mode 100644 .vs/slnx.sqlite diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..f8b4888 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..6b61141 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,6 @@ +{ + "ExpandedNodes": [ + "" + ], + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/brzodolokacije/v17/.suo b/.vs/brzodolokacije/v17/.suo new file mode 100644 index 0000000..5ee74c0 Binary files /dev/null and b/.vs/brzodolokacije/v17/.suo differ diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000..7c42e4b Binary files /dev/null and b/.vs/slnx.sqlite differ diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt index b6452e9..7fca83b 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt @@ -29,10 +29,10 @@ class FragmentAddPost : Fragment(R.layout.fragment_add_post) { ): View? { val view:View=inflater.inflate(R.layout.fragment_add_post, container, false) // Inflate the layout for this fragment - val logOutButton=view.findViewById(R.id.btnFragmentAddLogOut) as Button + /*val logOutButton=view.findViewById(R.id.btnFragmentAddLogOut) as Button logOutButton.setOnClickListener{ logOut() - } + }*/ return view; } diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt index 8dcef02..6bc9d12 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt @@ -11,7 +11,7 @@ import com.example.brzodolokacije.Adapters.SampleAdapter import com.example.brzodolokacije.Adapters.ShowPostsAdapter import com.example.brzodolokacije.Models.ListItemModel import com.example.brzodolokacije.Models.Location -import com.example.brzodolokacije.Models.LocationTypes +import com.example.brzodolokacije.Models.LocationType import com.example.brzodolokacije.Models.Post import com.example.brzodolokacije.R import com.example.brzodolokacije.databinding.FragmentHomeBinding @@ -35,22 +35,22 @@ class FragmentShowPosts : Fragment() { } private fun loadData() { - posts.add(Post("123","213", + posts.add(Post("123", Location("asd","Ajfelov toranj","Pariz", - "Francuska","idk","asda","asdsd",LocationTypes.Grad),"opsiopsaid",1.1,56, - mutableListOf(),mutableListOf())) - posts.add(Post("123","213", + "Francuska","idk",1.1,1.1, LocationType.GRAD),"opsiopsaid","opasdiad", + mutableListOf(),mutableListOf(),mutableListOf(),mutableListOf(),mutableListOf())) + posts.add(Post("123", Location("asd","Ajfelov toranj","Pariz", - "Francuska","idk","asda","asdsd",LocationTypes.Grad),"opsiopsaid",1.1,56, - mutableListOf(),mutableListOf(),)) - posts.add(Post("123","213", + "Francuska","idk",1.1,1.1, LocationType.GRAD),"opsiopsaid","opasdiad", + mutableListOf(),mutableListOf(),mutableListOf(),mutableListOf(),mutableListOf())) + posts.add(Post("123", Location("asd","Ajfelov toranj","Pariz", - "Francuska","idk","asda","asdsd",LocationTypes.Grad),"opsiopsaid",1.1,56, - mutableListOf(),mutableListOf(),)) - posts.add(Post("123","213", + "Francuska","idk",1.1,1.1, LocationType.GRAD),"opsiopsaid","opasdiad", + mutableListOf(),mutableListOf(),mutableListOf(),mutableListOf(),mutableListOf())) + posts.add(Post("123", Location("asd","Ajfelov toranj","Pariz", - "Francuska","idk","asda","asdsd",LocationTypes.Grad),"opsiopsaid",1.1,56, - mutableListOf(),mutableListOf(),)) + "Francuska","idk",1.1,1.1, LocationType.GRAD),"opsiopsaid","opasdiad", + mutableListOf(),mutableListOf(),mutableListOf(),mutableListOf(),mutableListOf())) } override fun onCreateView( diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml index 2f898b0..0a8e933 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml @@ -2,4 +2,11 @@ + + + + + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml index a3642e2..ffdd5d7 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml @@ -4,8 +4,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_padding="5dp" - android:layout_margin="0dp" android:layout_margin="0dp" android:background="@drawable/rounded_picture_background" android:clipToOutline="true" @@ -31,7 +29,7 @@ android:background="@color/dark_blue_transparent" android:outlineProvider="background" app:layout_constraintBottom_toBottomOf="@+id/locationImage" - tools:layout_editor_absoluteX="0dp"> + tools:layout_editor_absoluteX="10dp"> -- cgit v1.2.3 From 1746d8d5df71d905b0c4949a0056e518c57ced98 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Fri, 4 Nov 2022 23:08:40 +0100 Subject: Dodata singleton konekcija. --- .../com/example/brzodolokacije/Fragments/FragmentLogin.kt | 2 +- .../example/brzodolokacije/Fragments/FragmentRegister.kt | 2 +- .../com/example/brzodolokacije/Services/RetrofitHelper.kt | 15 +++++++++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt index b9568df..b2c8bf5 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt @@ -84,7 +84,7 @@ class FragmentLogin : Fragment() { if(!emailString.isEmpty() && !passwordString.isEmpty()&& checkPassword(passwordString)==true && checkEmail(emailString)==true) { var loginData= Login(emailString,passwordString) - val authApi= RetrofitHelper.getInstance().create(IAuthApi::class.java) + val authApi= RetrofitHelper.getInstanceNoAuth() val request=authApi.login(loginData) request.enqueue(object : retrofit2.Callback { diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt index c9102ab..2201128 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt @@ -81,7 +81,7 @@ class FragmentRegister : Fragment() { var registerData=Register(nameString,usernameString,emailString,passwordString) - val authApi=RetrofitHelper.getInstance().create(IAuthApi::class.java) + val authApi=RetrofitHelper.getInstanceNoAuth() val request=authApi.register(registerData) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt index cc7eb56..4e9e0e6 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt @@ -1,5 +1,6 @@ package com.example.brzodolokacije.Services +import com.example.brzodolokacije.Interfaces.IAuthApi import com.google.gson.GsonBuilder import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory @@ -7,13 +8,23 @@ import retrofit2.converter.gson.GsonConverterFactory object RetrofitHelper { val baseUrl="http://10.0.2.2:5279" - fun getInstance():Retrofit{ + + private var retrofit_noauth: IAuthApi? = null + + + fun getInstanceNoAuth():IAuthApi{ + if(retrofit_noauth==null) + retrofit_noauth= createInstanceNoAuth() + return retrofit_noauth as IAuthApi + } + private fun createInstanceNoAuth():IAuthApi{ val gson = GsonBuilder() .setLenient() .create() return Retrofit.Builder().baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create(gson)) - .build() + .build().create(IAuthApi::class.java) + } } //Usage -- cgit v1.2.3 From 93f3ab2aa55a57000cdff1cddf4955b5329978b0 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Fri, 4 Nov 2022 23:21:47 +0100 Subject: Dodat primer upita sa auth header-om. --- .../java/com/example/brzodolokacije/Fragments/FragmentLogin.kt | 2 +- .../com/example/brzodolokacije/Fragments/FragmentRegister.kt | 2 +- .../java/com/example/brzodolokacije/Interfaces/IAuthApi.kt | 5 +++++ .../java/com/example/brzodolokacije/Services/RetrofitHelper.kt | 10 ++++++---- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt index b2c8bf5..6e6e368 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt @@ -84,7 +84,7 @@ class FragmentLogin : Fragment() { if(!emailString.isEmpty() && !passwordString.isEmpty()&& checkPassword(passwordString)==true && checkEmail(emailString)==true) { var loginData= Login(emailString,passwordString) - val authApi= RetrofitHelper.getInstanceNoAuth() + val authApi= RetrofitHelper.getInstance() val request=authApi.login(loginData) request.enqueue(object : retrofit2.Callback { diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt index 2201128..cce3d04 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt @@ -81,7 +81,7 @@ class FragmentRegister : Fragment() { var registerData=Register(nameString,usernameString,emailString,passwordString) - val authApi=RetrofitHelper.getInstanceNoAuth() + val authApi=RetrofitHelper.getInstance() val request=authApi.register(registerData) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt index bd430a8..22935a5 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt @@ -2,9 +2,11 @@ package com.example.brzodolokacije.Interfaces import com.example.brzodolokacije.Models.Auth.Login import com.example.brzodolokacije.Models.Auth.Register +import com.example.brzodolokacije.Models.Post import okhttp3.ResponseBody import retrofit2.Call import retrofit2.http.Body +import retrofit2.http.Header import retrofit2.http.POST interface IAuthApi { @@ -12,4 +14,7 @@ interface IAuthApi { fun login(@Body obj:Login): Call @POST("/api/auth/register") fun register(@Body obj:Register):Call + + //@POST("putanja") + //fun add(@Body obj:Post,@Header("Authorization") authHeader:String):Call } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt index 4e9e0e6..5f7e8d3 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt @@ -2,6 +2,8 @@ package com.example.brzodolokacije.Services import com.example.brzodolokacije.Interfaces.IAuthApi import com.google.gson.GsonBuilder +import okhttp3.OkHttpClient +import okhttp3.Request import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory @@ -10,14 +12,14 @@ object RetrofitHelper { val baseUrl="http://10.0.2.2:5279" private var retrofit_noauth: IAuthApi? = null + private var retrofit_auth: IAuthApi? = null - - fun getInstanceNoAuth():IAuthApi{ + fun getInstance():IAuthApi{ if(retrofit_noauth==null) - retrofit_noauth= createInstanceNoAuth() + retrofit_noauth= createInstance() return retrofit_noauth as IAuthApi } - private fun createInstanceNoAuth():IAuthApi{ + private fun createInstance():IAuthApi{ val gson = GsonBuilder() .setLenient() .create() -- cgit v1.2.3 From bbd8255288db31f4473b000aab2dfbe3d7fb0f38 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Fri, 4 Nov 2022 23:33:50 +0100 Subject: Napravljen controller za refreshJwt-a na backu. --- Backend/Api/Api/Controllers/AuthController.cs | 11 +++++++++++ Backend/Api/Api/Interfaces/IUserService.cs | 2 +- Backend/Api/Api/Services/UserService.cs | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Backend/Api/Api/Controllers/AuthController.cs b/Backend/Api/Api/Controllers/AuthController.cs index cbd5eb8..abb7adc 100644 --- a/Backend/Api/Api/Controllers/AuthController.cs +++ b/Backend/Api/Api/Controllers/AuthController.cs @@ -37,6 +37,17 @@ namespace Api.Controllers return Ok(); } + [HttpPost("refreshJwt")] + [Authorize(Roles ="User")] + public async Task> refreshJwt() + { + var jwt = await _userService.RenewToken(); + if (jwt != null) + { + return Ok(jwt); + } + return BadRequest("Pogresno uneti podaci"); + } [HttpPost("login")] public async Task> Login([FromBody] Login creds) { diff --git a/Backend/Api/Api/Interfaces/IUserService.cs b/Backend/Api/Api/Interfaces/IUserService.cs index 218c67a..db2eac1 100644 --- a/Backend/Api/Api/Interfaces/IUserService.cs +++ b/Backend/Api/Api/Interfaces/IUserService.cs @@ -12,7 +12,7 @@ namespace Api.Interfaces Task deleteUser(String email); Task getUserById(string id); - Task RenewToken(string existingToken); + Task RenewToken(); Task Login(Login login); Task Register(Register register); Task VerifyUser(VerifyUser login); diff --git a/Backend/Api/Api/Services/UserService.cs b/Backend/Api/Api/Services/UserService.cs index 034c494..5fd61f6 100644 --- a/Backend/Api/Api/Services/UserService.cs +++ b/Backend/Api/Api/Services/UserService.cs @@ -163,9 +163,9 @@ namespace Api.Services return false; } - public async Task RenewToken(string existingToken) + public async Task RenewToken() { - var id = _jwtService.TokenToId(existingToken); + var id = await UserIdFromJwt(); if (id == null) return null; var user = await getUserById(id); -- cgit v1.2.3 From 146a732982f096bfdb3e3ed56300233736f90c21 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sat, 5 Nov 2022 00:08:35 +0100 Subject: Dodato refreshovanje jwt-a na clientskom delu aplikacije. --- .../brzodolokacije/Fragments/FragmentLogin.kt | 1 - .../example/brzodolokacije/Interfaces/IAuthApi.kt | 3 +- .../com/example/brzodolokacije/MainActivity.kt | 42 ++++++++++++++++++++-- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt index 6e6e368..b68a04f 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt @@ -94,7 +94,6 @@ class FragmentLogin : Fragment() { Toast.makeText( activity, token, Toast.LENGTH_LONG ).show(); - //TODO(navigate to main page) SharedPreferencesHelper.addValue("jwt",token,activity!!) val intent= Intent(activity!!, NavigationActivity::class.java) startActivity(intent) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt index 22935a5..57e7e82 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt @@ -14,7 +14,8 @@ interface IAuthApi { fun login(@Body obj:Login): Call @POST("/api/auth/register") fun register(@Body obj:Register):Call - + @POST("/api/auth/refreshJwt") + fun refreshJwt(@Header("Authorization") authHeader:String): Call //@POST("putanja") //fun add(@Body obj:Post,@Header("Authorization") authHeader:String):Call } \ 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 1208564..e55da11 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 @@ -3,10 +3,15 @@ package com.example.brzodolokacije import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.util.Log +import android.widget.Toast import com.auth0.android.jwt.JWT 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 retrofit2.Call +import retrofit2.Response class MainActivity : AppCompatActivity() { @@ -17,8 +22,9 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) val intent:Intent - if(checkLoggedIn()) - intent= Intent(this, NavigationActivity::class.java) + if(checkLoggedIn()) { + intent = Intent(this, NavigationActivity::class.java) + } else intent= Intent(this, ActivityLoginRegister::class.java) @@ -33,10 +39,42 @@ class MainActivity : AppCompatActivity() { var jwt:JWT=JWT(jwtString) if(jwt.isExpired(30)) return false + refreshJwt(jwtString) return true + } + + fun refreshJwt(token:String){ + Log.d("Main","RIPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP") + if(token==null) + return + var refreshJwt= RetrofitHelper.getInstance().refreshJwt("Bearer "+token) + refreshJwt.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful()){ + val newToken=response.body().toString() + Toast.makeText( + applicationContext, token, Toast.LENGTH_LONG + ).show(); + SharedPreferencesHelper.addValue("jwt",newToken,this@MainActivity) + }else{ + if(response.errorBody()!=null) + Toast.makeText(applicationContext, response.errorBody()!!.string(), Toast.LENGTH_LONG).show(); + } + + + } + + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText( + applicationContext, t.toString(), Toast.LENGTH_LONG + ).show(); + } + }) + + } } \ No newline at end of file -- cgit v1.2.3 From bf2b7accb869db760ee04c2f33f93f08164b8993 Mon Sep 17 00:00:00 2001 From: "branislav.radivojevic" Date: Sat, 5 Nov 2022 14:51:17 +0100 Subject: reset sifre na app-u --- Backend/Api/Api/Services/PostService.cs | 10 +--- .../Activities/ActivityForgottenPassword.kt | 56 ++++++++++++++++++++-- .../Activities/ActivityForgottenPasswordVerify.kt | 56 ++++++++++++++++++++-- .../example/brzodolokacije/Interfaces/IAuthApi.kt | 7 +++ .../brzodolokacije/Models/Auth/ResetPass.kt | 4 ++ 5 files changed, 115 insertions(+), 18 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Auth/ResetPass.kt diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index 2f29366..0a12f39 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -23,7 +23,7 @@ namespace Api.Services { Post p = new Post(); p._id = ""; - p.ownerId = _httpContext.HttpContext.User.FindFirstValue("id"); + p.ownerId = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); p.locationId = post.locationId; p.description = post.description; @@ -63,14 +63,6 @@ namespace Api.Services } await _posts.InsertOneAsync(p); - - - - - - - - return postToPostSend(p); } diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPassword.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPassword.kt index e7c9836..b0b7f5e 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPassword.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPassword.kt @@ -1,27 +1,73 @@ package com.example.brzodolokacije.Activities import android.content.Intent +import android.graphics.Color import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.util.Log import android.view.View import android.widget.Button +import android.widget.EditText import android.widget.Toast +import com.example.brzodolokacije.Models.Auth.JustMail +import com.example.brzodolokacije.Models.Auth.Login import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.Response class ActivityForgottenPassword : AppCompatActivity() { private lateinit var sendCode: Button + private lateinit var email: EditText + private lateinit var emailString:String + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_forgotten_password) sendCode=findViewById(R.id.forgottenPasswordSendCode) as Button - + email=findViewById(R.id.editTextTextPersonName) as EditText sendCode.setOnClickListener{ - intent= Intent(this, ActivityForgottenPasswordVerify::class.java) - startActivity(intent) - } + emailString=email.text.toString().trim() - } + if(!emailString.isEmpty() && checkEmail(emailString)==true) { + + var emailData= JustMail(emailString) + val authApi= RetrofitHelper.getInstance() + val request=authApi.forgotpass(emailData) + val cont=this + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + Log.d("main",response.code().toString()) + Log.d("main",response.body().toString()) + if(response.code()==200){ + val intent = Intent(cont, ActivityForgottenPasswordVerify::class.java) + intent.putExtra("email", emailString) + startActivity(intent) + } + } + override fun onFailure(call: Call, t: Throwable) { + } + }) + } + } + } + //from fragment login + fun checkEmail(emailString:String):Boolean{ + val emailRegex = "^[A-Za-z](.*)([@]{1})(.{1,})(\\.)(.{1,})" + if(!(emailRegex.toRegex().matches(emailString))){ + Toast.makeText( + this, "Email adresa nije validna, pokušajte ponovo", Toast.LENGTH_LONG + ).show(); + email.setHintTextColor(Color.RED) + return false + } + else{ + return true + } + } } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPasswordVerify.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPasswordVerify.kt index 6533237..a1db97f 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPasswordVerify.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPasswordVerify.kt @@ -5,24 +5,72 @@ import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.Button +import android.widget.EditText import android.widget.Toast import com.example.brzodolokacije.MainActivity +import com.example.brzodolokacije.Models.Auth.Login +import com.example.brzodolokacije.Models.Auth.ResetPass import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.Response class ActivityForgottenPasswordVerify : AppCompatActivity() { private lateinit var changePassword: Button + private lateinit var pw:EditText + private lateinit var pwchk:EditText + private lateinit var kod:EditText override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_forgotten_password_verify) + kod=findViewById(R.id.editTextTextPersonName) as EditText + pw=findViewById(R.id.editTextoldPassword) as EditText + pwchk =findViewById(R.id.editTextTextPassword) as EditText changePassword=findViewById(R.id.btnChangePassword) as Button changePassword.setOnClickListener{ + + var email =intent.getStringExtra("email") + var pwstr=pw.text.toString().trim() + var pwchkstr=pwchk.text.toString().trim() + var kodstr=kod.text.toString().trim() + + if(!kodstr.isEmpty() && checkPassword(pwstr,pwchkstr)){ + var resetData= ResetPass(email!!,kodstr,pwstr) + val authApi= RetrofitHelper.getInstance() + val request=authApi.resetpass(resetData) + val cont=this + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.code()==200){ + intent = Intent(cont, ActivityLoginRegister::class.java) + startActivity(intent) + } + } + override fun onFailure(call: Call, t: Throwable) { + } + }) + } + } + } + + //from fragment login + fun checkPassword(passwordString:String,passwordConfirm:String):Boolean{ + + if(passwordString.length<6){ Toast.makeText( - this, "Lozinka je uspešno promenjena.", Toast.LENGTH_LONG + this, "Lozinke su prekratke", Toast.LENGTH_LONG ).show(); - - intent= Intent(this, ActivityLoginRegister::class.java) - startActivity(intent) + return false + } + if(!passwordString.equals(passwordConfirm)){ + Toast.makeText( + this, "Lozinke su se ne poklapaju", Toast.LENGTH_LONG + ).show(); + return false } + return true } } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt index 57e7e82..25f18a3 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt @@ -1,7 +1,9 @@ package com.example.brzodolokacije.Interfaces +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.Post import okhttp3.ResponseBody import retrofit2.Call @@ -16,6 +18,11 @@ interface IAuthApi { fun register(@Body obj:Register):Call @POST("/api/auth/refreshJwt") fun refreshJwt(@Header("Authorization") authHeader:String): Call + @POST("/api/auth/forgotpass") + fun forgotpass(@Body obj:JustMail):Call + @POST("/api/auth/resetpass") + fun resetpass(@Body obj:ResetPass):Call + //@POST("putanja") //fun add(@Body obj:Post,@Header("Authorization") authHeader:String):Call } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Auth/ResetPass.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Auth/ResetPass.kt new file mode 100644 index 0000000..945c8d1 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Auth/ResetPass.kt @@ -0,0 +1,4 @@ +package com.example.brzodolokacije.Models.Auth + +data class ResetPass(var email:String,var kod:String,var newpass:String) +data class JustMail(var email:String) \ No newline at end of file -- cgit v1.2.3 From f8b5a5eed843cdd0e94f96be072043f47c5db956 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sat, 5 Nov 2022 15:18:18 +0100 Subject: Kada se dodaje lokacija omoguceno da se koristi MapQuest geocoder da se nadju kordinate tog mesta i da se upisu u lokaciju. --- Backend/Api/Api/Api.csproj | 3 +++ Backend/Api/Api/Services/LocationService.cs | 18 ++++++++++++++++-- Backend/Api/Api/appsettings.json | 19 ++++++++++--------- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/Backend/Api/Api/Api.csproj b/Backend/Api/Api/Api.csproj index b09c2fd..80898fd 100644 --- a/Backend/Api/Api/Api.csproj +++ b/Backend/Api/Api/Api.csproj @@ -7,6 +7,9 @@ + + + diff --git a/Backend/Api/Api/Services/LocationService.cs b/Backend/Api/Api/Services/LocationService.cs index 629c2a7..292fc0e 100644 --- a/Backend/Api/Api/Services/LocationService.cs +++ b/Backend/Api/Api/Services/LocationService.cs @@ -1,6 +1,11 @@ using Api.Interfaces; using Api.Models; +using Geocoding; +using Geocoding.Google; +using Geocoding.MapQuest; using MongoDB.Driver; +using ZstdSharp.Unsafe; +using Location = Api.Models.Location; namespace Api.Services { @@ -9,15 +14,24 @@ namespace Api.Services private readonly MongoClient _client; private readonly IMongoCollection _locations; private readonly IHttpContextAccessor _httpContext; - public LocationService(IDatabaseConnection settings, IMongoClient mongoClient) + private IConfiguration _configuration; + private MapQuestGeocoder _geocoder; + public LocationService(IDatabaseConnection settings, IMongoClient mongoClient, IConfiguration configuration) { var database = mongoClient.GetDatabase(settings.DatabaseName); _locations = database.GetCollection(settings.LocationCollectionName); + _configuration = configuration; + var _mapQuestApiKey = _configuration.GetSection("AppSettings:MapQuestApiKey").Value; + _geocoder = new MapQuestGeocoder(_mapQuestApiKey); + } public async Task add(Location loc) { - //TODO GOOGLE MAPS API CALL FOR info + IEnumerable
adresses = await _geocoder.GeocodeAsync(loc.name+" "+loc.address+" "+loc.city+" "+loc.country); + loc.latitude = adresses.First().Coordinates.Latitude; + loc.longitude=adresses.First().Coordinates.Longitude; await _locations.InsertOneAsync(loc); + return loc; } public async Task getById(string id) diff --git a/Backend/Api/Api/appsettings.json b/Backend/Api/Api/appsettings.json index b7f25b2..22d91dc 100644 --- a/Backend/Api/Api/appsettings.json +++ b/Backend/Api/Api/appsettings.json @@ -1,8 +1,9 @@ { - "AppSettings": { - "JwtToken": "PjrVqQJ1P2VOkuWLw7NaZUluT4z7bkau", - "EmailToken": "e8X8c0lm9KS7itWi3wgE6BiPXR21WPvO" - }, + "AppSettings": { + "JwtToken": "PjrVqQJ1P2VOkuWLw7NaZUluT4z7bkau", + "EmailToken": "e8X8c0lm9KS7itWi3wgE6BiPXR21WPvO", + "MapQuestApiKey": "47oeviBUoCI2JxWzNARmCtrH9fDp5Mtk" //msbs#556ASDFGGSGSD + }, "Logging": { "LogLevel": { @@ -21,11 +22,11 @@ "LocationCollectionname": "locations" }, - "EmailCfg": { - "Email": "oddyssey.brzodolokacije@gmail.com", - "SmtpServer": "smtp.gmail.com", - "Password": "nrokhfcwahfbqnpp" //msbs#556 - }, + "EmailCfg": { + "Email": "oddyssey.brzodolokacije@gmail.com", + "SmtpServer": "smtp.gmail.com", + "Password": "nrokhfcwahfbqnpp" //msbs#556 + }, "URLs": { "localhost": "http://localhost:5279/", "actual":"add url when back put onto server" -- cgit v1.2.3 From fb5f9f0b90eff107cf9b171a46e8ac53e633788f Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Sat, 5 Nov 2022 21:28:36 +0100 Subject: Dodati fragmenti za dodavanje objave i lokacije. Ispravljen konflikt. --- .../Activities/NavigationActivity.kt | 2 +- .../Fragments/FragmentAddLocation.kt | 60 +++++++++++++++++++ .../brzodolokacije/Fragments/FragmentAddNew.kt | 59 ++++++++++++++++++ .../brzodolokacije/Fragments/FragmentAddPost.kt | 7 +-- .../brzodolokacije/Fragments/FragmentProfile.kt | 11 +--- .../src/main/res/layout/fragment_add_location.xml | 14 +++++ .../app/src/main/res/layout/fragment_add_new.xml | 69 ++++++++++++++++++++++ 7 files changed, 207 insertions(+), 15 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddLocation.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddNew.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_location.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_new.xml 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 d36dbae..baa83ee 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 @@ -16,7 +16,7 @@ class NavigationActivity : AppCompatActivity() { val fragmentShowPosts=FragmentShowPosts() val browseFragment=FragmentBrowse() - val addPostFragment=FragmentAddPost() + val addPostFragment= FragmentAddNew() val profileFragment=FragmentProfile() val bottomNav=findViewById(R.id.bottomNavigationView) as BottomNavigationView setCurrentFragment(fragmentShowPosts) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddLocation.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddLocation.kt new file mode 100644 index 0000000..2d0a3bd --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddLocation.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentAddLocation.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentAddLocation : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_add_location, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentAddLocation. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentAddLocation().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddNew.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddNew.kt new file mode 100644 index 0000000..b1b257b --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddNew.kt @@ -0,0 +1,59 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import androidx.fragment.app.FragmentTransaction +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentAddNew.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentAddNew : Fragment() { + // TODO: Rename and change types of parameters + + private lateinit var addNewPost: Button + private lateinit var addNewLocation: Button + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + val view:View=inflater.inflate(R.layout.fragment_add_new, container, false) + addNewPost=view.findViewById(R.id.btnFragmentAddNewNewPost) as Button + addNewLocation=view.findViewById(R.id.btnFragmentAddNewNewLocation) as Button + + + addNewPost.setOnClickListener{ + + var fm: FragmentTransaction =childFragmentManager.beginTransaction() + + fm.replace(R.id.flFragmentAddNewFragmentContainer, FragmentAddPost()) + fm.commit() + } + + + addNewLocation.setOnClickListener{ + + var fm: FragmentTransaction =childFragmentManager.beginTransaction() + + fm.replace(R.id.flFragmentAddNewFragmentContainer, FragmentAddLocation()) + fm.commit() + } + + return view + } + + +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt index 7fca83b..66141dd 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt @@ -7,6 +7,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button +import androidx.core.content.ContextCompat.startActivity import com.example.brzodolokacije.Activities.ActivityLoginRegister import com.example.brzodolokacije.Activities.NavigationActivity import com.example.brzodolokacije.R @@ -28,11 +29,7 @@ class FragmentAddPost : Fragment(R.layout.fragment_add_post) { savedInstanceState: Bundle? ): View? { val view:View=inflater.inflate(R.layout.fragment_add_post, container, false) - // Inflate the layout for this fragment - /*val logOutButton=view.findViewById(R.id.btnFragmentAddLogOut) as Button - logOutButton.setOnClickListener{ - logOut() - }*/ + return view; } 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 c9ce8cc..c10afbb 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 @@ -1,21 +1,14 @@ 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 android.widget.Button -import android.widget.EditText import android.widget.TextView import androidx.fragment.app.FragmentTransaction import com.example.brzodolokacije.R -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -54,8 +47,8 @@ class FragmentProfile : Fragment(R.layout.fragment_profile) { followersCount = view.findViewById(R.id.tvFragmentProfileFollowersNo) as TextView followingCount = view.findViewById(R.id.tvFragmentProfileFollowNo) as TextView - showMyPosts=view.findViewById(R.id.btnFragmentProfileShowMyPosts) as Button - showMyData=view.findViewById(R.id.btnFragmentProfileShowMyData) as Button + showMyPosts=view.findViewById(R.id.btnFragmentAddNewNewPost) as Button + showMyData=view.findViewById(R.id.btnFragmentAddNewNewLocation) as Button showMyRecensions=view.findViewById(R.id.btnFragmentProfileShowMyRecensions) as Button //podaci iz baze diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_location.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_location.xml new file mode 100644 index 0000000..bfc1edb --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_location.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_new.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_new.xml new file mode 100644 index 0000000..5cfda04 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_new.xml @@ -0,0 +1,69 @@ + + + + + + + +