Skip to content

Commit ef0ddc6

Browse files
committed
V2.5.6
* Fix bug duplicate permission Android * Replaces MediaPlayer with Ringtone Android * Fix bug notification channel Android * Stop sound notification when screen off Android
1 parent 80c3151 commit ef0ddc6

File tree

8 files changed

+82
-86
lines changed

8 files changed

+82
-86
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 2.5.6
2+
* Fix bug duplicate permission Android
3+
* Replaces MediaPlayer with Ringtone Android
4+
* Fix bug notification channel Android
5+
* Stop sound notification when screen off Android
6+
17
## 2.5.5
28
* Fix bug duplicate permission Android
39

android/src/main/kotlin/com/hiennv/flutter_callkit_incoming/CallkitIncomingActivity.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,11 @@ import android.widget.TextView
2222
import com.hiennv.flutter_callkit_incoming.widgets.RippleRelativeLayout
2323
import de.hdodenhof.circleimageview.CircleImageView
2424
import kotlin.math.abs
25-
import okhttp3.OkHttpClient
2625
import android.view.ViewGroup.MarginLayoutParams
2726
import android.os.PowerManager
2827
import android.text.TextUtils
2928
import android.util.Log
3029

31-
3230
class CallkitIncomingActivity : Activity() {
3331

3432
companion object {

android/src/main/kotlin/com/hiennv/flutter_callkit_incoming/CallkitNotificationManager.kt

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,21 @@ import android.content.Context
1111
import android.content.DialogInterface
1212
import android.content.Intent
1313
import android.content.pm.PackageManager
14-
import android.graphics.BitmapFactory
1514
import android.graphics.Color
16-
import android.graphics.drawable.BitmapDrawable
17-
import android.graphics.drawable.Icon
1815
import android.media.RingtoneManager
1916
import android.net.Uri
2017
import android.os.Build
2118
import android.os.Bundle
2219
import android.provider.Settings
2320
import android.text.TextUtils
2421
import android.text.format.DateFormat
25-
import android.util.Log
2622
import android.view.View
2723
import android.widget.RemoteViews
2824
import androidx.appcompat.app.AlertDialog
2925
import androidx.core.app.ActivityCompat
3026
import androidx.core.app.NotificationCompat
3127
import androidx.core.app.NotificationManagerCompat
3228
import androidx.core.app.Person
33-
import coil.ImageLoader
34-
import coil.request.ImageRequest
35-
import com.hiennv.flutter_callkit_incoming.widgets.CircleTransform
36-
import kotlinx.coroutines.Dispatchers
37-
import java.net.HttpURLConnection
38-
import java.net.URL
3929
import java.util.Date
4030

4131

@@ -181,10 +171,6 @@ class CallkitNotificationManager(
181171
data.getString(CallkitConstants.EXTRA_CALLKIT_ID, "callkit_incoming").hashCode()
182172
createNotificationChanel(data)
183173

184-
if (incomingChannelEnabled()) {
185-
callkitSoundPlayerManager?.play(data)
186-
}
187-
188174
notificationBuilder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID_INCOMING)
189175
notificationBuilder?.setChannelId(NOTIFICATION_CHANNEL_ID_INCOMING)
190176
notificationBuilder?.setDefaults(NotificationCompat.DEFAULT_VIBRATE)
@@ -997,8 +983,10 @@ class CallkitNotificationManager(
997983

998984
@SuppressLint("MissingPermission")
999985
fun showIncomingNotification(data: Bundle) {
1000-
1001986
val callkitNotification = getIncomingNotification(data)
987+
if (incomingChannelEnabled()) {
988+
callkitSoundPlayerManager?.play(data)
989+
}
1002990
callkitNotification?.let {
1003991
getNotificationManager().notify(
1004992
it.id, callkitNotification.notification

android/src/main/kotlin/com/hiennv/flutter_callkit_incoming/CallkitNotificationService.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import android.content.pm.ServiceInfo
88
import android.os.Build
99
import android.os.Bundle
1010
import android.os.IBinder
11-
import android.util.Log
1211
import androidx.core.content.ContextCompat
1312

1413
class CallkitNotificationService : Service() {

android/src/main/kotlin/com/hiennv/flutter_callkit_incoming/CallkitSoundPlayerManager.kt

Lines changed: 65 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package com.hiennv.flutter_callkit_incoming
22

3+
import android.content.BroadcastReceiver
34
import android.content.Context
5+
import android.content.Intent
6+
import android.content.IntentFilter
47
import android.media.AudioAttributes
58
import android.media.AudioManager
6-
import android.media.MediaPlayer
79
import android.media.Ringtone
810
import android.media.RingtoneManager
911
import android.net.Uri
1012
import android.os.*
1113
import android.text.TextUtils
12-
import androidx.annotation.RequiresApi
1314

1415
class CallkitSoundPlayerManager(private val context: Context) {
1516

@@ -18,14 +19,35 @@ class CallkitSoundPlayerManager(private val context: Context) {
1819

1920
private var ringtone: Ringtone? = null
2021

21-
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
22+
private var isPlaying: Boolean = false
23+
24+
25+
inner class ScreenOffCallkitIncomingBroadcastReceiver : BroadcastReceiver() {
26+
override fun onReceive(context: Context, intent: Intent) {
27+
if (isPlaying){
28+
stop()
29+
}
30+
}
31+
}
32+
33+
private var screenOffCallkitIncomingBroadcastReceiver = ScreenOffCallkitIncomingBroadcastReceiver()
34+
35+
36+
init {
37+
val filter = IntentFilter(Intent.ACTION_SCREEN_OFF)
38+
context.registerReceiver(screenOffCallkitIncomingBroadcastReceiver, filter)
39+
}
40+
41+
2242
fun play(data: Bundle) {
2343
this.prepare()
2444
this.playSound(data)
2545
this.playVibrator()
46+
this.isPlaying = true
2647
}
2748

2849
fun stop() {
50+
this.isPlaying = false
2951
ringtone?.stop()
3052
vibrator?.cancel()
3153

@@ -34,8 +56,10 @@ class CallkitSoundPlayerManager(private val context: Context) {
3456
}
3557

3658
fun destroy() {
37-
ringtone?.stop()
59+
this.isPlaying = false
60+
context.unregisterReceiver(screenOffCallkitIncomingBroadcastReceiver)
3861

62+
ringtone?.stop()
3963
vibrator?.cancel()
4064

4165
ringtone = null
@@ -75,7 +99,6 @@ class CallkitSoundPlayerManager(private val context: Context) {
7599
}
76100
}
77101

78-
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
79102
private fun playSound(data: Bundle?) {
80103
val sound = data?.getString(
81104
CallkitConstants.EXTRA_CALLKIT_RINGTONE_PATH,
@@ -88,51 +111,25 @@ class CallkitSoundPlayerManager(private val context: Context) {
88111
}
89112
try {
90113
ringtone = RingtoneManager.getRingtone(context, uri)
91-
ringtone?.apply {
92-
audioAttributes = AudioAttributes.Builder()
93-
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
94-
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
95-
.build()
96-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
97-
isLooping = true
98-
}
99-
play()
114+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
115+
val attribution = AudioAttributes.Builder()
116+
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
117+
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
118+
.setLegacyStreamType(AudioManager.STREAM_RING)
119+
.build()
120+
ringtone?.setAudioAttributes(attribution)
121+
}else {
122+
ringtone?.streamType = AudioManager.STREAM_RING
123+
}
124+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
125+
ringtone?.isLooping = true
100126
}
127+
ringtone?.play()
101128
} catch (e: Exception) {
102129
e.printStackTrace()
103130
}
104131
}
105132

106-
// private fun mediaPlayer(uri: Uri) {
107-
// mediaPlayer = MediaPlayer()
108-
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
109-
// val attribution = AudioAttributes.Builder()
110-
// .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
111-
// .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
112-
// .setLegacyStreamType(AudioManager.STREAM_RING)
113-
// .build()
114-
// mediaPlayer?.setAudioAttributes(attribution)
115-
// } else {
116-
// mediaPlayer?.setAudioStreamType(AudioManager.STREAM_RING)
117-
// }
118-
// setDataSource(uri)
119-
// mediaPlayer?.prepare()
120-
// mediaPlayer?.isLooping = true
121-
// mediaPlayer?.start()
122-
// }
123-
124-
// private fun setDataSource(uri: Uri) {
125-
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
126-
// val assetFileDescriptor =
127-
// context.contentResolver.openAssetFileDescriptor(uri, "r")
128-
// if (assetFileDescriptor != null) {
129-
// mediaPlayer?.setDataSource(assetFileDescriptor)
130-
// }
131-
// return
132-
// }
133-
// mediaPlayer?.setDataSource(context, uri)
134-
// }
135-
136133
private fun getRingtoneUri(fileName: String): Uri? {
137134
if (TextUtils.isEmpty(fileName)) {
138135
return getDefaultRingtoneUri()
@@ -175,36 +172,39 @@ class CallkitSoundPlayerManager(private val context: Context) {
175172
} catch (e: Exception) {
176173
// getActualDefaultRingtoneUri can throw an exception on some devices
177174
// for custom ringtones
178-
return null
175+
return getSafeSystemRingtoneUri()
179176
}
180177
}
181178

182179
private fun getSafeSystemRingtoneUri(): Uri? {
183-
val defaultUri = RingtoneManager.getActualDefaultRingtoneUri(
184-
context,
185-
RingtoneManager.TYPE_RINGTONE
186-
)
180+
try {
181+
val defaultUri = RingtoneManager.getActualDefaultRingtoneUri(
182+
context,
183+
RingtoneManager.TYPE_RINGTONE
184+
)
187185

188-
val rm = RingtoneManager(context)
189-
rm.setType(RingtoneManager.TYPE_RINGTONE)
190-
val cursor = rm.cursor
191-
if (defaultUri != null && cursor != null) {
192-
while (cursor.moveToNext()) {
193-
val uri = rm.getRingtoneUri(cursor.position)
194-
if (uri == defaultUri) {
195-
cursor.close()
196-
return defaultUri
186+
val rm = RingtoneManager(context)
187+
rm.setType(RingtoneManager.TYPE_RINGTONE)
188+
val cursor = rm.cursor
189+
if (defaultUri != null && cursor != null) {
190+
while (cursor.moveToNext()) {
191+
val uri = rm.getRingtoneUri(cursor.position)
192+
if (uri == defaultUri) {
193+
cursor.close()
194+
return defaultUri
195+
}
197196
}
198197
}
199-
}
200198

201-
// Default isn't system-provided → fallback to first available
202-
if (cursor != null && cursor.moveToFirst()) {
203-
val fallback = rm.getRingtoneUri(cursor.position)
204-
cursor.close()
205-
return fallback
199+
// Default isn't system-provided → fallback to first available
200+
if (cursor != null && cursor.moveToFirst()) {
201+
val fallback = rm.getRingtoneUri(cursor.position)
202+
cursor.close()
203+
return fallback
204+
}
205+
} catch (e: Exception) {
206+
e.printStackTrace()
206207
}
207-
208208
return null
209209
}
210210
}

android/src/main/kotlin/com/hiennv/flutter_callkit_incoming/FlutterCallkitIncomingPlugin.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,10 @@ class FlutterCallkitIncomingPlugin : FlutterPlugin, MethodCallHandler, ActivityA
351351
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
352352
methodChannels.remove(binding.binaryMessenger)?.setMethodCallHandler(null)
353353
eventChannels.remove(binding.binaryMessenger)?.setStreamHandler(null)
354+
instance.callkitSoundPlayerManager?.destroy()
355+
instance.callkitNotificationManager?.destroy()
356+
instance.callkitSoundPlayerManager = null
357+
instance.callkitNotificationManager = null
354358
}
355359

356360
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
@@ -369,7 +373,8 @@ class FlutterCallkitIncomingPlugin : FlutterPlugin, MethodCallHandler, ActivityA
369373
}
370374

371375
override fun onDetachedFromActivity() {
372-
376+
instance.context = null
377+
instance.activity = null
373378
}
374379

375380
class EventCallbackHandler : EventChannel.StreamHandler {

example/android/app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ android {
3737
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
3838
applicationId "com.hiennv.testing"
3939
minSdk 19
40-
targetSdk 34
40+
targetSdk 35
4141
versionCode flutterVersionCode.toInteger()
4242
versionName flutterVersionName
4343
multiDexEnabled true

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: flutter_callkit_incoming
22
description: Flutter Callkit Incoming to show callkit screen in your Flutter app.
3-
version: 2.5.5
3+
version: 2.5.6
44
homepage: https://github.com/hiennguyen92/flutter_callkit_incoming
55
repository: https://github.com/hiennguyen92/flutter_callkit_incoming
66
issue_tracker: https://github.com/hiennguyen92/flutter_callkit_incoming/issues

0 commit comments

Comments
 (0)