diff options
Diffstat (limited to 'Client')
60 files changed, 2168 insertions, 133 deletions
diff --git a/Client/BrzoDoLokacije/app/build.gradle b/Client/BrzoDoLokacije/app/build.gradle index f6faf0d..72f1f0d 100644 --- a/Client/BrzoDoLokacije/app/build.gradle +++ b/Client/BrzoDoLokacije/app/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' + id 'org.jetbrains.kotlin.android.extensions' } android { @@ -34,6 +35,9 @@ android { buildFeatures { viewBinding true } + androidExtensions { + experimental = true + } } dependencies { @@ -52,4 +56,7 @@ dependencies { //JWT implementation 'com.auth0.android:jwtdecode:2.0.1' + //Glide + implementation 'com.github.bumptech.glide:glide:4.12.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' }
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml index edf65a2..aa4598b 100644 --- a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml +++ b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml @@ -2,8 +2,24 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> + <!--DOZVOLE--> <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" + android:maxSdkVersion="18" /> + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" /> + <uses-permission android:name="android.permission.CAMERA" + android:required="true" + android:requiredFeature="true"/> + + <!--SVOJSTVA--> + + <uses-feature android:name="android.hardware.camera" android:required="true"></uses-feature> + + <!--AKTIVNOSTI--> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" @@ -15,12 +31,19 @@ android:theme="@style/Theme.BrzoDoLokacije" android:usesCleartextTraffic="true" tools:targetApi="31"> - <activity android:name=".Activities.ActivityForgottenPasswordVerify" /> - <activity android:name=".Activities.ActivityForgottenPassword" /> - <activity android:name=".Activities.ActivityLoginRegister" /> - <activity android:name=".Activities.NavigationActivity" /> <activity - android:name=".MainActivity" + android:name=".Activities.ActivityCapturePost" + android:exported="false"> + <meta-data + android:name="android.app.lib_name" + android:value="" /> + </activity> + <activity android:name=".Activities.ActivitySinglePost" /> + <activity + android:name=".Activities.ActivityAddPost" +/> + <activity + android:name=".Activities.SplashPage" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> @@ -32,6 +55,35 @@ android:name="android.app.lib_name" android:value="" /> </activity> + <activity android:name=".Activities.ActivityForgottenPasswordVerify" /> + <activity android:name=".Activities.ActivityForgottenPassword" /> + <activity android:name=".Activities.ActivityLoginRegister" /> + <activity android:name=".Activities.NavigationActivity" /> + <activity + android:name=".MainActivity" + android:exported="false"> + <meta-data + android:name="android.app.lib_name" + android:value="" /> + </activity> + + <provider + android:name="androidx.core.content.FileProvider" + android:authorities="com.example.android.fileprovider" + android:exported="false" + android:grantUriPermissions="true"> + <meta-data + android:name="android.support.FILE_PROVIDER_PATHS" + android:resource="@xml/file_paths"></meta-data> + </provider> + + </application> + <queries> + <intent> + <action android:name="android.media.action.IMAGE_CAPTURE" /> + </intent> + </queries> + </manifest>
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityAddPost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityAddPost.kt new file mode 100644 index 0000000..40d8f11 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityAddPost.kt @@ -0,0 +1,264 @@ +package com.example.brzodolokacije.Activities + +import android.Manifest +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Color +import android.net.Uri +import android.os.Bundle +import android.util.Log +import android.view.View +import android.widget.* +import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import com.example.brzodolokacije.Models.Location +import com.example.brzodolokacije.Models.LocationType +import com.example.brzodolokacije.Models.PostPreview +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import okhttp3.MediaType +import okhttp3.MultipartBody +import okhttp3.RequestBody +import retrofit2.Call +import retrofit2.Response +import java.io.File +import java.io.IOException + + +class ActivityAddPost : AppCompatActivity() { + private lateinit var uploadFromGallery: Button + private lateinit var takePhoto: Button + private lateinit var showNextImage:Button + private lateinit var showPreviousImage:Button + private lateinit var switcher: ImageSwitcher + private var uploadedImages:ArrayList<Uri?>?=null + + private lateinit var location:EditText + private lateinit var description:EditText + private lateinit var locationString:String + private lateinit var descriptionString:String + private lateinit var post:Button + //private var paths :ArrayList<String?>?=null + private var place=0; + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_add_post) +// Toast.makeText( +// applicationContext, "Add new ", Toast.LENGTH_LONG +// ).show(); + uploadedImages= ArrayList() + + //paths= ArrayList() + + uploadFromGallery=findViewById<View>(R.id.btnActivityAddPostUploadFromGallery) as Button + showNextImage=findViewById<View>(R.id.nextImage) as Button + showPreviousImage=findViewById<View>(R.id.previousImage) as Button + switcher=findViewById<View>(R.id.isActivityAddPostSwitcher) as ImageSwitcher + location=findViewById<View>(R.id.etActivityAddPostLocation) as EditText + description=findViewById<View>(R.id.etActivityAddPostDescription) as EditText + post=findViewById<View>(R.id.btnActivityAddPostPost) as Button + + + switcher?.setFactory{ + val imgView = ImageView(applicationContext) + imgView.scaleType = ImageView.ScaleType.CENTER_CROP + imgView.setPadding(8, 8, 8, 8) + imgView} + + //dodavanje iz galerije + uploadFromGallery.setOnClickListener{ + + //provera da li je odobrena upotreba galerije + if(ContextCompat.checkSelfPermission(this@ActivityAddPost, Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ + ActivityCompat.requestPermissions(this@ActivityAddPost, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),101) + } + + //otvaranje galerije + val intent= Intent(Intent.ACTION_PICK) + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) + intent.action = Intent.ACTION_GET_CONTENT + intent.type="image/*" + startActivityForResult(Intent.createChooser(intent,"Izaberi fotografije"),0) + } + + + //prikaz ucitanih + // + showPreviousImage.setOnClickListener{ + if(place>0){ + place=place-1 + switcher.setImageURI(uploadedImages!![place]) + showNextImage.isEnabled=true + } + else{ + showPreviousImage.isEnabled=false + } + } + + + showNextImage.setOnClickListener{ + if(place<uploadedImages!!.size-1){ + place=place+1 + switcher.setImageURI(uploadedImages!![place]) + showPreviousImage.isEnabled=true + } + else{ + showNextImage.isEnabled=false + } + } + + post.setOnClickListener{ + locationString=location.text.toString().trim() + descriptionString=description.text.toString().trim() + //prazan unos? + if(locationString.isEmpty()) { + location.hint="Unesite lokaciju" + location.setHintTextColor(Color.RED) + } + if(descriptionString.isEmpty()) { + description.hint="Unesite lokaciju" + description.setHintTextColor(Color.RED) + } + + if(!locationString.isEmpty() && !descriptionString.isEmpty()){ + sendPost() + } + } + } + + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + //nakon otvaranja + if(requestCode==0 && resultCode== RESULT_OK){ + //samo jedna slika + //image.setImageURI(data?.data) + + //veci broj slika + if (data!!.getClipData() != null) { + var count = data!!.clipData!!.itemCount + + for (i in 0..count - 1) { + var _uri: Uri = data!!.clipData!!.getItemAt(i).uri + uploadedImages!!.add(_uri) + } + + // prikaz ucitanih + switcher.setImageURI(uploadedImages!![0]) + place=0 + //jedna slika + } else if (data?.getData() != null) { + uploadedImages!!.add(data.data!!) + + //prikaz jedne ucitane + switcher.setImageURI(data.data!!) + } + } + } + private fun sendPost(){ + uploadLocation() + + } + fun uploadLocation() { + val api =RetrofitHelper.getInstance() + var loc:Location=Location("",locationString,"","","",0.0,0.0,LocationType.GRAD) + var jwtString= SharedPreferencesHelper.getValue("jwt",this) + var data=api.addLocation("Bearer "+jwtString,loc) + + + data.enqueue(object : retrofit2.Callback<Location?> { + override fun onResponse(call: Call<Location?>, response: Response<Location?>) { + if(response.isSuccessful()){ + Toast.makeText( + applicationContext, "USPEH", Toast.LENGTH_LONG + ).show(); + uploadPost(response.body()!!._id) + Log.d("MAIN","RADI") + Log.d("MAIN","RADI") + + }else { + + if (response.errorBody() != null) { + Log.d("Main",response.errorBody()!!.string()) + Log.d("Main",response.message()) + } + Log.d("Main","sadadsa") + Log.d("Main",response.errorBody()!!.string()) + Log.d("Main",response.message()) + } + + + } + + override fun onFailure(call: Call<Location?>, t: Throwable) { + Toast.makeText( + applicationContext, t.toString(), Toast.LENGTH_LONG + ).show(); + Log.d("Main",t.toString()) + } + }) + } + fun uploadPost(loc:String){ + val api =RetrofitHelper.getInstance() + var desc=descriptionString + description.text.clear() + //loc + //desc + var locReq=RequestBody.create(MediaType.parse("text/plain"),loc) + var descReq=RequestBody.create(MediaType.parse("text/plain"),desc) + var idReq=RequestBody.create(MediaType.parse("text/plain"),"dsa") + val imagesParts = arrayOfNulls<MultipartBody.Part>( + uploadedImages!!.size + ) + + //dodavanje u bazu + for (i in 0..uploadedImages!!.size - 1){ + //var file=File(uploadedImages!![i]!!.path) + Log.d("Main", uploadedImages!![i]!!.path!!) + + var inputStream=getContentResolver().openInputStream(uploadedImages!![i]!!) + val file: File = File.createTempFile("temp",i.toString()) + file!!.writeBytes(inputStream!!.readBytes()) + + + var imageBody=RequestBody.create(MediaType.parse("image/*"),file) + imagesParts[i]=MultipartBody.Part.createFormData("images",file.name,imageBody) + } + var jwtString= SharedPreferencesHelper.getValue("jwt",this) + var data=api.addPost("Bearer "+jwtString,imagesParts,idReq,descReq,locReq) + + + data.enqueue(object : retrofit2.Callback<PostPreview?> { + override fun onResponse(call: Call<PostPreview?>, response: Response<PostPreview?>) { + if(response.isSuccessful()){ + Toast.makeText( + applicationContext, "USPEH", Toast.LENGTH_LONG + ).show(); + }else { + + if (response.errorBody() != null) { + Toast.makeText( + applicationContext, + response.errorBody()!!.string(), + Toast.LENGTH_LONG + ).show(); + Log.d("Main",response.errorBody()!!.string()) + } + } + + + } + + override fun onFailure(call: Call<PostPreview?>, t: Throwable) { + Toast.makeText( + applicationContext, t.toString(), Toast.LENGTH_LONG + ).show(); + Log.d("Main",t.toString()) + } + }) + } + +}
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityCapturePost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityCapturePost.kt new file mode 100644 index 0000000..951ccf5 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityCapturePost.kt @@ -0,0 +1,149 @@ +package com.example.brzodolokacije.Activities + +import android.Manifest +import android.app.Activity +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.Color +import android.net.Uri +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.os.Environment +import android.os.Environment.getExternalStoragePublicDirectory +import android.provider.MediaStore +import android.view.View +import android.widget.Button +import android.widget.EditText +import android.widget.ImageView +import android.widget.Toast +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.core.content.FileProvider +import com.example.brzodolokacije.R +import kotlinx.android.synthetic.main.fragment_profile.* +import java.io.File +import java.io.IOException +import java.text.SimpleDateFormat +import java.util.* +import kotlin.collections.ArrayList + +class ActivityCapturePost : AppCompatActivity() { + lateinit var currentPhotoPath: String + private lateinit var takePhoto: Button + private lateinit var location: EditText + private lateinit var description: EditText + private lateinit var locationString:String + private lateinit var descriptionString:String + private lateinit var post:Button + private lateinit var showImage:ImageView + private var uploadedImages:ArrayList<Uri?>?=null + private lateinit var photoPath:String + private lateinit var photoURI:Uri + + @Throws(IOException::class) + private fun createImageFile(): File { + val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date()) + val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES) + return File.createTempFile( + "JPEG_${timeStamp}_", /* prefix */ + ".jpg", /* suffix */ + storageDir /* directory */ + ).apply { + currentPhotoPath = absolutePath + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_capture_post) + + //provera da li je odobrena upotreba skladista + if(ContextCompat.checkSelfPermission(this@ActivityCapturePost, Manifest.permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED){ + ActivityCompat.requestPermissions(this@ActivityCapturePost, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),101) + } + //provera da li je odobrena upotreba kamere + if(ContextCompat.checkSelfPermission(this@ActivityCapturePost, Manifest.permission.CAMERA) + != PackageManager.PERMISSION_GRANTED){ + ActivityCompat.requestPermissions(this@ActivityCapturePost, arrayOf(Manifest.permission.CAMERA),101) + } + + //provera da li je odobren upis u skladiste + if(ContextCompat.checkSelfPermission(this@ActivityCapturePost, Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED){ + ActivityCompat.requestPermissions(this@ActivityCapturePost, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),101) + } + + location=findViewById<View>(R.id.etActivityCapturePostLocation) as EditText + description=findViewById<View>(R.id.etActivityCapturePostDescription) as EditText + post=findViewById<View>(R.id.btnActivityCapturePostPost) as Button + showImage=findViewById<View>(R.id.ivActivityCapturePostImage) as ImageView + takePhoto=findViewById<View>(R.id.btnActivityCapturePostCapture) as Button + + //dodavanje sa kamere + takePhoto.setOnClickListener { + Toast.makeText( + applicationContext, "camera intent button", Toast.LENGTH_LONG + ).show(); + Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent -> + takePictureIntent.resolveActivity(packageManager)?.also { + val photoFile: File? = try { + createImageFile() + } catch (ex: IOException) { + null + } + photoFile?.also { + photoURI= FileProvider.getUriForFile( + this, + "com.example.android.fileprovider", + it + ) + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI) + startActivityForResult(takePictureIntent, 123) + } + } + } + + + } + post.setOnClickListener{ + locationString=location.text.toString().trim() + descriptionString=description.text.toString().trim() + //prazan unos? + if(locationString.isEmpty()) { + location.hint="Unesite lokaciju" + location.setHintTextColor(Color.RED) + } + if(descriptionString.isEmpty()) { + description.hint="Unesite lokaciju" + description.setHintTextColor(Color.RED) + } + + /*if(!locationString.isEmpty() && !descriptionString.isEmpty()){ + + //dodaj u bazu + + }*/ + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK && requestCode == 123 && data != null){ + Toast.makeText( + applicationContext, "camera intent", Toast.LENGTH_LONG + ).show(); + + showImage.setImageURI(photoURI) + + Toast.makeText( + applicationContext, currentPhotoPath, Toast.LENGTH_LONG + ).show(); + /*var photo:Bitmap=data.extras!!.get("data") as Bitmap + showImage.setImageBitmap(photo)*/ + } + } + + +}
\ No newline at end of file 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<View>(R.id.forgottenPasswordSendCode) as Button - + email=findViewById<View>(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<ResponseBody?> { + override fun onResponse(call: Call<ResponseBody?>, response: Response<ResponseBody?>) { + 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<ResponseBody?>, 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<View>(R.id.editTextTextPersonName) as EditText + pw=findViewById<View>(R.id.editTextoldPassword) as EditText + pwchk =findViewById<View>(R.id.editTextTextPassword) as EditText changePassword=findViewById<View>(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<ResponseBody?> { + override fun onResponse(call: Call<ResponseBody?>, response: Response<ResponseBody?>) { + if(response.code()==200){ + intent = Intent(cont, ActivityLoginRegister::class.java) + startActivity(intent) + } + } + override fun onFailure(call: Call<ResponseBody?>, 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/Activities/ActivitySinglePost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt new file mode 100644 index 0000000..32cb3ef --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt @@ -0,0 +1,62 @@ +package com.example.brzodolokacije.Activities + +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Adapters.PostImageAdapter +import com.example.brzodolokacije.Models.PostImage +import com.example.brzodolokacije.Models.PostPreview +import com.example.brzodolokacije.R +import com.example.brzodolokacije.databinding.ActivitySinglePostBinding + + +class ActivitySinglePost : AppCompatActivity() { + private lateinit var binding: ActivitySinglePostBinding + private var layoutManagerVar: RecyclerView.LayoutManager? = null + private var adapterVar: RecyclerView.Adapter<PostImageAdapter.ViewHolder>? = null + private var recyclerView: RecyclerView?=null + private lateinit var post:PostPreview + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding=ActivitySinglePostBinding.inflate(layoutInflater) + setContentView(binding.root) + post= intent.extras?.getParcelable("selectedPost")!! + //load data for the list + + //instantiate adapter and linearLayout + adapterVar= PostImageAdapter(this@ActivitySinglePost, post.images as MutableList<PostImage>) + layoutManagerVar= LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false) + recyclerView = binding.rvMain + // set recyclerView attributes + recyclerView?.setHasFixedSize(true) + recyclerView?.layoutManager = layoutManagerVar + recyclerView?.adapter = adapterVar + loadTextComponents() + } + + private fun loadImages(){ + + } + + private fun loadTextComponents() { + binding.apply { + tvTitle.text= post.location.name + tvTitle.invalidate() + tvLocationType.text="TODO" + tvLocationType.invalidate() + tvLocationParent.text="TODO" + tvLocationParent.invalidate() + tvRating.text=post.ratings.toString() + tvRating.invalidate() + tvNumberOfRatings.text=post.ratings.toString() + tvNumberOfRatings.invalidate() + tvDescription.text=post.description + tvDescription.invalidate() + } + } + +}
\ 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..481591d 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/NavigationActivity.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/NavigationActivity.kt @@ -1,32 +1,37 @@ package com.example.brzodolokacije.Activities +import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.Button +import android.widget.Toast 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 +import com.google.android.material.bottomsheet.BottomSheetDialog class NavigationActivity : AppCompatActivity() { + + //lateinit var openAddPost:Button + //lateinit var capturePost:Button + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_navigation) - val homeFragment=FragmentHome() + val fragmentShowPosts=FragmentShowPosts() val browseFragment=FragmentBrowse() - val addPostFragment=FragmentAddPost() + val addPostFragment= FragmentAddNew() val profileFragment=FragmentProfile() val bottomNav=findViewById<View>(R.id.bottomNavigationView) as BottomNavigationView - setCurrentFragment(homeFragment) + setCurrentFragment(fragmentShowPosts) bottomNav.setOnNavigationItemSelectedListener { when(it.itemId){ - R.id.navHome->setCurrentFragment(homeFragment) - R.id.navAddPost->setCurrentFragment(addPostFragment) + R.id.navHome->setCurrentFragment(fragmentShowPosts) + //R.id.navAddPost->setCurrentFragment(addPostFragment) + R.id.navAddPost->showBottomSheetAddNew() R.id.navBrowse->setCurrentFragment(browseFragment) R.id.navProfile->setCurrentFragment(profileFragment) @@ -42,5 +47,34 @@ class NavigationActivity : AppCompatActivity() { commit() } + private fun showBottomSheetAddNew(){ + var bottomSheetDialog:BottomSheetDialog + val bottomSheetView = layoutInflater.inflate(R.layout.bottom_sheet_add_new, null) + bottomSheetDialog=BottomSheetDialog(this) + bottomSheetDialog.setContentView(R.layout.bottom_sheet_add_new) + bottomSheetDialog.show() + + + var openAddPost=bottomSheetDialog.findViewById<View>(R.id.btnBottomSheetAddNewOpenAddPost) as Button + var capturePost=bottomSheetDialog.findViewById<View>(R.id.btnBottomSheetAddNewOpenCapturePost) as Button + + openAddPost.setOnClickListener{ + Toast.makeText( + applicationContext, "Open select from gallery ", Toast.LENGTH_LONG + ).show(); + val intent = Intent (this, ActivityAddPost::class.java) + startActivity(intent) + } + + capturePost.setOnClickListener{ + Toast.makeText( + applicationContext, "Open capture ", Toast.LENGTH_LONG + ).show(); + val intent = Intent (this, ActivityCapturePost::class.java) + startActivity(intent) + } + + } + }
\ No newline at end of file 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..3d2f923 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/SplashPage.kt @@ -0,0 +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) + } +} diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostImageAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostImageAdapter.kt new file mode 100644 index 0000000..655b717 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/PostImageAdapter.kt @@ -0,0 +1,42 @@ +package com.example.brzodolokacije.Adapters + +import android.app.Activity +import android.graphics.BitmapFactory +import android.media.Image +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.example.brzodolokacije.Models.Post +import com.example.brzodolokacije.Models.PostImage +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.databinding.PostImageBinding +import com.example.brzodolokacije.databinding.PostPreviewBinding + +class PostImageAdapter(val activity: Activity, val items : MutableList<PostImage>) + : RecyclerView.Adapter<PostImageAdapter.ViewHolder>(){ + //constructer has one argument - list of objects that need to be displayed + //it is bound to xml of single item + private lateinit var binding: PostImageBinding + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val inflater = LayoutInflater.from(parent.context) + binding= PostImageBinding.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 : PostImageBinding) : RecyclerView.ViewHolder(itemView.root){ + fun bind(item : PostImage){ + binding.apply { + if(item!=null) { + Glide.with(activity) + .load(RetrofitHelper.baseUrl + "/api/post/image/" + item._id) + .into(locationImage) + } + } + } + } +}
\ No newline at end of file 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..bbcf9e4 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/ShowPostsAdapter.kt @@ -0,0 +1,74 @@ +package com.example.brzodolokacije.Adapters + +import android.app.Activity +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.AsyncTask +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.Toast +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.example.brzodolokacije.Activities.ActivitySinglePost +import com.example.brzodolokacije.Interfaces.IBackendApi +import com.example.brzodolokacije.Models.LocationType +import com.example.brzodolokacije.Models.PostPreview +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import com.example.brzodolokacije.databinding.PostPreviewBinding +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.Response + + +class ShowPostsAdapter (val activity:Activity,val items : MutableList<PostPreview>) + : RecyclerView.Adapter<ShowPostsAdapter.ViewHolder>() { + private lateinit var token: String + private lateinit var imageApi: IBackendApi + + //constructer has one argument - list of objects that need to be displayed + //it is bound to xml of single item + private lateinit var binding: PostPreviewBinding + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val inflater = LayoutInflater.from(parent.context) + imageApi= RetrofitHelper.getInstance() + token= SharedPreferencesHelper.getValue("jwt", activity).toString() + 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]) + holder.itemView.setOnClickListener { + //Toast.makeText(activity,item._id,Toast.LENGTH_LONG).show() + val intent:Intent = Intent(activity,ActivitySinglePost::class.java) + var b=Bundle() + items[position].location.type=LocationType.ADA + b.putParcelable("selectedPost", items[position]) + intent.putExtras(b) + activity.startActivity(intent) + } + } + + + override fun getItemCount() = items.size + inner class ViewHolder(itemView: PostPreviewBinding) : RecyclerView.ViewHolder(itemView.root) { + fun bind(item: PostPreview) { + binding.apply { + tvTitle.text = item.location.name + tvLocationParent.text = item.location.country + tvLocationType.text = "TODO" + if(item.images.isNotEmpty()) { + Glide.with(activity) + .load(RetrofitHelper.baseUrl + "/api/post/image/" + item.images[0]._id) + .into(locationImage) + } + + } + } + } +}
\ No newline at end of file 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..8eaa469 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddNew.kt @@ -0,0 +1,70 @@ +package com.example.brzodolokacije.Fragments + +import android.content.Intent +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.Toast +import androidx.fragment.app.FragmentTransaction +import com.example.brzodolokacije.Activities.ActivityAddPost +import com.example.brzodolokacije.Activities.ActivityForgottenPassword +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<View>(R.id.btnFragmentAddNewNewPost) as Button + addNewLocation=view.findViewById<View>(R.id.btnFragmentAddNewNewLocation) as Button + + + addNewPost.setOnClickListener{ + Toast.makeText( + activity, "Add new post", Toast.LENGTH_LONG + ).show(); + val intent = Intent (getActivity(), ActivityAddPost::class.java) + getActivity()?.startActivity(intent) + +/* + 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 b6452e9..936d755 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,21 +29,11 @@ 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<View>(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/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/Fragments/FragmentLogin.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt index b9568df..01b3f1d 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 @@ -12,13 +12,11 @@ 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 @@ -84,7 +82,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.getInstance() val request=authApi.login(loginData) request.enqueue(object : retrofit2.Callback<String?> { @@ -94,10 +92,10 @@ 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) + activity!!.finish() }else{ if(response.errorBody()!=null) Toast.makeText(activity, response.errorBody()!!.string(), Toast.LENGTH_LONG).show(); diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt index 9c4c370..928a128 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt @@ -1,11 +1,15 @@ 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.R +import com.example.brzodolokacije.Services.SharedPreferencesHelper // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -18,6 +22,7 @@ private const val ARG_PARAM2 = "param2" * create an instance of this fragment. */ class FragmentMyProfileInfo : Fragment() { + private lateinit var logout:Button // TODO: Rename and change types of parameters private var param1: String? = null private var param2: String? = null @@ -28,6 +33,7 @@ class FragmentMyProfileInfo : Fragment() { param1 = it.getString(ARG_PARAM1) param2 = it.getString(ARG_PARAM2) } + } override fun onCreateView( @@ -35,26 +41,23 @@ class FragmentMyProfileInfo : Fragment() { savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_my_profile_info, container, false) + var view=inflater.inflate(R.layout.fragment_my_profile_info, container, false) + + logout=view.findViewById<View>(R.id.buttonLogOut) as Button + logout.setOnClickListener{ + logOut() + + } + + return view } - 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) - } - } + fun logOut(){ + if(SharedPreferencesHelper.removeValue("jwt",requireActivity())) + { + val intent= Intent(requireActivity(), ActivityLoginRegister::class.java) + startActivity(intent) + requireActivity().finish() + } } }
\ 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 index a8176b0..243cab0 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 @@ -53,7 +46,6 @@ class FragmentProfile : Fragment(R.layout.fragment_profile) { postsCount = view.findViewById<View>(R.id.tvFragmentProfilePostsNo) as TextView followersCount = view.findViewById<View>(R.id.tvFragmentProfileFollowersNo) as TextView followingCount = view.findViewById<View>(R.id.tvFragmentProfileFollowNo) as TextView - showMyPosts=view.findViewById<View>(R.id.btnFragmentProfileShowMyPosts) as Button showMyData=view.findViewById<View>(R.id.btnFragmentProfileShowMyData) as Button showMyRecensions=view.findViewById<View>(R.id.btnFragmentProfileShowMyRecensions) as Button @@ -65,7 +57,7 @@ class FragmentProfile : Fragment(R.layout.fragment_profile) { var fm: FragmentTransaction =childFragmentManager.beginTransaction() - fm.replace(R.id.flFragmentProfileFragmentContainer,FragmentUserPosts()) + fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentUserPosts()) fm.commit() } @@ -74,7 +66,7 @@ class FragmentProfile : Fragment(R.layout.fragment_profile) { var fm: FragmentTransaction =childFragmentManager.beginTransaction() - fm.replace(R.id.flFragmentProfileFragmentContainer,FragmentMyProfileInfo()) + fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentMyProfileInfo()) fm.commit() } @@ -82,7 +74,7 @@ class FragmentProfile : Fragment(R.layout.fragment_profile) { var fm: FragmentTransaction =childFragmentManager.beginTransaction() - fm.replace(R.id.flFragmentProfileFragmentContainer,FragmentMyRecensions()) + fm.replace(R.id.flFragmentProfileFragmentContainer, FragmentMyRecensions()) fm.commit() } 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..e166d38 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 @@ -1,9 +1,7 @@ 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 @@ -11,14 +9,12 @@ 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 @@ -81,7 +77,7 @@ class FragmentRegister : Fragment() { var registerData=Register(nameString,usernameString,emailString,passwordString) - val authApi=RetrofitHelper.getInstance().create(IAuthApi::class.java) + val authApi=RetrofitHelper.getInstance() val request=authApi.register(registerData) 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..73744d4 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentShowPosts.kt @@ -0,0 +1,104 @@ +package com.example.brzodolokacije.Fragments + +import android.content.Context +import android.content.Intent +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.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Activities.NavigationActivity +import com.example.brzodolokacije.Adapters.SampleAdapter +import com.example.brzodolokacije.Adapters.ShowPostsAdapter +import com.example.brzodolokacije.Models.* +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import com.example.brzodolokacije.databinding.FragmentHomeBinding +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.Response + + +class FragmentShowPosts : Fragment() { + + private lateinit var binding: FragmentShowPosts + private var posts : MutableList<PostPreview> = mutableListOf() + private var layoutManagerVar: RecyclerView.LayoutManager? = null + private var adapterVar: RecyclerView.Adapter<ShowPostsAdapter.ViewHolder>? = null + private var recyclerView: RecyclerView?=null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + //load data for the list + loadData() + Log.d("main","greska") + //instantiate adapter and linearLayout + val postApi= RetrofitHelper.getInstance() + val token=SharedPreferencesHelper.getValue("jwt", requireActivity()) + val request=postApi.getPosts("Bearer "+token) + + request.enqueue(object : retrofit2.Callback<MutableList<PostPreview>?> { + override fun onResponse(call: Call<MutableList<PostPreview>?>, response: Response<MutableList<PostPreview>?>) { + if(response.isSuccessful){ + posts=response.body()!! + recyclerView?.adapter=ShowPostsAdapter(requireActivity(),posts) + Toast.makeText( + activity, "prosao zahtev", Toast.LENGTH_LONG + ).show() + }else{ + if(response.errorBody()!=null) + Toast.makeText(activity, response.errorBody()!!.string(), Toast.LENGTH_LONG).show(); + } + + + } + + override fun onFailure(call: Call<MutableList<PostPreview>?>, t: Throwable) { + Toast.makeText( + activity, t.toString(), Toast.LENGTH_LONG + ).show(); + } + }) + + adapterVar=ShowPostsAdapter(requireActivity(),posts) + layoutManagerVar= LinearLayoutManager(activity) + } + + private fun loadData() { + posts.add(PostPreview("123","asdasd", + Location("asd","Ajfelov toranj","Pariz", + "Francuska","idk",1.1,1.1, LocationType.GRAD),"opsiopsaid",13, + 4.3f,mutableListOf(),mutableListOf())) + posts.add(PostPreview("123","asdasd", + Location("asd","Ajfelov toranj","Pariz", + "Francuska","idk",1.1,1.1, LocationType.GRAD),"opsiopsaid",13, + 4.3f,mutableListOf(),mutableListOf())) + posts.add(PostPreview("123","asdasd", + Location("asd","Ajfelov toranj","Pariz", + "Francuska","idk",1.1,1.1, LocationType.GRAD),"opsiopsaid",13, + 4.3f,mutableListOf(),mutableListOf())) + posts.add(PostPreview("123","asdasd", + Location("asd","Ajfelov toranj","Pariz", + "Francuska","idk",1.1,1.1, LocationType.GRAD),"opsiopsaid",13, + 4.3f,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/Interfaces/IAuthApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt deleted file mode 100644 index bd430a8..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.brzodolokacije.Interfaces - -import com.example.brzodolokacije.Models.Auth.Login -import com.example.brzodolokacije.Models.Auth.Register -import okhttp3.ResponseBody -import retrofit2.Call -import retrofit2.http.Body -import retrofit2.http.POST - -interface IAuthApi { - @POST("/api/auth/login") - fun login(@Body obj:Login): Call<String> - @POST("/api/auth/register") - fun register(@Body obj:Register):Call<ResponseBody> -}
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt new file mode 100644 index 0000000..c712597 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt @@ -0,0 +1,42 @@ +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.Location +import com.example.brzodolokacije.Models.PostPreview +import okhttp3.MultipartBody +import okhttp3.Request +import okhttp3.RequestBody +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.* + + +interface IBackendApi { + @POST("/api/auth/login") + fun login(@Body obj:Login): Call<String> + @POST("/api/auth/register") + fun register(@Body obj:Register):Call<ResponseBody> + @POST("/api/auth/refreshJwt") + fun refreshJwt(@Header("Authorization") authHeader:String): Call<String> + @POST("/api/auth/forgotpass") + fun forgotpass(@Body obj:JustMail):Call<ResponseBody> + @POST("/api/auth/resetpass") + fun resetpass(@Body obj:ResetPass):Call<ResponseBody> + @GET("/api/post") + fun getPosts(@Header("Authorization") authHeader:String):Call<MutableList<PostPreview>> + @POST("/api/Location/add") + fun addLocation(@Header("Authorization") authHeader:String,@Body obj: Location ):Call<Location> + @Multipart + @POST("/api/Post/add") + fun addPost(@Header("Authorization") authHeader:String, @Part images: Array<MultipartBody.Part?>? + ,@Part("_id") _id:RequestBody + ,@Part("description") description:RequestBody + ,@Part("locationId") locationId:RequestBody + ):Call<PostPreview> + + //@POST("putanja") + //fun add(@Body obj:Post,@Header("Authorization") authHeader:String):Call<Post> +}
\ 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..0c43088 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,16 @@ 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 com.example.brzodolokacije.Services.authCheck +import retrofit2.Call +import retrofit2.Response class MainActivity : AppCompatActivity() { @@ -17,13 +23,15 @@ 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) startActivity(intent) + finish() } fun checkLoggedIn():Boolean{ @@ -33,10 +41,41 @@ class MainActivity : AppCompatActivity() { var jwt:JWT=JWT(jwtString) if(jwt.isExpired(30)) return false + refreshJwt(jwtString) return true } + + fun refreshJwt(token:String){ + if(token==null) + return + var refreshJwt= RetrofitHelper.getInstance().refreshJwt("Bearer "+token) + refreshJwt.enqueue(object : retrofit2.Callback<String?> { + override fun onResponse(call: Call<String?>, response: Response<String?>) { + 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<String?>, t: Throwable) { + Toast.makeText( + applicationContext, t.toString(), Toast.LENGTH_LONG + ).show(); + } + }) + + + } }
\ 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 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..c5fe48a --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Location.kt @@ -0,0 +1,16 @@ +package com.example.brzodolokacije.Models + +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize + +@Parcelize +data class Location ( + var _id:String, + var name:String, + var city:String, + var country:String, + var address:String, + var latitude:Double, + var longitude:Double, + var type:LocationType? +): Parcelable 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..9b9afaa 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,52 @@ package com.example.brzodolokacije.Models -import java.util.* +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize +import okhttp3.MultipartBody +import java.time.LocalDateTime 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<String>, + var reports:List<String>, + var ratings:List<Rating>, + var comments:List<Comment>, + var images:List<PostImage> + + + ) +data class PostSend( + var _id:String, + var locationId:String, + var description:String, + var images: List<MultipartBody.Part> + +) +@Parcelize +data class PostPreview ( + var _id:String, + var ownerId:String, + var location:Location, + var description:String, + var views:Int, + var ratings:Float, + var comments:List<Comment>?, + var images:List<PostImage> +):Parcelable + + +@Parcelize +data class Comment ( + var userId:String, + var comment:String, + var parent:Comment, + var timeStamp: LocalDateTime +):Parcelable + +data class Rating( + var useridval :String, + var rating:Int +)
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/PostImage.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/PostImage.kt new file mode 100644 index 0000000..93326b3 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/PostImage.kt @@ -0,0 +1,10 @@ +package com.example.brzodolokacije.Models + +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize + +@Parcelize +data class PostImage ( + var _id:String, + var path:String + ): Parcelable
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/MyAppGlideModule.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/MyAppGlideModule.kt new file mode 100644 index 0000000..cee5f12 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/MyAppGlideModule.kt @@ -0,0 +1,8 @@ +package com.example.brzodolokacije.Services + +import com.bumptech.glide.annotation.GlideModule +import com.bumptech.glide.module.AppGlideModule +@GlideModule +class MyAppGlideModule: AppGlideModule() { + +}
\ 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 cc7eb56..afe93c9 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.IBackendApi 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: IBackendApi? = null + private var retrofit_auth: IBackendApi? = null + + fun getInstance():IBackendApi{ + if(retrofit_noauth==null) + retrofit_noauth= createInstance() + return retrofit_noauth as IBackendApi + } + private fun createInstance():IBackendApi{ val gson = GsonBuilder() .setLenient() .create() return Retrofit.Builder().baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create(gson)) - .build() + .build().create(IBackendApi::class.java) + } } //Usage diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/authCheck.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/authCheck.kt new file mode 100644 index 0000000..bfd3975 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/authCheck.kt @@ -0,0 +1,31 @@ +package com.example.brzodolokacije.Services + +import android.app.Activity +import androidx.fragment.app.FragmentActivity +import com.auth0.android.jwt.JWT + +object authCheck { + + + + fun isLoggedIn(act:Activity):Boolean{ + var jwtString=SharedPreferencesHelper.getValue("jwt",act) + if(jwtString==null) + return false + var jwt: JWT = JWT(jwtString) + if(jwt.isExpired(30)) + return false + return true + + } + fun isLoggedIn(act:FragmentActivity):Boolean{ + var jwtString=SharedPreferencesHelper.getValue("jwt",act) + if(jwtString==null) + return false + var jwt: JWT = JWT(jwtString) + if(jwt.isExpired(30)) + return false + return true + + } +}
\ 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 Binary files differnew file mode 100644 index 0000000..4342c2c --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/filter.png diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/grid.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/grid.png Binary files differnew file mode 100644 index 0000000..03d9ef9 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/grid.png diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_arrow_back.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_arrow_back.xml new file mode 100644 index 0000000..d9b7ee0 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_arrow_back.xml @@ -0,0 +1,5 @@ +<vector android:autoMirrored="true" android:height="24dp" + android:tint="#274352" android:viewportHeight="24" + android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="@android:color/white" android:pathData="M11.67,3.87L9.9,2.1 0,12l9.9,9.9 1.77,-1.77L3.54,12z"/> +</vector> diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_arrow_forward.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_arrow_forward.xml new file mode 100644 index 0000000..80b796f --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_arrow_forward.xml @@ -0,0 +1,5 @@ +<vector android:autoMirrored="true" android:height="24dp" + android:tint="#274352" android:viewportHeight="24" + android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="@android:color/white" android:pathData="M6.23,20.23l1.77,1.77l10,-10l-10,-10l-1.77,1.77l8.23,8.23z"/> +</vector> diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/list.webp b/Client/BrzoDoLokacije/app/src/main/res/drawable/list.webp Binary files differnew file mode 100644 index 0000000..608932f --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/list.webp 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..0a8e933 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/rounded_picture_background.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <corners android:radius="20dp"/> + <solid android:color="#FFFFFF"></solid> +<!-- <padding--> +<!-- android:left="10dp"--> +<!-- android:top="5dp"--> +<!-- android:right="10dp"--> +<!-- android:bottom="5dp" >--> + +<!-- </padding>--> +</shape> diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/sort.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/sort.png Binary files differnew file mode 100644 index 0000000..828cd01 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/sort.png diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_add_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_add_post.xml new file mode 100644 index 0000000..5af0c1f --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_add_post.xml @@ -0,0 +1,104 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".Activities.ActivityAddPost"> + + <ImageSwitcher + android:id="@+id/isActivityAddPostSwitcher" + android:layout_width="0dp" + android:layout_height="0dp" + app:layout_constraintBottom_toTopOf="@+id/btnActivityAddPostUploadFromGallery" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <Button + android:id="@+id/nextImage" + android:layout_width="78dp" + android:layout_height="499dp" + android:background="@drawable/rounded_transparent_button" + android:gravity="right" + android:padding="30dp" + app:icon="@drawable/ic_baseline_arrow_forward" + app:iconTint="#072242" + app:layout_constraintBottom_toBottomOf="@+id/isActivityAddPostSwitcher" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:ignore="SpeakableTextPresentCheck" /> + + <Button + android:id="@+id/previousImage" + android:layout_width="70dp" + android:layout_height="497dp" + + android:background="@drawable/rounded_transparent_button" + android:gravity="left" + android:padding="30dp" + app:icon="@drawable/ic_baseline_arrow_back" + app:iconTint="#0E283C" + app:layout_constraintBottom_toBottomOf="@+id/isActivityAddPostSwitcher" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:ignore="SpeakableTextPresentCheck" /> + + <Button + android:id="@+id/btnActivityAddPostUploadFromGallery" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Otvori galeriju" + app:layout_constraintBottom_toTopOf="@+id/tvActivityAddPostLocationtext" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" /> + + <TextView + android:id="@+id/tvActivityAddPostLocationtext" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Lokacija" + app:layout_constraintBottom_toTopOf="@+id/etActivityAddPostLocation" + app:layout_constraintEnd_toEndOf="parent" /> + + <EditText + android:id="@+id/etActivityAddPostLocation" + android:layout_width="match_parent" + android:layout_height="50dp" + android:ems="10" + android:hint="Reykjavik, Iceland" + android:inputType="textEmailAddress" + app:layout_constraintBottom_toTopOf="@+id/tvActivityAddPostDescriptiontext" + app:layout_constraintEnd_toEndOf="parent" /> + + <TextView + android:id="@+id/tvActivityAddPostDescriptiontext" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Opis" + app:layout_constraintBottom_toTopOf="@+id/etActivityAddPostDescription" + app:layout_constraintEnd_toEndOf="parent" /> + + <EditText + android:id="@+id/etActivityAddPostDescription" + android:layout_width="match_parent" + android:layout_height="50dp" + android:ems="10" + android:hint="Reykjavik, Iceland" + android:inputType="textEmailAddress" + app:layout_constraintBottom_toTopOf="@+id/btnActivityAddPostPost" + app:layout_constraintEnd_toEndOf="parent" /> + + <Button + android:id="@+id/btnActivityAddPostPost" + android:layout_width="200dp" + android:layout_height="40dp" + android:background="@drawable/rounded_cyan_button" + android:backgroundTint="#1C789A" + android:text="Objavi" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" /> + + +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_capture_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_capture_post.xml new file mode 100644 index 0000000..91517a7 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_capture_post.xml @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".Activities.ActivityCapturePost"> + + <ImageView + android:id="@+id/ivActivityCapturePostImage" + android:layout_width="408dp" + android:layout_height="319dp" + android:layout_marginTop="4dp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:srcCompat="@tools:sample/avatars" /> + + <Button + android:id="@+id/btnActivityCapturePostCapture" + android:layout_width="60dp" + android:layout_height="wrap_content" + android:layout_marginTop="68dp" + app:cornerRadius="30dp" + app:icon="@android:drawable/ic_menu_camera" + app:layout_constraintBottom_toTopOf="@+id/tvActivityCapturePostLocationtext" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.498" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/ivActivityCapturePostImage" /> + + <TextView + android:id="@+id/tvActivityCapturePostLocationtext" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="464dp" + android:text="Lokacija" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <EditText + android:id="@+id/etActivityCapturePostLocation" + android:layout_width="match_parent" + android:layout_height="50dp" + android:layout_marginTop="4dp" + android:ems="10" + android:hint="Reykjavik, Iceland" + android:inputType="textEmailAddress" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tvActivityCapturePostLocationtext" /> + + <TextView + android:id="@+id/tvActivityCapturePostDescriptiontext" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:text="Opis" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/etActivityCapturePostLocation" /> + + <EditText + android:id="@+id/etActivityCapturePostDescription" + android:layout_width="match_parent" + android:layout_height="50dp" + android:layout_marginTop="4dp" + android:ems="10" + android:hint="Reykjavik, Iceland" + android:inputType="textEmailAddress" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tvActivityCapturePostDescriptiontext" /> + + + <Button + android:id="@+id/btnActivityCapturePostPost" + android:layout_width="200dp" + android:layout_height="40dp" + android:background="@drawable/rounded_cyan_button" + android:backgroundTint="#1C789A" + android:text="Objavi" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintDimensionRatio="w,1:1" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.431" + app:layout_constraintStart_toStartOf="parent" /> + +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_login_register.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_login_register.xml index 0f82285..115fff5 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_login_register.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_login_register.xml @@ -16,40 +16,37 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="1.0" + app:layout_constraintVertical_bias="0.0" app:srcCompat="@drawable/gradient" /> <androidx.constraintlayout.widget.ConstraintLayout - android:background="@drawable/login_register_background_top_radius" - android:id="@+id/linearLayout" android:layout_width="0dp" - android:layout_height="65dp" + android:layout_height="wrap_content" android:layout_marginStart="50dp" + android:layout_marginTop="150dp" android:layout_marginEnd="50dp" - android:gravity="center|center_horizontal" + android:background="@drawable/login_register_background_top_radius" android:orientation="horizontal" - app:layout_constraintBottom_toTopOf="@+id/flFragmentActivityLRFragmentsView" + android:padding="20dp" app:layout_constraintEnd_toEndOf="@+id/imageView2" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="1.0"> + app:layout_constraintTop_toTopOf="@+id/imageView2"> <ImageView android:id="@+id/imageView5" - android:layout_width="280dp" + android:layout_width="250dp" android:layout_height="40dp" android:background="@drawable/rounded_white_button_login" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.37" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="1.0"></ImageView> + app:layout_constraintTop_toTopOf="parent"></ImageView> <android.widget.Button android:id="@+id/btnFragmentActivityLRLogin" - android:layout_width="139dp" + android:layout_width="120dp" android:layout_height="40dp" android:background="@drawable/rounded_cyan_button" android:elevation="25dp" @@ -59,19 +56,20 @@ android:textColor="@color/white" app:layout_constraintBottom_toBottomOf="@+id/imageView5" app:layout_constraintEnd_toStartOf="@+id/btnFragmentActivityLRRegister" - app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="@+id/imageView5" - app:layout_constraintTop_toTopOf="@+id/imageView5" /> + app:layout_constraintTop_toTopOf="@+id/imageView5" + app:layout_constraintVertical_bias="0.0" /> <android.widget.Button android:id="@+id/btnFragmentActivityLRRegister" - android:layout_width="140dp" + android:layout_width="120dp" android:layout_height="40dp" - android:textColor="#FF1C789A" android:background="@drawable/rounded_transparent_button" android:elevation="25dp" android:padding="0dp" android:text="Registruj se" + android:textColor="#FF1C789A" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="@+id/imageView5" app:layout_constraintTop_toTopOf="@+id/imageView5" @@ -87,12 +85,10 @@ android:layout_marginEnd="50dp" android:background="@drawable/login_register_background_bottom_radius" android:elevation="20dp" - android:foregroundGravity="center_vertical|center" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@+id/imageView2" - app:layout_constraintVertical_bias="0.411"> + app:layout_constraintTop_toBottomOf="@+id/linearLayout"> </FrameLayout> diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml new file mode 100644 index 0000000..00d3460 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" + tools:context=".Activities.ActivitySinglePost"> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/rvMain" + android:layout_width="match_parent" + android:layout_height="443dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + </androidx.recyclerview.widget.RecyclerView> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <TextView + android:id="@+id/tvTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Naslov" /> + + <TextView + android:id="@+id/tvLocationType" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="11dp" + android:text="tip lokacije" /> + + <TextView + android:id="@+id/tvLocationParent" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Drzava, grad" /> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <LinearLayout + android:layout_width="213dp" + android:layout_height="27dp" + android:orientation="horizontal"> + + <ImageView + android:id="@+id/star1" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:src="@android:drawable/btn_star_big_on" /> + + <ImageView + android:id="@+id/star2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:src="@android:drawable/btn_star_big_on" /> + + <ImageView + android:id="@+id/star3" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:src="@android:drawable/btn_star_big_on" /> + + <ImageView + android:id="@+id/star4" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:src="@android:drawable/btn_star_big_on" /> + + <ImageView + android:id="@+id/star5" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:src="@android:drawable/btn_star_big_on" /> + </LinearLayout> + + <TextView + android:id="@+id/tvRating" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:text="4.2" + app:layout_constraintEnd_toStartOf="@+id/textView10" + tools:layout_editor_absoluteY="0dp" /> + + <TextView + android:id="@+id/tvNumberOfRatings" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="(10,500)" + app:layout_constraintEnd_toEndOf="parent" + tools:layout_editor_absoluteY="0dp" /> + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="10dp" + android:padding="10dp" + android:background="@drawable/rounded_picture_background" + android:elevation="5dp"> + + <TextView + android:id="@+id/tvDescription" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="TextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextView" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.048" + app:layout_constraintStart_toStartOf="parent" + tools:layout_editor_absoluteY="4dp" /> + </androidx.constraintlayout.widget.ConstraintLayout> + </LinearLayout> + + +</LinearLayout>
\ 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..7035b22 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_splash_page.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + 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"> + + <ImageView + android:id="@+id/imageView6" + android:layout_width="match_parent" + android:layout_height="match_parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.0" + app:srcCompat="@drawable/gradient" /> + + <ImageView + android:id="@+id/imageView7" + android:layout_width="0dp" + android:layout_height="326dp" + android:layout_marginTop="70dp" + app:layout_constraintBottom_toTopOf="@+id/textView" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="1.0" + app:srcCompat="@mipmap/ic_launcher_foreground" /> + + <TextView + android:id="@+id/textView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="BRZO DO LOKACIJE" + android:textColor="#FFE4E2C9" + android:textSize="25dp" + app:layout_constraintBottom_toTopOf="@+id/textView3" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.613" /> + + <TextView + android:id="@+id/textView3" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="16dp" + android:text="by ODYSSEY" + android:textColor="#FFE4E2C9" + android:textSize="20dp" + app:layout_constraintBottom_toBottomOf="@+id/imageView6" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" /> +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/bottom_sheet_add_new.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/bottom_sheet_add_new.xml new file mode 100644 index 0000000..8f9700e --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/bottom_sheet_add_new.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/bottomSheetAddNewForNav" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <TextView + android:id="@+id/textView6" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Dodaj novu objavu" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <Button + android:id="@+id/btnBottomSheetAddNewOpenAddPost" + android:layout_width="165dp" + android:layout_height="88dp" + android:layout_marginStart="16dp" + android:layout_marginTop="8dp" + android:text="Izaberi fotografije iz galerije" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/textView6" + app:layout_constraintVertical_bias="1.0" /> + + <Button + android:id="@+id/btnBottomSheetAddNewOpenCapturePost" + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:text="Nova fotografija" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.862" + app:layout_constraintStart_toEndOf="@+id/btnBottomSheetAddNewOpenAddPost" + app:layout_constraintTop_toBottomOf="@+id/textView6" + app:layout_constraintVertical_bias="0.666" /> + + +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file 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 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".Fragments.FragmentAddLocation"> + + <!-- TODO: Update blank fragment layout --> + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/hello_blank_fragment" /> + +</FrameLayout>
\ 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..579afdb --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_new.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".Fragments.FragmentAddNew"> + + <!-- TODO: Update blank fragment layout --> + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" /> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <Button + android:id="@+id/btnFragmentAddNewNewLocation" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:backgroundTint="#FFFFFF" + android:stateListAnimator="@null" + android:text="Nova lokacija" + android:textColor="@color/cardview_dark_background" + app:layout_constraintBottom_toTopOf="@+id/flFragmentAddNewFragmentContainer" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/btnFragmentAddNewNewPost" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.997" /> + + <Button + android:id="@+id/btnFragmentAddNewNewPost" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:backgroundTint="#FFFFFF" + android:stateListAnimator="@null" + + android:text="Nova objava" + android:textColor="@color/cardview_dark_background" + app:layout_constraintBottom_toTopOf="@+id/flFragmentAddNewFragmentContainer" + app:layout_constraintEnd_toStartOf="@+id/btnFragmentAddNewNewLocation" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.997" /> + + <View + android:id="@+id/divider3" + android:layout_width="409dp" + android:layout_height="1dp" + android:background="?android:attr/listDivider" + app:layout_constraintBottom_toTopOf="@+id/flFragmentAddNewFragmentContainer" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/btnFragmentAddNewNewPost" + app:layout_constraintVertical_bias="1.0" /> + + <FrameLayout + android:id="@+id/flFragmentAddNewFragmentContainer" + android:layout_width="411dp" + android:layout_height="309dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent"> + + </FrameLayout> + + </androidx.constraintlayout.widget.ConstraintLayout> + + +</FrameLayout>
\ 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"> <!-- TODO: Update blank fragment layout --> + <TextView android:layout_width="match_parent" - android:layout_height="match_parent" - android:text="Post Add" /> + android:layout_height="20dp"/> + + + + <!-- <Button android:id="@+id/btnFragmentAddLogOut" @@ -18,6 +22,6 @@ android:layout_marginTop="40dp" android:background="@drawable/rounded_cyan_button" android:backgroundTint="#1C789A" - android:text="Log Out" /> + android:text="Log Out" />--> </FrameLayout>
\ 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 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".Fragments.FragmentAddRecension"> + + <!-- TODO: Update blank fragment layout --> + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" /> + +</FrameLayout>
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_my_profile_info.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_my_profile_info.xml index d20c569..4a91f49 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_my_profile_info.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_my_profile_info.xml @@ -1,14 +1,30 @@ <?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Fragments.FragmentMyProfileInfo"> <!-- TODO: Update blank fragment layout --> + <TextView + android:id="@+id/textView5" android:layout_width="match_parent" android:layout_height="match_parent" - android:text="Moji podaci" /> + android:text="Moji podaci" + tools:layout_editor_absoluteX="0dp" + tools:layout_editor_absoluteY="0dp" /> + + <Button + android:id="@+id/buttonLogOut" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Log out" + app:layout_constraintBottom_toBottomOf="@+id/textView5" + app:layout_constraintEnd_toEndOf="@+id/textView5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@+id/textView5" /> + -</FrameLayout>
\ No newline at end of file +</androidx.constraintlayout.widget.ConstraintLayout>
\ 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..02512d4 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_show_posts.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" + tools:context=".Fragments.FragmentShowPosts"> + + <EditText + android:id="@+id/editTextTextPersonName2" + android:layout_width="wrap_content" + android:layout_height="50dp" + android:layout_gravity="center_horizontal" + android:ems="10" + android:inputType="textPersonName" + android:text="Name" /> + + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="50dp"> + + + <ImageButton + android:id="@+id/button3" + android:layout_width="50dp" + android:layout_height="50dp" + android:layout_alignParentRight="true" + android:src="@drawable/filter" + android:scaleType="centerCrop" + android:background="@color/white"/> + + <ImageButton + android:id="@+id/imageButton1" + android:layout_width="50dp" + android:layout_height="50dp" + android:layout_marginStart="8dp" + android:layout_weight="1" + android:scaleType="centerCrop" + android:src="@drawable/sort" + app:layout_constraintStart_toEndOf="@+id/button3" + tools:layout_editor_absoluteY="0dp" + android:background="@color/white"/> + + <ImageButton + android:id="@+id/imageButton2" + android:layout_width="50dp" + android:layout_height="50dp" + android:layout_marginEnd="16dp" + android:layout_weight="1" + android:background="@color/white" + android:scaleType="centerCrop" + android:src="@drawable/list" + app:layout_constraintEnd_toStartOf="@+id/imageButton3" + app:layout_constraintHorizontal_bias="1.0" + app:layout_constraintStart_toEndOf="@+id/imageButton1" + tools:layout_editor_absoluteY="0dp" /> + + <ImageButton + android:id="@+id/imageButton3" + android:layout_width="50dp" + android:layout_height="50dp" + android:layout_marginStart="248dp" + android:layout_weight="1" + android:background="@color/white" + android:scaleType="centerCrop" + android:src="@drawable/grid" + app:layout_constraintStart_toEndOf="@+id/imageButton1" + tools:layout_editor_absoluteY="0dp" /> + </androidx.constraintlayout.widget.ConstraintLayout> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/rvMain" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" > + + </androidx.recyclerview.widget.RecyclerView> + +</LinearLayout>
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/post_image.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/post_image.xml new file mode 100644 index 0000000..c2a999d --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/post_image.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="380dp" + android:layout_height="wrap_content" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_margin="10dp" + android:background="@drawable/rounded_picture_background" + android:clipToOutline="true" + android:clickable="true"> + + <ImageView + android:id="@+id/locationImage" + android:layout_width="match_parent" + android:layout_height="420dp" + android:outlineProvider="background" + android:scaleType="centerCrop" + android:src="@drawable/b1" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.0" /> + + + +</androidx.constraintlayout.widget.ConstraintLayout>
\ 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..dafd3b9 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/post_preview.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_margin="0dp" + android:background="@drawable/rounded_picture_background" + android:clipToOutline="true" +> + + + <ImageView + android:id="@+id/locationImage" + android:layout_width="match_parent" + android:layout_height="250dp" + android:outlineProvider="background" + android:scaleType="centerCrop" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.0" /> + + <View + android:id="@+id/vBanner" + android:layout_width="match_parent" + android:layout_height="80dp" + android:background="@color/dark_blue_transparent" + android:outlineProvider="background" + app:layout_constraintBottom_toBottomOf="@+id/locationImage" + tools:layout_editor_absoluteX="10dp"> + + + </View> + + <TextView + android:id="@+id/tvTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="top|left" + android:text="Naslov" + android:textColor="@color/white" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.076" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@+id/vBanner" + app:layout_constraintVertical_bias="0.18" /> + + <TextView + android:id="@+id/tvLocationType" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Tip lokacije" + android:textColor="@color/white" + app:layout_constraintBottom_toBottomOf="@+id/vBanner" + app:layout_constraintEnd_toStartOf="@+id/tvLocationParent" + app:layout_constraintHorizontal_bias="0.112" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@+id/vBanner" + app:layout_constraintVertical_bias="0.721" /> + + <TextView + android:id="@+id/tvLocationParent" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:text="grad, drzava" + android:textAlignment="viewEnd" + android:textColor="@color/white" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.952" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@+id/vBanner" + app:layout_constraintVertical_bias="0.737" /> + +</androidx.constraintlayout.widget.ConstraintLayout>
\ 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 @@ +<resources> + <dimen name="fab_margin">48dp</dimen> + </resources>
\ 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 @@ +<resources> + <dimen name="fab_margin">200dp</dimen> + </resources>
\ 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 @@ +<resources> + <dimen name="fab_margin">48dp</dimen> + </resources>
\ 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 @@ <color name="teal_700">#FF018786</color> <color name="black">#FF000000</color> <color name="white">#FFFFFFFF</color> - + <color name="dark_blue_transparent">#DE093A4C</color> </resources>
\ 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 @@ +<resources> + <dimen name="fab_margin">16dp</dimen> + </resources>
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/values/themes.xml b/Client/BrzoDoLokacije/app/src/main/res/values/themes.xml index 6193009..0b453e2 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/values/themes.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/values/themes.xml @@ -1,5 +1,5 @@ <resources xmlns:tools="http://schemas.android.com/tools"> - <style name="Theme.BrzoDoLokacije" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> + <style name="Theme.BrzoDoLokacije" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <item name="colorPrimary">@color/purple_500</item> <item name="colorPrimaryVariant">@color/purple_700</item> diff --git a/Client/BrzoDoLokacije/app/src/main/res/xml/file_paths.xml b/Client/BrzoDoLokacije/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..3d98544 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<paths xmlns:android="http://schemas.android.com/apk/res/android"> + <external-files-path name="my_images" path="Pictures" /> +</paths>
\ No newline at end of file |