rns-nativecall 0.2.8 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rns-nativecall",
3
- "version": "0.2.8",
3
+ "version": "0.3.0",
4
4
  "description": "RNS nativecall component with native Android/iOS for handling native call ui, when app is not open or open.",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -1,93 +0,0 @@
1
- package com.rnsnativecall
2
-
3
- import android.app.*
4
- import android.content.Context
5
- import android.content.Intent
6
- import android.media.AudioAttributes
7
- import android.media.MediaPlayer
8
- import android.media.RingtoneManager
9
- import android.os.Build
10
- import androidx.core.app.NotificationCompat
11
-
12
- object NativeCallManager {
13
- private var mediaPlayer: MediaPlayer? = null
14
- private const val CHANNEL_ID = "incoming_calls"
15
- private const val NOTIFICATION_ID = 101
16
-
17
- fun handleIncomingPush(context: Context, data: Map<String, String>) {
18
- startRingtone(context)
19
- showIncomingCallNotification(context, data)
20
- }
21
-
22
- private fun startRingtone(context: Context) {
23
- if (mediaPlayer != null) return
24
- try {
25
- val uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)
26
- mediaPlayer = MediaPlayer().apply {
27
- setDataSource(context, uri)
28
- setAudioAttributes(AudioAttributes.Builder()
29
- .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
30
- .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
31
- .build())
32
- isLooping = true
33
- prepare()
34
- start()
35
- }
36
- } catch (e: Exception) { e.printStackTrace() }
37
- }
38
-
39
- fun stopRingtone() {
40
- mediaPlayer?.stop()
41
- mediaPlayer?.release()
42
- mediaPlayer = null
43
- }
44
-
45
- private fun showIncomingCallNotification(context: Context, data: Map<String, String>) {
46
- val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
47
-
48
- // Create Channel for Android O+
49
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
50
- val channel = NotificationChannel(CHANNEL_ID, "Incoming Calls", NotificationManager.IMPORTANCE_HIGH).apply {
51
- lockscreenVisibility = Notification.VISIBILITY_PUBLIC
52
- enableVibration(true)
53
- setSound(null, null) // We handle sound manually via MediaPlayer
54
- }
55
- notificationManager.createNotificationChannel(channel)
56
- }
57
-
58
- // 1. Full Screen Intent (To wake up the screen)
59
- val fullScreenIntent = Intent(context, AcceptCallActivity::class.java).apply {
60
- data.forEach { (k, v) -> putExtra(k, v) }
61
- addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_NO_USER_ACTION)
62
- }
63
- val fullScreenPendingIntent = PendingIntent.getActivity(context, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
64
-
65
- // 2. Answer Action
66
- val answerIntent = Intent(context, CallActionReceiver::class.java).apply {
67
- action = "ACTION_ACCEPT"
68
- data.forEach { (k, v) -> putExtra(k, v) }
69
- }
70
- val answerPendingIntent = PendingIntent.getBroadcast(context, 1, answerIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
71
-
72
- // 3. Reject Action
73
- val rejectIntent = Intent(context, CallActionReceiver::class.java).apply {
74
- action = "ACTION_REJECT"
75
- data.forEach { (k, v) -> putExtra(k, v) }
76
- }
77
- val rejectPendingIntent = PendingIntent.getBroadcast(context, 2, rejectIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
78
-
79
- val builder = NotificationCompat.Builder(context, CHANNEL_ID)
80
- .setSmallIcon(context.applicationInfo.icon)
81
- .setContentTitle("Incoming Call")
82
- .setContentText(data["name"] ?: "Unknown Caller")
83
- .setPriority(NotificationCompat.PRIORITY_MAX)
84
- .setCategory(NotificationCompat.CATEGORY_CALL)
85
- .setAutoCancel(true)
86
- .setOngoing(true)
87
- .setFullScreenIntent(fullScreenPendingIntent, true)
88
- .addAction(0, "Answer", answerPendingIntent)
89
- .addAction(0, "Decline", rejectPendingIntent)
90
-
91
- notificationManager.notify(NOTIFICATION_ID, builder.build())
92
- }
93
- }
@@ -1,101 +0,0 @@
1
- package com.rnsnativecall
2
-
3
- import android.app.*
4
- import android.content.Context
5
- import android.content.Intent
6
- import android.media.AudioAttributes
7
- import android.media.MediaPlayer
8
- import android.media.RingtoneManager
9
- import android.os.Build
10
- import androidx.core.app.NotificationCompat
11
-
12
- object NativeCallManager {
13
- private var mediaPlayer: MediaPlayer? = null
14
- private const val CHANNEL_ID = "incoming_calls"
15
- private const val NOTIFICATION_ID = 101
16
-
17
- fun handleIncomingPush(context: Context, data: Map<String, String>) {
18
- startRingtone(context)
19
- showNotification(context, data)
20
- }
21
-
22
- private fun startRingtone(context: Context) {
23
- if (mediaPlayer != null) return
24
- try {
25
- val uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)
26
- mediaPlayer = MediaPlayer().apply {
27
- setDataSource(context, uri)
28
- setAudioAttributes(AudioAttributes.Builder()
29
- .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
30
- .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
31
- .build())
32
- isLooping = true
33
- prepare()
34
- start()
35
- }
36
- } catch (e: Exception) { e.printStackTrace() }
37
- }
38
-
39
- fun stopRingtone() {
40
- mediaPlayer?.stop()
41
- mediaPlayer?.release()
42
- mediaPlayer = null
43
- }
44
-
45
- private fun showNotification(context: Context, data: Map<String, String>) {
46
- val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
47
-
48
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
49
- val channel = NotificationChannel(CHANNEL_ID, "Calls", NotificationManager.IMPORTANCE_HIGH).apply {
50
- description = "Incoming call notifications"
51
- setSound(null, null)
52
- enableVibration(true)
53
- }
54
- notificationManager.createNotificationChannel(channel)
55
- }
56
-
57
- // 1. Full Screen Intent (Wakes up screen & goes to AcceptCallActivity)
58
- val fullScreenIntent = Intent(context, AcceptCallActivity::class.java).apply {
59
- data.forEach { (k, v) -> putExtra(k, v) }
60
- addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
61
- }
62
- val fullScreenPendingIntent = PendingIntent.getActivity(
63
- context, 0, fullScreenIntent,
64
- PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
65
- )
66
-
67
- // 2. Answer Button
68
- val answerIntent = Intent(context, CallActionReceiver::class.java).apply {
69
- action = "ACTION_ACCEPT"
70
- data.forEach { (k, v) -> putExtra(k, v) }
71
- }
72
- val answerPendingIntent = PendingIntent.getBroadcast(
73
- context, 1, answerIntent,
74
- PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
75
- )
76
-
77
- // 3. Reject Button
78
- val rejectIntent = Intent(context, CallActionReceiver::class.java).apply {
79
- action = "ACTION_REJECT"
80
- data.forEach { (k, v) -> putExtra(k, v) }
81
- }
82
- val rejectPendingIntent = PendingIntent.getBroadcast(
83
- context, 2, rejectIntent,
84
- PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
85
- )
86
-
87
- val builder = NotificationCompat.Builder(context, CHANNEL_ID)
88
- .setSmallIcon(android.R.drawable.ic_menu_call) // Replace with your app icon
89
- .setContentTitle("Incoming Call")
90
- .setContentText(data["name"] ?: "Raiidr User")
91
- .setPriority(NotificationCompat.PRIORITY_MAX)
92
- .setCategory(NotificationCompat.CATEGORY_CALL)
93
- .setFullScreenIntent(fullScreenPendingIntent, true)
94
- .setOngoing(true)
95
- .setAutoCancel(true)
96
- .addAction(0, "Answer", answerPendingIntent)
97
- .addAction(0, "Decline", rejectPendingIntent)
98
-
99
- notificationManager.notify(NOTIFICATION_ID, builder.build())
100
- }
101
- }