diff options
Diffstat (limited to 'Client')
12 files changed, 194 insertions, 7 deletions
diff --git a/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml b/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml index 883083b..0d90ad1 100644 --- a/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml +++ b/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml @@ -7,11 +7,15 @@ <deviceKey> <Key> <type value="VIRTUAL_DEVICE_PATH" /> - <value value="C:\Users\TAMARA\.android\avd\Pixel_3a_XL_API_33.avd" /> + <value value="C:\Users\PC\.android\avd\Pixel_6_API_33.avd" /> </Key> </deviceKey> </Target> </targetSelectedWithDropDown> +<<<<<<< HEAD + <timeTargetWasSelectedWithDropDown value="2022-12-05T15:17:54.592850800Z" /> +======= <timeTargetWasSelectedWithDropDown value="2022-12-06T03:10:09.596363200Z" /> +>>>>>>> 8e563f959c168a9778658c5fa2a2b143730d44fa </component> </project>
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/build.gradle b/Client/BrzoDoLokacije/app/build.gradle index f81ba4b..cae3d80 100644 --- a/Client/BrzoDoLokacije/app/build.gradle +++ b/Client/BrzoDoLokacije/app/build.gradle @@ -7,12 +7,12 @@ plugins { android { namespace 'com.example.brzodolokacije' - compileSdk 32 + compileSdk 33 defaultConfig { applicationId "com.example.brzodolokacije" minSdk 21 - targetSdk 32 + targetSdk 33 versionCode 1 versionName "1.0" diff --git a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml index 6cbdfbc..a059c5b 100644 --- a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml +++ b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ <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.POST_NOTIFICATIONS"/> <uses-permission android:name="android.permission.CAMERA" android:required="true" diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivity.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivity.kt index 14a4ba5..efbfd7a 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivity.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivity.kt @@ -1,10 +1,17 @@ package com.example.brzodolokacije.Activities +import android.Manifest +import android.app.AlertDialog import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build import android.os.Bundle import android.widget.ImageButton import android.widget.Toast +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout @@ -24,8 +31,10 @@ import retrofit2.Callback import retrofit2.Response import java.util.* + class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener { + private lateinit var permissionLauncher: ActivityResultLauncher<String> private var dbConnection:DBHelper?=null lateinit var binding: ActivityChatBinding var ws:SignalRListener?=null @@ -39,6 +48,41 @@ class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding= ActivityChatBinding.inflate(layoutInflater) + permissionLauncher=registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted: Boolean -> + if (!isGranted) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (Build.VERSION.SDK_INT >= 33) { + //ako je upravo odbijena dozvola na uredjaju na kome je ona neophodna + binding.btnNotifications.setImageResource(R.drawable.bell_off) + } + else{ + //ako je upravo odbijena dozvola na uredjaju na kome nije ona neophodna + binding.btnNotifications.setImageResource(R.drawable.bell_on) + } + } + else{ + //ako je upravo odbijena dozvola na uredjaju na kome nije ona neophodna + binding.btnNotifications.setImageResource(R.drawable.bell_on) + } + } + else{ + //ako je upravo prihvacena dozvola na uredjaju na kome nije ona neophodna + binding.btnNotifications.setImageResource(R.drawable.bell_on) + } + } + //provera da li je dozvoljeno + when { + ContextCompat.checkSelfPermission(this,Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED -> { + binding.btnNotifications.setImageResource(R.drawable.bell_on) + } + else -> { + binding.btnNotifications.setImageResource(R.drawable.bell_off) + } + } + + setContentView(binding.root) dbConnection= DBHelper(this@ChatActivity,null) ws=SignalRListener.getInstance(this@ChatActivity) @@ -59,6 +103,21 @@ class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener { }) } + + fun launchNotificationPermissionPrompt(){ + permissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS) + } + + fun launchInfoDialog(){ + val alertDialog: AlertDialog = AlertDialog.Builder(this@ChatActivity).create() + alertDialog.setTitle("Obaveštenje") + alertDialog.setMessage("Potrebno je restartovati aplikaciju da bi se sačuvale promene.") + alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK" + ) { dialog, _ -> dialog.dismiss() } + alertDialog.show() + } + + fun setListeners(){ findViewById<ImageButton>(R.id.addNewMessage).setOnClickListener { val intent: Intent = Intent(this@ChatActivity,ChatActivityConversation::class.java) @@ -68,6 +127,19 @@ class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener { findViewById<ImageButton>(R.id.btnBack).setOnClickListener { finish() } + findViewById<ImageButton>(R.id.btnNotifications).setOnClickListener { + when { + ContextCompat.checkSelfPermission(this,Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + revokeSelfPermissionOnKill(Manifest.permission.POST_NOTIFICATIONS) + } + launchInfoDialog() + } + else -> { + launchNotificationPermissionPrompt() + } + } + } } fun requestForChats(){ diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentSinglePostComments.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentSinglePostComments.kt index 046bdf6..f2b11ab 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentSinglePostComments.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/FragmentSinglePostComments.kt @@ -1,10 +1,10 @@ package com.example.brzodolokacije import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.fragment.app.Fragment // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 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 b3183b8..acce7b3 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt @@ -9,6 +9,7 @@ import com.example.brzodolokacije.Activities.ActivityLoginRegister import com.example.brzodolokacije.Activities.NavigationActivity import com.example.brzodolokacije.Services.RetrofitHelper import com.example.brzodolokacije.Services.SharedPreferencesHelper +import com.example.brzodolokacije.chat.Notifications import retrofit2.Call import retrofit2.Response @@ -22,6 +23,7 @@ class MainActivity : AppCompatActivity() { val intent:Intent if(checkLoggedIn()) { + Notifications.makeChannel(this) intent = Intent(this, NavigationActivity::class.java) } else diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/Notifications.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/Notifications.kt new file mode 100644 index 0000000..8a5add8 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/Notifications.kt @@ -0,0 +1,28 @@ +package com.example.brzodolokacije.chat + +import android.app.Activity +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context.NOTIFICATION_SERVICE +import android.os.Build +import com.example.brzodolokacije.R + +class Notifications { + companion object{ + val CHANNEL_ID="channel_1" + fun makeChannel(activity:Activity){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + // Create the NotificationChannel + val name = activity.getString(R.string.channel_name) + val descriptionText = activity.getString(R.string.channel_description) + val importance = NotificationManager.IMPORTANCE_DEFAULT + val mChannel = NotificationChannel(CHANNEL_ID, name, importance) + mChannel.description = descriptionText + // Register the channel with the system; you can't change the importance + // or other notification behaviors after this + val notificationManager = activity.getSystemService(NOTIFICATION_SERVICE) as NotificationManager + notificationManager.createNotificationChannel(mChannel) + } + } + } +}
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt index 39689c7..627d7c0 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt @@ -1,24 +1,35 @@ package com.example.brzodolokacije.chat +import android.Manifest import android.app.Activity +import android.content.pm.PackageManager +import android.graphics.Color import android.util.Log import android.widget.Toast +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import androidx.core.content.ContextCompat import com.auth0.android.jwt.JWT import com.exam.DBHelper import com.example.brzodolokacije.Activities.ChatActivity import com.example.brzodolokacije.Models.Message import com.example.brzodolokacije.Models.MessageReceive +import com.example.brzodolokacije.Models.UserReceive +import com.example.brzodolokacije.R import com.example.brzodolokacije.Services.RetrofitHelper import com.example.brzodolokacije.Services.SharedPreferencesHelper import com.microsoft.signalr.Action1 import com.microsoft.signalr.HubConnection import com.microsoft.signalr.HubConnectionBuilder import com.microsoft.signalr.HubConnectionState +import retrofit2.Call +import retrofit2.Response import java.util.* +import java.util.concurrent.atomic.AtomicInteger class SignalRListener private constructor(val activity: Activity){ - public var hubConnection:HubConnection + var hubConnection:HubConnection private var dbHelper:DBHelper init{ dbHelper= DBHelper.getInstance(activity) @@ -73,7 +84,71 @@ class SignalRListener private constructor(val activity: Activity){ } activity.requestNewMessages() } + when { + ContextCompat.checkSelfPermission(activity, + Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED -> { + //poslati notifikaciju + var api=RetrofitHelper.getInstance() + var token=SharedPreferencesHelper.getValue("jwt",activity) + val request2=api?.getProfileFromId("Bearer "+token, + message.senderId + ) + request2?.enqueue(object : retrofit2.Callback<UserReceive?> { + override fun onResponse(call: Call<UserReceive?>, response: Response<UserReceive?>) { + if(response.isSuccessful()){ + var user=response.body()!! + createNotification(message,user,activity) + } + } + + override fun onFailure(call: Call<UserReceive?>, t: Throwable) { + //TODO("Not yet implemented") + } + }) + } + } + + } + + fun createNotification(message: MessageReceive,user: UserReceive,activity: Activity){ + val notificationBuilder = NotificationCompat.Builder(activity, Notifications.CHANNEL_ID) + .setSmallIcon(R.drawable.ic_round_chat_24) + .setAutoCancel(true) + .setLights(Color.BLUE, 500, 500) + .setVibrate(longArrayOf(500, 500, 500)) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setContentTitle(user.username) + .setContentText(message.messagge) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + val notificationManager = NotificationManagerCompat.from(activity) + val notification = notificationBuilder.build() + notificationManager.notify(NotificationID.iD, notification) +/* Log.d("main",RetrofitHelper.baseUrl + "/api/post/image/compress/" + user.pfp!!._id) + Glide.with(activity) + .asBitmap() + .load(RetrofitHelper.baseUrl + "/api/post/image/compress/" + user.pfp!!._id) + .into(object : CustomTarget<Bitmap>() { + override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) { + notificationBuilder.setLargeIcon(resource) + val notification = notificationBuilder.build() + notificationManager.notify(NotificationID.iD, notification) + } + + override fun onLoadCleared(placeholder: Drawable?) { + Log.d("main","k") + } + + override fun onLoadFailed(errorDrawable: Drawable?) { + Log.d("main",errorDrawable.toString()) + } + + })*/ } + internal object NotificationID { + private val c = AtomicInteger(100) + val iD: Int + get() = c.incrementAndGet() + } fun log(){ Log.d("Debug infor siganlR ", hubConnection.connectionId) diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_off.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_off.png Binary files differnew file mode 100644 index 0000000..20751a8 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_off.png diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_on.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_on.png Binary files differnew file mode 100644 index 0000000..d655134 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_on.png diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml index acdab4a..0b4a589 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml @@ -47,11 +47,14 @@ android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> -<!-- <ImageButton + android:id="@+id/btnNotifications" android:layout_width="50dp" android:layout_height="match_parent" - android:layout_gravity="center_vertical"/>--> + android:layout_gravity="center_vertical" + android:scaleType="centerCrop" + android:backgroundTint="@color/unfollow" + android:src="@drawable/bell_off"/> </androidx.appcompat.widget.LinearLayoutCompat> diff --git a/Client/BrzoDoLokacije/app/src/main/res/values/strings.xml b/Client/BrzoDoLokacije/app/src/main/res/values/strings.xml index b180869..419c2e0 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/values/strings.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/values/strings.xml @@ -6,6 +6,8 @@ <string name="title_activity_maps">MapsActivity</string> <string name="dodaj_objavu">Dodaj objavu</string> <string name="todo">TODO</string> + <string name="channel_name">Ćaskanja</string> + <string name="channel_description">Notifikacije o dostavljenim porukama</string> <string name="datum">Datum</string> <string name="od">Od</string> |