Skip to content

Commit 2ed0f78

Browse files
committed
Android 14 migration
1 parent 3a296e9 commit 2ed0f78

File tree

15 files changed

+260
-17
lines changed

15 files changed

+260
-17
lines changed

app/build.gradle

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ android {
3232

3333
defaultConfig {
3434
minSdkVersion 21
35-
targetSdkVersion 33
36-
compileSdk(33)
35+
targetSdkVersion 34
36+
compileSdk(34)
3737
versionCode 16
38-
versionName "7.11.0"
38+
versionName "7.11.4"
3939
multiDexEnabled true
4040
buildConfigField "java.util.Date", "BUILD_TIME", "new java.util.Date(" + System.currentTimeMillis() + "L)"
4141
vectorDrawables.useSupportLibrary = true
@@ -45,7 +45,6 @@ android {
4545

4646
buildTypes {
4747
debug {
48-
initWith debug
4948
buildConfigField 'Boolean', 'IS_QA_BUILD', 'true'
5049
buildConfigField 'String', 'LICENSE', '"Please enter your License key"'
5150
buildConfigField 'String', 'WEB_CHAT_LOGIN', '"https://webchat-preprod-sandbox.mirrorfly.com/"'
@@ -86,7 +85,6 @@ android {
8685
javaMaxHeapSize "4g"
8786
}
8887

89-
9088
buildTypes.each {
9189
it.buildConfigField 'String', 'GOOGLE_TRANSLATE_KEY', GOOGLE_TRANSLATE_KEY
9290
it.buildConfigField 'Boolean', 'HIPAA_COMPLIANCE_ENABLED', HIPAA_COMPLIANCE_ENABLED
@@ -203,7 +201,7 @@ dependencies {
203201
implementation project(':sdk:googletranslation')
204202
implementation project(path: ':call')
205203

206-
implementation 'com.mirrorfly.sdk:mirrorflysdk:7.11.0'
204+
implementation 'com.mirrorfly.sdk:mirrorflysdk:7.11.4'
207205

208206
//Socket - versions.gradle
209207
implementation 'com.github.nkzawa:socket.io-client:0.6.0'

app/src/main/AndroidManifest.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@
4343

4444
<uses-feature android:name="android.hardware.camera" />
4545

46+
<!--Android 14 permission changes -->
47+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA"/>
48+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE"/>
49+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE"/>
50+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"/>
51+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING"/>
52+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
53+
54+
<uses-permission android:name="android.permission.TURN_SCREEN_ON"/>
55+
4656
<queries>
4757
<intent>
4858
<action android:name="android.intent.action.VIEW" />

app/src/main/java/com/contusfly/activities/ChatActivity.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2164,7 +2164,6 @@ class ChatActivity : ChatParent(), ActionMode.Callback, View.OnTouchListener, Em
21642164
}
21652165

21662166
override fun onCancelUploadClicked(messageItem: ChatMessage) {
2167-
LogMessage.d(FILE_UPLOAD_TAG,"Cancel Uploading.......")
21682167
if (!messageItem.isMediaUploaded() || !messageItem.isMediaDownloaded())
21692168
handleCancelClickedOnMediaMessage(messageItem)
21702169
else {
@@ -2190,7 +2189,6 @@ class ChatActivity : ChatParent(), ActionMode.Callback, View.OnTouchListener, Em
21902189
}
21912190

21922191
override fun onRetryClicked(item: ChatMessage?) {
2193-
LogMessage.d(FILE_UPLOAD_TAG,"Resume Uploading.......")
21942192
netConditionalCall({
21952193
item?.let {
21962194
FlyMessenger.uploadMedia(it.messageId)
@@ -2240,7 +2238,6 @@ class ChatActivity : ChatParent(), ActionMode.Callback, View.OnTouchListener, Em
22402238
listChats.scrollToPosition(mainList.size - 1)
22412239
} catch (e: java.lang.Exception) {
22422240
LogMessage.e(e)
2243-
LogMessage.e(FILE_UPLOAD_TAG,"Clear Chat Error $e")
22442241
}
22452242
}
22462243

app/src/main/java/com/contusfly/activities/parent/ChatParent.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,6 @@ open class ChatParent : BaseActivity(), CoroutineScope, MessageListener,
142142

143143
private var isRefreshing = false
144144

145-
val FILE_UPLOAD_TAG: String =" #FileUploadTask "
146-
147145
protected val mentionViewModel by lazy {
148146
ViewModelProvider(this).get(MentionsViewModel::class.java)
149147
}

app/src/main/java/com/contusfly/call/groupcall/GroupCallActivity.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ import com.contusfly.call.groupcall.listeners.ActivityOnClickListener
2727
import com.contusfly.call.groupcall.utils.CallUtils
2828
import com.contusfly.databinding.ActivityGroupCallBinding
2929
import com.contusfly.utils.ChatUtils
30+
import com.contusfly.utils.Constants
3031
import com.contusfly.utils.MediaPermissions
3132
import com.contusfly.utils.ProfileDetailsUtils
33+
import com.contusfly.utils.SharedPreferenceManager
3234
import com.contusfly.views.PermissionAlertDialog
3335
import com.mirrorflysdk.AppUtils
3436
import com.mirrorflysdk.flycall.call.utils.GroupCallUtils
@@ -223,6 +225,8 @@ class GroupCallActivity : BaseActivity(), View.OnClickListener, ActivityOnClickL
223225
initClickListeners()
224226
setUpCallDataAndUI()
225227
groupCallViewModel.checkInternetConnection()
228+
229+
checkAndRequestFullScreenPermission()
226230
}
227231

228232
private fun setUpCallDataAndUI() {
@@ -1216,4 +1220,26 @@ class GroupCallActivity : BaseActivity(), View.OnClickListener, ActivityOnClickL
12161220
LogMessage.d(TAG, "$CALL_UI onGroupProfileUpdated groupJid:$groupJid")
12171221
updateUserDetailsUpdatedInCall(groupJid)
12181222
}
1223+
1224+
fun checkAndRequestFullScreenPermission() {
1225+
if(!ChatUtils.checkFullScreenNotificationPermissionEnabled()){
1226+
com.contusfly.utils.LogMessage.d(TAG,"#fullscreen fullScreenNotificationPermission requesting!!")
1227+
if(!SharedPreferenceManager.getBoolean(Constants.ASK_FULL_SCREEN_INTENT_PERMISSION)) {
1228+
MediaPermissions.requestFullScreenNotificationPermission(
1229+
this,
1230+
permissionAlertDialog,
1231+
fullScreenNotificationPermissionLauncher,isCall = true)
1232+
}
1233+
1234+
} else {
1235+
com.contusfly.utils.LogMessage.d(TAG,"#fullscreen fullScreenNotificationPermission enabled!!")
1236+
}
1237+
}
1238+
1239+
private val fullScreenNotificationPermissionLauncher = registerForActivityResult(
1240+
ActivityResultContracts.RequestMultiplePermissions()) { _ ->
1241+
if(ChatUtils.checkFullScreenNotificationPermissionEnabled()){
1242+
com.contusfly.utils.LogMessage.d(TAG,"#fullscreen fullScreenNotificationPermission Launcher enabled!!")
1243+
}
1244+
}
12191245
}

app/src/main/java/com/contusfly/utils/ChatUtils.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,16 @@ object ChatUtils {
157157
}
158158
}
159159

160+
fun checkFullScreenNotificationPermissionEnabled(): Boolean {
161+
val minSdk34 = Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU
162+
var needToRequestFullScreenPermission = minSdk34
163+
if(needToRequestFullScreenPermission){
164+
return CallManager.canUseFullScreenIntent()
165+
}
166+
return minSdk34
167+
}
168+
169+
160170
fun checkNotificationPermission(context: Context, permission: String): Boolean {
161171
return MediaPermissions.isPermissionAllowed(context, permission)
162172
}

app/src/main/java/com/contusfly/utils/Constants.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ class Constants {
141141
const val EMAIL = "email"
142142
const val ASK_PERMISSION = "ask_permission"
143143
const val USER_PROFILE_NAME = "profile_name"
144-
const val EMAIL_PATTERN = ("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
145-
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,3})$")
144+
const val EMAIL_PATTERN = ("^[_A-Za-z0-9-%+!$&#\\+]+(\\.[_A-Za-z0-9-%+!$&#\\+]+)*@"
145+
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,6})$")
146146
const val FROM_SETTINGS_PROFILE = "from_settings_profile"
147147
const val FROM_LOGIN_PROFILE = "from_login_profile"
148148
const val REGISTER_END_POINT = "/api/v1/sandbox/register"
@@ -426,5 +426,10 @@ class Constants {
426426
const val MAX_DOCUMENT_UPLOAD_SIZE = 2048 // 2 GB
427427
const val MAX_AUDIO_SIZE_LIMIT = 2048 // 2 GB
428428

429+
//Full Screen Intent Permission
430+
const val ASK_FULL_SCREEN_INTENT_PERMISSION = "ask_full_screen_notification_permission"
431+
const val FULLSCREEN_NOTIFICATION_PERMISSION_ASKED = "fullscreen_notification_permission_asked_before"
432+
433+
429434
}
430435
}

app/src/main/java/com/contusfly/utils/MediaPermissions.kt

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,29 @@ package com.contusfly.utils
22

33
import android.Manifest
44
import android.app.Activity
5+
import android.app.NotificationManager
56
import android.content.Context
67
import android.content.Intent
78
import android.content.pm.PackageManager
89
import android.net.Uri
910
import android.os.Build
1011
import android.os.Build.VERSION.SDK_INT
12+
import android.os.RemoteException
1113
import android.provider.Settings
14+
import android.util.Log
15+
import android.view.LayoutInflater
1216
import android.view.View
17+
import android.view.WindowManager
1318
import androidx.activity.result.ActivityResultLauncher
19+
import androidx.annotation.RequiresApi
20+
import androidx.appcompat.app.AlertDialog
1421
import androidx.core.app.ActivityCompat
1522
import androidx.core.content.ContextCompat
23+
import androidx.viewbinding.ViewBinding
1624
import com.mirrorflysdk.flycall.webrtc.api.CallManager
1725
import com.contusfly.R
26+
import com.contusfly.chat.AndroidUtils
27+
import com.contusfly.databinding.NotificationPermissionDialogBinding
1828
import com.contusfly.interfaces.PermissionDialogListener
1929
import com.contusfly.views.PermissionAlertDialog
2030
import com.google.android.material.snackbar.Snackbar
@@ -1204,4 +1214,177 @@ object MediaPermissions {
12041214
)
12051215
}
12061216
}
1217+
1218+
1219+
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
1220+
private fun isFullScreenNotificationPermissionNotEnabled(activity: Activity):Boolean{
1221+
val notificationManager = activity.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
1222+
var canUseFullScreenIntent = false
1223+
try {
1224+
canUseFullScreenIntent = notificationManager.canUseFullScreenIntent()
1225+
} catch (e: RemoteException) {
1226+
LogMessage.d("MediaPermissions", "isFullScreenNotificationPermissionNotEnabled: exception")
1227+
e.printStackTrace()
1228+
}
1229+
LogMessage.d("MediaPermissions", "#fullscreen isFullScreenNotificationPermissionNotEnabled: $canUseFullScreenIntent")
1230+
return canUseFullScreenIntent
1231+
}
1232+
1233+
fun requestFullScreenNotificationPermission(
1234+
activity: Activity,
1235+
permissionAlertDialog: PermissionAlertDialog,
1236+
permissionsLauncher: ActivityResultLauncher<Array<String>>,
1237+
isCall: Boolean = false,
1238+
permissionDialogListener: PermissionDialogListener? = null,
1239+
) {
1240+
1241+
if (SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && !isFullScreenNotificationPermissionNotEnabled(activity)) {
1242+
val permissionsToRequest = mutableListOf<String>()
1243+
permissionsToRequest.add(Manifest.permission.USE_FULL_SCREEN_INTENT)
1244+
if (permissionsToRequest.isNotEmpty()) {
1245+
when {
1246+
ActivityCompat.shouldShowRequestPermissionRationale(
1247+
activity,
1248+
Manifest.permission.USE_FULL_SCREEN_INTENT
1249+
) -> {
1250+
if (isCall) {
1251+
1252+
fullScreenNotificationDialogShow(activity)
1253+
1254+
} else {
1255+
showPermissionPopUpForFullScreenNotification(
1256+
permissionsLauncher,
1257+
permissionsToRequest,
1258+
permissionAlertDialog,
1259+
isCall,
1260+
permissionDialogListener,activity
1261+
)
1262+
}
1263+
}
1264+
1265+
SharedPreferenceManager.getBoolean(Constants.FULLSCREEN_NOTIFICATION_PERMISSION_ASKED) -> {
1266+
fullScreenNotificationPermissionAsked(activity, permissionAlertDialog, isCall, permissionDialogListener)
1267+
}
1268+
1269+
else -> {
1270+
showPermissionPopUpForFullScreenNotification(
1271+
permissionsLauncher,
1272+
permissionsToRequest,
1273+
permissionAlertDialog,
1274+
isCall,
1275+
permissionDialogListener,activity
1276+
)
1277+
}
1278+
}
1279+
}
1280+
}
1281+
1282+
}
1283+
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
1284+
private fun fullScreenNotificationDialogShow(activity: Activity) {
1285+
1286+
try {
1287+
var dialogBinding: ViewBinding? = null
1288+
var dialogBuilder: AlertDialog.Builder
1289+
dialogBuilder = AlertDialog.Builder(activity, R.style.TrasparentAlertDialog)
1290+
val inflater: LayoutInflater = activity.layoutInflater
1291+
dialogBinding = NotificationPermissionDialogBinding.inflate(inflater)
1292+
dialogBuilder.apply {
1293+
setCancelable(false)
1294+
setView((dialogBinding)!!.root)
1295+
}
1296+
val alertDialog = dialogBuilder.create()
1297+
alertDialog.show()
1298+
alertDialogWidth(activity,alertDialog)
1299+
dialogBinding.closeIcon.visibility = View.INVISIBLE
1300+
dialogBinding.titleTv.text = activity.resources.getString(R.string.notification_full_screen_title)
1301+
dialogBinding.dialogDescription.text = activity.resources.getString(R.string.notification_full_intent_permission_denied_alert_label)
1302+
dialogBinding.turnOnTv.setOnClickListener {
1303+
SharedPreferenceManager.setBoolean(Constants.ASK_FULL_SCREEN_INTENT_PERMISSION, true)
1304+
openSettingsForFullScreenNotificationPermissionWithoutSmackBar(activity)
1305+
alertDialog.dismiss()
1306+
}
1307+
1308+
dialogBinding.notNowTv.setOnClickListener {
1309+
SharedPreferenceManager.setBoolean(Constants.ASK_FULL_SCREEN_INTENT_PERMISSION, true)
1310+
alertDialog.dismiss()
1311+
}
1312+
1313+
} catch (e:Exception) {
1314+
Log.e("TAG", "showPermissionInstructionDialog: $e")
1315+
}
1316+
1317+
}
1318+
1319+
private fun alertDialogWidth(activity: Activity, alertDialog: AlertDialog) {
1320+
val layoutParams = WindowManager.LayoutParams()
1321+
layoutParams.copyFrom(alertDialog.window!!.attributes)
1322+
layoutParams.width = (AndroidUtils.getScreenWidth(activity) * 0.80).toInt()
1323+
alertDialog.window!!.attributes = layoutParams
1324+
}
1325+
1326+
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
1327+
private fun openSettingsForFullScreenNotificationPermissionWithoutSmackBar(activity: Activity) {
1328+
val intent = Intent(
1329+
Settings.ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT,
1330+
Uri.fromParts("package", activity.packageName, null)
1331+
)
1332+
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
1333+
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
1334+
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
1335+
activity.startActivity(intent)
1336+
}
1337+
1338+
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
1339+
private fun showPermissionPopUpForFullScreenNotification(
1340+
permissionsLauncher: ActivityResultLauncher<Array<String>>,
1341+
permissionsToRequest: MutableList<String>,
1342+
permissionAlertDialog: PermissionAlertDialog,
1343+
isCall: Boolean,
1344+
permissionDialogListener: PermissionDialogListener?,
1345+
activity: Activity
1346+
) {
1347+
if(isCall) {
1348+
SharedPreferenceManager.setBoolean(Constants.FULLSCREEN_NOTIFICATION_PERMISSION_ASKED, true)
1349+
fullScreenNotificationDialogShow(activity)
1350+
} else {
1351+
permissionAlertDialog.showPermissionInstructionDialog(PermissionAlertDialog.FULLSCREEN_NOTIFICATION_PERMISSION_DENIED,
1352+
object : PermissionDialogListener {
1353+
override fun onPositiveButtonClicked() {
1354+
SharedPreferenceManager.setBoolean(Constants.FULLSCREEN_NOTIFICATION_PERMISSION_ASKED, true)
1355+
permissionsLauncher.launch(permissionsToRequest.toTypedArray())
1356+
}
1357+
1358+
override fun onNegativeButtonClicked() {
1359+
permissionDialogListener?.onNegativeButtonClicked()
1360+
}
1361+
})
1362+
}
1363+
1364+
}
1365+
1366+
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
1367+
private fun fullScreenNotificationPermissionAsked(
1368+
activity: Activity,
1369+
permissionAlertDialog: PermissionAlertDialog,
1370+
isCall: Boolean,
1371+
permissionDialogListener: PermissionDialogListener?,
1372+
) {
1373+
if (isCall) {
1374+
fullScreenNotificationDialogShow(activity)
1375+
} else {
1376+
permissionAlertDialog.showPermissionInstructionDialog(
1377+
PermissionAlertDialog.FULLSCREEN_NOTIFICATION_PERMISSION_DENIED,
1378+
object : PermissionDialogListener {
1379+
override fun onPositiveButtonClicked() {
1380+
openSettingsForFullScreenNotificationPermissionWithoutSmackBar(activity)
1381+
}
1382+
1383+
override fun onNegativeButtonClicked() {
1384+
permissionDialogListener?.onNegativeButtonClicked()
1385+
}
1386+
}
1387+
)
1388+
}
1389+
}
12071390
}

app/src/main/java/com/contusfly/views/PermissionAlertDialog.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,5 +141,7 @@ class PermissionAlertDialog(private var activity: Activity) {
141141
const val VIDEO_CALL_PERMISSION_DENIED = "video_call_permission_denied"
142142
const val NOTIFCATION_PERMISSION_DENIED = "notification_permission_denied"
143143
const val NOTIFICATION_LOCKED_STATE_PERMISSION_DENIED = "notification_permission_locked_state_denied"
144+
const val FULLSCREEN_NOTIFICATION_PERMISSION_DENIED = "fullscreen_notification_permission_denied"
145+
144146
}
145147
}

0 commit comments

Comments
 (0)