aboutsummaryrefslogtreecommitdiff
path: root/Client
diff options
context:
space:
mode:
authorJelena Petrovic <jelenapetrovic.7119@gmail.com>2022-12-06 05:56:48 +0100
committerJelena Petrovic <jelenapetrovic.7119@gmail.com>2022-12-06 05:56:48 +0100
commit9902f26a53cd1e91295fc0b118737a430f46cae5 (patch)
tree8b95c0676a394dc6e739f2a0f2985646d3e60fc0 /Client
parentf3c3fcaeb4ece508e018286c59a57da1d9ea0469 (diff)
Omoguceno ukljucivanje i iskljucivanje notifikacija i same notifikacije #75
Diffstat (limited to 'Client')
-rw-r--r--Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml4
-rw-r--r--Client/BrzoDoLokacije/app/build.gradle4
-rw-r--r--Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml1
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ChatActivity.kt72
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt2
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/Notifications.kt28
-rw-r--r--Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/SignalRListener.kt77
-rw-r--r--Client/BrzoDoLokacije/app/src/main/res/drawable/bell_off.pngbin0 -> 3137 bytes
-rw-r--r--Client/BrzoDoLokacije/app/src/main/res/drawable/bell_on.pngbin0 -> 6480 bytes
-rw-r--r--Client/BrzoDoLokacije/app/src/main/res/layout/activity_chat.xml7
-rw-r--r--Client/BrzoDoLokacije/app/src/main/res/values/strings.xml2
11 files changed, 190 insertions, 7 deletions
diff --git a/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml b/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml
index 394c76a..41db9a0 100644
--- a/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml
+++ b/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml
@@ -7,11 +7,11 @@
<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>
- <timeTargetWasSelectedWithDropDown value="2022-11-28T13:21:51.009462400Z" />
+ <timeTargetWasSelectedWithDropDown value="2022-12-05T15:17:54.592850800Z" />
</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 4555917..6e29823 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/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
new file mode 100644
index 0000000..20751a8
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_off.png
Binary files differ
diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_on.png b/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_on.png
new file mode 100644
index 0000000..d655134
--- /dev/null
+++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_on.png
Binary files differ
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>