@@ -2,19 +2,29 @@ package com.contusfly.utils
22
33import android.Manifest
44import android.app.Activity
5+ import android.app.NotificationManager
56import android.content.Context
67import android.content.Intent
78import android.content.pm.PackageManager
89import android.net.Uri
910import android.os.Build
1011import android.os.Build.VERSION.SDK_INT
12+ import android.os.RemoteException
1113import android.provider.Settings
14+ import android.util.Log
15+ import android.view.LayoutInflater
1216import android.view.View
17+ import android.view.WindowManager
1318import androidx.activity.result.ActivityResultLauncher
19+ import androidx.annotation.RequiresApi
20+ import androidx.appcompat.app.AlertDialog
1421import androidx.core.app.ActivityCompat
1522import androidx.core.content.ContextCompat
23+ import androidx.viewbinding.ViewBinding
1624import com.mirrorflysdk.flycall.webrtc.api.CallManager
1725import com.contusfly.R
26+ import com.contusfly.chat.AndroidUtils
27+ import com.contusfly.databinding.NotificationPermissionDialogBinding
1828import com.contusfly.interfaces.PermissionDialogListener
1929import com.contusfly.views.PermissionAlertDialog
2030import 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}
0 commit comments