diff options
| author | Jelena Petrovic <jelenapetrovic.7119@gmail.com> | 2022-12-06 05:56:48 +0100 | 
|---|---|---|
| committer | Jelena Petrovic <jelenapetrovic.7119@gmail.com> | 2022-12-06 05:56:48 +0100 | 
| commit | 9902f26a53cd1e91295fc0b118737a430f46cae5 (patch) | |
| tree | 8b95c0676a394dc6e739f2a0f2985646d3e60fc0 /Client | |
| parent | f3c3fcaeb4ece508e018286c59a57da1d9ea0469 (diff) | |
Omoguceno ukljucivanje i iskljucivanje notifikacija i same notifikacije #75
Diffstat (limited to 'Client')
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 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>  | 
