From 859f5b3951e0ae9034e873cfe0a5ea375aa26e48 Mon Sep 17 00:00:00 2001 From: Jelena Petrovic Date: Tue, 15 Nov 2022 23:52:53 +0100 Subject: prepravljena defaultna vrednost broja komentara #31 --- Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml index 7c1f8bc..a8a03aa 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml @@ -277,7 +277,7 @@ android:layout_height="wrap_content" android:padding="@dimen/text_padding" app:layout_constraintTop_toBottomOf="@id/postCommentLayout" - android:text="3" + android:text="0" app:layout_constraintStart_toEndOf="@id/tvCommentLabel" /> Date: Wed, 16 Nov 2022 00:04:27 +0100 Subject: Sada se menja ocena objave odmah nakon ocenjivanja, bez refresha #30 --- .../java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt index ea82cda..c030eda 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt @@ -19,6 +19,7 @@ import okhttp3.ResponseBody import okhttp3.internal.notifyAll import retrofit2.Call import retrofit2.Response +import kotlin.math.roundToInt class ActivitySinglePost : AppCompatActivity() { @@ -192,6 +193,9 @@ class ActivitySinglePost : AppCompatActivity() { request.enqueue(object : retrofit2.Callback { override fun onResponse(call: Call, response: Response) { if(response.isSuccessful){ + //zasad hardkodovano, zameniti te vrednosti sa brojem ocena kada se doda + post.ratings=((post.ratings)*10+rating.rating)/11 + binding.tvRating.text=String.format("%.2f",post.ratings) Toast.makeText( this@ActivitySinglePost, "prosao zahtev", Toast.LENGTH_LONG ).show() -- cgit v1.2.3 From e8e7d6f9b3ca17cb79cf7f2936f248f2ce59fba9 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Wed, 16 Nov 2022 21:58:32 +0100 Subject: Dodati modeli za message, napravljen message service. Napravljen ChatHub(SignalR) servis, omoguceno cuvanje sesija clienata pri konekciji. --- Backend/Api/Api/Controllers/UserController.cs | 9 ++++ Backend/Api/Api/Database/DatabaseConnection.cs | 1 + Backend/Api/Api/Interfaces/IDatabaseConnection.cs | 1 + Backend/Api/Api/Models/Message.cs | 27 ++++++++++ Backend/Api/Api/Services/ChatHub.cs | 59 ++++++++++++++++++++++ Backend/Api/Api/Services/MessageService.cs | 61 +++++++++++++++++++++++ Backend/Api/Api/appsettings.json | 3 +- 7 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 Backend/Api/Api/Models/Message.cs create mode 100644 Backend/Api/Api/Services/ChatHub.cs create mode 100644 Backend/Api/Api/Services/MessageService.cs diff --git a/Backend/Api/Api/Controllers/UserController.cs b/Backend/Api/Api/Controllers/UserController.cs index 1ef8234..94e4b41 100644 --- a/Backend/Api/Api/Controllers/UserController.cs +++ b/Backend/Api/Api/Controllers/UserController.cs @@ -55,5 +55,14 @@ namespace Api.Controllers return Ok(rez); return BadRequest(); } + [HttpGet("{id}/profile")] + [Authorize(Roles = "User")] + public async Task> GetUserById(string id) + { + var rez = await _userService.getUserById(id); + if (rez != null) + return Ok(rez); + return BadRequest(); + } } } diff --git a/Backend/Api/Api/Database/DatabaseConnection.cs b/Backend/Api/Api/Database/DatabaseConnection.cs index f26b88e..eaf047a 100644 --- a/Backend/Api/Api/Database/DatabaseConnection.cs +++ b/Backend/Api/Api/Database/DatabaseConnection.cs @@ -10,5 +10,6 @@ namespace Api.Database public string PostCollectionName { get; set; } = String.Empty; public string FileCollectionName { get; set; } = String.Empty; public string LocationCollectionName { get; set; } = String.Empty; + public string MessageCollectionname { get; set; }= String.Empty; } } diff --git a/Backend/Api/Api/Interfaces/IDatabaseConnection.cs b/Backend/Api/Api/Interfaces/IDatabaseConnection.cs index 17b5262..a8fec9a 100644 --- a/Backend/Api/Api/Interfaces/IDatabaseConnection.cs +++ b/Backend/Api/Api/Interfaces/IDatabaseConnection.cs @@ -8,5 +8,6 @@ string PostCollectionName { get; set; } string FileCollectionName { get; set; } string LocationCollectionName { get; set; } + string MessageCollectionname { get; set; } } } diff --git a/Backend/Api/Api/Models/Message.cs b/Backend/Api/Api/Models/Message.cs new file mode 100644 index 0000000..d3b6785 --- /dev/null +++ b/Backend/Api/Api/Models/Message.cs @@ -0,0 +1,27 @@ +using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Bson; + +namespace Api.Models +{ + public class Message + { + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public String _id { get; set; } + public String senderId { get; set; } + public String receiverId { get; set; } + public String messagge { get; set; } + public DateTime timestamp { get; set; } + } + public class MessageSend + { + public String senderId { get; set; } + public String messagge { get; set; } + public DateTime timestamp { get; set; } + } + public class MessageReceive + { + public String receiverId { get; set; } + public String messagge { get; set; } + } +} diff --git a/Backend/Api/Api/Services/ChatHub.cs b/Backend/Api/Api/Services/ChatHub.cs new file mode 100644 index 0000000..c196065 --- /dev/null +++ b/Backend/Api/Api/Services/ChatHub.cs @@ -0,0 +1,59 @@ +using Microsoft.AspNetCore.SignalR; + +namespace Api.Services +{ + public class ChatHub:Hub + { + static public readonly Dictionary Users = new Dictionary(); + private readonly JwtService _jwtService; + public ChatHub(JwtService jwtService) + { + _jwtService = jwtService; + } + public override async Task OnConnectedAsync() + { + string token = Context.GetHttpContext().Request.Query["access_token"]; + if (token == null) + return; + string id = _jwtService.TokenToId(token); + if (id == null) + return; + Users.Add(Context.ConnectionId, id); + //await SendDirect(id, "poruka"); + //await Send(Context.ConnectionId); + await base.OnConnectedAsync(); + + } + public override async Task OnDisconnectedAsync(Exception? exception) + { + Users.Remove(Context.ConnectionId); + } + public static List getAllConnectionsOfUser(string id) + { + List keys = new List(); + foreach (var user in Users) + { + if (user.Value == id) + keys.Add(user.Key); + } + return keys; + } + } +} +//private readonly IHubContext _ichat; +//await _ichat.Clients.Client(connection).SendAsync("Message",); + +//Message +//SenderId +//meesage +//date + +//Message +//ReceiveId +//meesage + + +//Oba korisnika online poruka se salje preko kontrolera, a stize preko socketa +//Online salje offline poruka se salje preko kontrolera,cuva se u bazi +//Korisnik koji ima poruke a bio je offline salje zahtev kontroleru za preuzimanje poruka +///chatHub \ No newline at end of file diff --git a/Backend/Api/Api/Services/MessageService.cs b/Backend/Api/Api/Services/MessageService.cs new file mode 100644 index 0000000..0772b48 --- /dev/null +++ b/Backend/Api/Api/Services/MessageService.cs @@ -0,0 +1,61 @@ +using System.Security.Claims; +using Api.Interfaces; +using Api.Models; +using MongoDB.Driver; + +namespace Api.Services +{ + public class MessageService + { + private readonly IHttpContextAccessor _httpContext; + private readonly IMongoCollection _messages; + private readonly IJwtService _jwtService; + private IConfiguration _configuration; + private readonly IFileService _fileService; + public MessageService(IDatabaseConnection settings, IMongoClient mongoClient, IJwtService jwtService, IHttpContextAccessor httpContextAccessor, IConfiguration configuration) + { + var database = mongoClient.GetDatabase(settings.DatabaseName); + _messages= database.GetCollection(settings.UserCollectionName); + _jwtService = jwtService; + } + public async Task addMessage(MessageReceive msg) + { + var senderId = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); + if (senderId == null) + return null; + var tempMsg = new Message(); + tempMsg._id = ""; + tempMsg.receiverId = msg.receiverId; + tempMsg.senderId = senderId; + tempMsg.messagge = msg.messagge; + tempMsg.timestamp= DateTime.Now.ToUniversalTime(); + + await _messages.InsertOneAsync(tempMsg); + + return tempMsg; + } + public MessageSend messageToMessageSend(Message msg) + { + var tempMsg=new MessageSend(); + tempMsg.senderId = msg.senderId; + tempMsg.messagge=msg.messagge; + tempMsg.timestamp = msg.timestamp; + return tempMsg; + } + public async Task> getReceiverMessage() + { + var receiverId = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); + if (receiverId == null) + return null; + var messages = await _messages.Find(msg => msg.receiverId == receiverId).ToListAsync(); + var tempMessages = new List(); + foreach (var message in messages) + { + tempMessages.Add(messageToMessageSend(message)); + _messages.DeleteOne(msg=>msg._id==message._id); + } + return tempMessages; + } + + } +} diff --git a/Backend/Api/Api/appsettings.json b/Backend/Api/Api/appsettings.json index a3ef323..7dbaa6a 100644 --- a/Backend/Api/Api/appsettings.json +++ b/Backend/Api/Api/appsettings.json @@ -21,7 +21,8 @@ "UserCollectionName": "users", "PostCollectionName": "posts", "FileCollectionName": "files", - "LocationCollectionname": "locations" + "LocationCollectionname": "locations", + "MessageCollectionname": "messages" }, "EmailCfg": { -- cgit v1.2.3 From b221f3dd432c8666d522817a63064c6f9193a637 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Wed, 16 Nov 2022 22:16:40 +0100 Subject: Napravljen controller za dodavanje poruka i vracanje primljenih poruka u slicaju da smo offline. Fixed typo --- Backend/Api/Api/Controllers/MessageController.cs | 44 ++++++++++++++++++++++++ Backend/Api/Api/Interfaces/IMessageService.cs | 11 ++++++ Backend/Api/Api/Program.cs | 1 + Backend/Api/Api/Services/MessageService.cs | 18 ++++++---- 4 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 Backend/Api/Api/Controllers/MessageController.cs create mode 100644 Backend/Api/Api/Interfaces/IMessageService.cs diff --git a/Backend/Api/Api/Controllers/MessageController.cs b/Backend/Api/Api/Controllers/MessageController.cs new file mode 100644 index 0000000..63351d0 --- /dev/null +++ b/Backend/Api/Api/Controllers/MessageController.cs @@ -0,0 +1,44 @@ +using System.Data; +using Api.Interfaces; +using Api.Models; +using Api.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace Api.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class MessageController : ControllerBase + { + + private readonly IJwtService _jwtService; + private readonly IMessageService _messageService; + public MessageController( IJwtService jwtService,IMessageService messageService) + { + + _jwtService = jwtService; + _messageService = messageService; + + } + [HttpPost("add")] + [Authorize(Roles = "User")] + public async Task> addMessage([FromBody] MessageReceive msg) + { + var msgTemp = await _messageService.addMessage(msg); + if(msgTemp == null) + return BadRequest(); + return Ok(msgTemp); + } + [HttpGet("myMessages")] + [Authorize(Roles = "User")] + public async Task>> getMyMessages() + { + var msgTemp = await _messageService.getReceiverMessage(); + if (msgTemp == null) + return BadRequest(); + return Ok(msgTemp); + } + } +} diff --git a/Backend/Api/Api/Interfaces/IMessageService.cs b/Backend/Api/Api/Interfaces/IMessageService.cs new file mode 100644 index 0000000..712b344 --- /dev/null +++ b/Backend/Api/Api/Interfaces/IMessageService.cs @@ -0,0 +1,11 @@ +using Api.Models; + +namespace Api.Interfaces +{ + public interface IMessageService + { + Task addMessage(MessageReceive msg); + Task> getReceiverMessage(); + MessageSend messageToMessageSend(Message msg); + } +} \ No newline at end of file diff --git a/Backend/Api/Api/Program.cs b/Backend/Api/Api/Program.cs index 7d6b03e..280a9dd 100644 --- a/Backend/Api/Api/Program.cs +++ b/Backend/Api/Api/Program.cs @@ -27,6 +27,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddHttpContextAccessor(); diff --git a/Backend/Api/Api/Services/MessageService.cs b/Backend/Api/Api/Services/MessageService.cs index 0772b48..0e48285 100644 --- a/Backend/Api/Api/Services/MessageService.cs +++ b/Backend/Api/Api/Services/MessageService.cs @@ -5,7 +5,7 @@ using MongoDB.Driver; namespace Api.Services { - public class MessageService + public class MessageService : IMessageService { private readonly IHttpContextAccessor _httpContext; private readonly IMongoCollection _messages; @@ -15,11 +15,15 @@ namespace Api.Services public MessageService(IDatabaseConnection settings, IMongoClient mongoClient, IJwtService jwtService, IHttpContextAccessor httpContextAccessor, IConfiguration configuration) { var database = mongoClient.GetDatabase(settings.DatabaseName); - _messages= database.GetCollection(settings.UserCollectionName); + _messages = database.GetCollection(settings.MessageCollectionname); _jwtService = jwtService; + _httpContext = httpContextAccessor; + _configuration = configuration; } public async Task addMessage(MessageReceive msg) { + if (_httpContext.HttpContext.User.FindFirstValue("id") == null) + return null; var senderId = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); if (senderId == null) return null; @@ -28,17 +32,19 @@ namespace Api.Services tempMsg.receiverId = msg.receiverId; tempMsg.senderId = senderId; tempMsg.messagge = msg.messagge; - tempMsg.timestamp= DateTime.Now.ToUniversalTime(); + tempMsg.timestamp = DateTime.Now.ToUniversalTime(); + + //TODO if user online send thru socket await _messages.InsertOneAsync(tempMsg); return tempMsg; } public MessageSend messageToMessageSend(Message msg) { - var tempMsg=new MessageSend(); + var tempMsg = new MessageSend(); tempMsg.senderId = msg.senderId; - tempMsg.messagge=msg.messagge; + tempMsg.messagge = msg.messagge; tempMsg.timestamp = msg.timestamp; return tempMsg; } @@ -52,7 +58,7 @@ namespace Api.Services foreach (var message in messages) { tempMessages.Add(messageToMessageSend(message)); - _messages.DeleteOne(msg=>msg._id==message._id); + _messages.DeleteOne(msg => msg._id == message._id); } return tempMessages; } -- cgit v1.2.3 From d1838298af4a0c91509ebafa194de2b3805f6210 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Wed, 16 Nov 2022 22:22:37 +0100 Subject: Aktiviran websocket servis. --- Backend/Api/Api/Program.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Backend/Api/Api/Program.cs b/Backend/Api/Api/Program.cs index 280a9dd..8d22f2b 100644 --- a/Backend/Api/Api/Program.cs +++ b/Backend/Api/Api/Program.cs @@ -65,6 +65,10 @@ builder.Services.AddSwaggerGen(options => { options.OperationFilter(); }); + +builder.Services.AddSignalR(); + + builder.Services.AddCors(options => { options.AddPolicy("CorsPolicy", @@ -85,11 +89,20 @@ if (app.Environment.IsDevelopment()) app.UseSwaggerUI(); } +app.UseWebSockets(new WebSocketOptions +{ + KeepAliveInterval = TimeSpan.FromSeconds(120) +}); //Add Authentication +app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); -app.MapControllers(); +app.UseEndpoints(endpoints => +{ + endpoints.MapControllers(); + endpoints.MapHub("/chatHub"); +}); app.Run(); -- cgit v1.2.3 From d49c17b695f131f9faf2e419e163df80dde37a88 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 17 Nov 2022 21:28:43 +0100 Subject: Omoguceno ukoliko je korisnik ulogovan da mu se poruka salje preko socketa, ukoliko nije ulogovan poruke se cuvaju u bazi. --- Backend/Api/Api/Controllers/MessageController.cs | 2 +- Backend/Api/Api/Services/ChatHub.cs | 12 ++++++++++++ Backend/Api/Api/Services/MessageService.cs | 21 +++++++++++++++++---- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Backend/Api/Api/Controllers/MessageController.cs b/Backend/Api/Api/Controllers/MessageController.cs index 63351d0..750fc5f 100644 --- a/Backend/Api/Api/Controllers/MessageController.cs +++ b/Backend/Api/Api/Controllers/MessageController.cs @@ -24,7 +24,7 @@ namespace Api.Controllers } [HttpPost("add")] [Authorize(Roles = "User")] - public async Task> addMessage([FromBody] MessageReceive msg) + public async Task> addMessage([FromBody] MessageReceive msg) { var msgTemp = await _messageService.addMessage(msg); if(msgTemp == null) diff --git a/Backend/Api/Api/Services/ChatHub.cs b/Backend/Api/Api/Services/ChatHub.cs index c196065..4092d8f 100644 --- a/Backend/Api/Api/Services/ChatHub.cs +++ b/Backend/Api/Api/Services/ChatHub.cs @@ -19,6 +19,7 @@ namespace Api.Services if (id == null) return; Users.Add(Context.ConnectionId, id); + //await SendDirect(id, "poruka"); //await Send(Context.ConnectionId); await base.OnConnectedAsync(); @@ -38,6 +39,17 @@ namespace Api.Services } return keys; } + public static bool CheckUser(string id) + { + var users = Users.Values; + foreach (var user in users) + { + if (user == id) + return true; + } + return false; + } + } } //private readonly IHubContext _ichat; diff --git a/Backend/Api/Api/Services/MessageService.cs b/Backend/Api/Api/Services/MessageService.cs index 0e48285..9cc818b 100644 --- a/Backend/Api/Api/Services/MessageService.cs +++ b/Backend/Api/Api/Services/MessageService.cs @@ -1,6 +1,7 @@ using System.Security.Claims; using Api.Interfaces; using Api.Models; +using Microsoft.AspNetCore.SignalR; using MongoDB.Driver; namespace Api.Services @@ -11,14 +12,15 @@ namespace Api.Services private readonly IMongoCollection _messages; private readonly IJwtService _jwtService; private IConfiguration _configuration; - private readonly IFileService _fileService; - public MessageService(IDatabaseConnection settings, IMongoClient mongoClient, IJwtService jwtService, IHttpContextAccessor httpContextAccessor, IConfiguration configuration) + private readonly IHubContext _chatHub; + public MessageService(IDatabaseConnection settings, IMongoClient mongoClient, IJwtService jwtService, IHttpContextAccessor httpContextAccessor, IConfiguration configuration,IHubContext chatHub) { var database = mongoClient.GetDatabase(settings.DatabaseName); _messages = database.GetCollection(settings.MessageCollectionname); _jwtService = jwtService; _httpContext = httpContextAccessor; _configuration = configuration; + _chatHub = chatHub; } public async Task addMessage(MessageReceive msg) { @@ -33,10 +35,21 @@ namespace Api.Services tempMsg.senderId = senderId; tempMsg.messagge = msg.messagge; tempMsg.timestamp = DateTime.Now.ToUniversalTime(); + if (ChatHub.CheckUser(msg.receiverId)) + { + //user online + var temp =messageToMessageSend(tempMsg); + foreach (var connection in ChatHub.getAllConnectionsOfUser(msg.receiverId)) + await _chatHub.Clients.Client(connection).SendAsync("Message",temp); + } + else + { + //user offline + await _messages.InsertOneAsync(tempMsg); - //TODO if user online send thru socket - await _messages.InsertOneAsync(tempMsg); + } + return tempMsg; } -- cgit v1.2.3 From c6c49607b0c04f3acad0273b83a9fc449b9c5d29 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Fri, 18 Nov 2022 00:45:51 +0100 Subject: Dodat fragment za profil korisnika. --- .../Fragments/FragmentUserProfile.kt | 60 +++++ .../src/main/res/layout/fragment_user_profile.xml | 285 +++++++++++++++++++++ 2 files changed, 345 insertions(+) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserProfile.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_profile.xml diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserProfile.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserProfile.kt new file mode 100644 index 0000000..8ab5276 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserProfile.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 [FragmentUserProfile.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentUserProfile : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_user_profile, 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 FragmentUserProfile. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentUserProfile().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_profile.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_profile.xml new file mode 100644 index 0000000..95516f0 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_profile.xml @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +