From 9902f26a53cd1e91295fc0b118737a430f46cae5 Mon Sep 17 00:00:00 2001 From: Jelena Petrovic Date: Tue, 6 Dec 2022 05:56:48 +0100 Subject: Omoguceno ukljucivanje i iskljucivanje notifikacija i same notifikacije #75 --- .../.idea/deploymentTargetDropDown.xml | 4 +- Client/BrzoDoLokacije/app/build.gradle | 4 +- .../app/src/main/AndroidManifest.xml | 1 + .../brzodolokacije/Activities/ChatActivity.kt | 72 +++++++++++++++++++ .../com/example/brzodolokacije/MainActivity.kt | 2 + .../example/brzodolokacije/chat/Notifications.kt | 28 ++++++++ .../example/brzodolokacije/chat/SignalRListener.kt | 77 ++++++++++++++++++++- .../app/src/main/res/drawable/bell_off.png | Bin 0 -> 3137 bytes .../app/src/main/res/drawable/bell_on.png | Bin 0 -> 6480 bytes .../app/src/main/res/layout/activity_chat.xml | 7 +- .../app/src/main/res/values/strings.xml | 2 + 11 files changed, 190 insertions(+), 7 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/chat/Notifications.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/bell_off.png create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/bell_on.png (limited to 'Client') 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 @@ - + - + \ 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 @@ + 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(R.id.addNewMessage).setOnClickListener { val intent: Intent = Intent(this@ChatActivity,ChatActivityConversation::class.java) @@ -68,6 +127,19 @@ class ChatActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener { findViewById(R.id.btnBack).setOnClickListener { finish() } + findViewById(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 { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful()){ + var user=response.body()!! + createNotification(message,user,activity) + } + } + + override fun onFailure(call: Call, 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() { + override fun onResourceReady(resource: Bitmap, transition: Transition?) { + 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 Binary files /dev/null and b/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_off.png 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 Binary files /dev/null and b/Client/BrzoDoLokacije/app/src/main/res/drawable/bell_on.png 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" /> - + android:layout_gravity="center_vertical" + android:scaleType="centerCrop" + android:backgroundTint="@color/unfollow" + android:src="@drawable/bell_off"/> 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 @@ MapsActivity Dodaj objavu TODO + Ćaskanja + Notifikacije o dostavljenim porukama Datum Od -- cgit v1.2.3