Coverage Summary for Class: PushActivationActivity (cloud.mindbox.mobile_sdk.inapp.presentation.actions)

Class Method, % Branch, % Line, % Instruction, %
PushActivationActivity 0% (0/10) 0% (0/48) 0% (0/66) 0% (0/370)
PushActivationActivity$Companion
PushActivationActivity$mindboxNotificationManager$2 0% (0/1) 0% (0/1) 0% (0/2)
PushActivationActivity$requestPermissionManager$2 0% (0/1) 0% (0/1) 0% (0/2)
Total 0% (0/12) 0% (0/48) 0% (0/68) 0% (0/374)


 package cloud.mindbox.mobile_sdk.inapp.presentation.actions
 
 import android.app.Activity
 import android.content.pm.PackageManager
 import android.os.Build
 import android.os.Bundle
 import android.os.SystemClock
 import android.view.MotionEvent
 import android.view.ViewGroup
 import androidx.annotation.RequiresApi
 import cloud.mindbox.mobile_sdk.Mindbox
 import cloud.mindbox.mobile_sdk.di.mindboxInject
 import cloud.mindbox.mobile_sdk.logger.mindboxLogI
 import cloud.mindbox.mobile_sdk.utils.Constants
 
 internal class PushActivationActivity : Activity() {
 
     private val mindboxNotificationManager by mindboxInject { mindboxNotificationManager }
     private val requestPermissionManager by mindboxInject { requestPermissionManager }
     private var shouldCheckDialogShowing = false
     private val resumeTimes = mutableListOf<Long>()
     private var requestId: String? = null
     private var isResultSent: Boolean = false
     private var isNeedToRouteSettings: Boolean = true
 
     companion object {
         private const val PERMISSION_REQUEST_CODE = 125129
         private const val TIME_BETWEEN_RESUME = 700
         internal const val EXTRA_REQUEST_ID: String = "runtime_permission_request_id"
         internal const val EXTRA_ROUTE_TO_SETTINGS: String = "runtime_permission_route_to_settings"
     }
 
     @RequiresApi(Build.VERSION_CODES.M)
     override fun onRequestPermissionsResult(
         requestCode: Int,
         permissions: Array<String>,
         grantResults: IntArray
     ) {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults)
 
         if (requestCode != PERMISSION_REQUEST_CODE || grantResults.isEmpty()) return
 
         val granted = grantResults[0] == PackageManager.PERMISSION_GRANTED
         val shouldShowRationale = shouldShowRequestPermissionRationale(Constants.POST_NOTIFICATION)
         val permissionDenied = grantResults[0] == PackageManager.PERMISSION_DENIED
 
         when {
             granted -> {
                 mindboxLogI("User clicked 'allow' in request permission")
                 Mindbox.updateNotificationPermissionStatus(this)
                 finishWithResult(isGranted = true)
             }
 
             permissionDenied && !shouldShowRationale -> {
                 if (mindboxNotificationManager.shouldOpenSettings) {
                     if (requestPermissionManager.getRequestCount() > 1) {
                         if (isNeedToRouteSettings) {
                             mindboxLogI("User already rejected permission two times, try open settings")
                             mindboxNotificationManager.openNotificationSettings(this)
                         }
                         finishWithResult(isGranted = false, dialogShown = isDialogLikelyShown())
                     } else {
                         mindboxLogI("Awaiting show dialog")
                         shouldCheckDialogShowing = true
                     }
                 } else {
                     mindboxNotificationManager.shouldOpenSettings = true
                     finishWithResult(isGranted = false, dialogShown = isDialogLikelyShown())
                 }
             }
 
             permissionDenied && shouldShowRationale -> {
                 mindboxLogI("User rejected first permission request")
                 finishWithResult(isGranted = false, dialogShown = isDialogLikelyShown())
             }
         }
     }
 
     @RequiresApi(Build.VERSION_CODES.TIRAMISU)
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         window.decorView.isClickable = false
         window.setLayout(
             ViewGroup.LayoutParams.MATCH_PARENT,
             ViewGroup.LayoutParams.MATCH_PARENT
         )
         requestId = intent?.getStringExtra(EXTRA_REQUEST_ID)
         isNeedToRouteSettings = intent?.getBooleanExtra(EXTRA_ROUTE_TO_SETTINGS, true) ?: true
         mindboxLogI("Call permission launcher")
         requestPermissions(arrayOf(Constants.POST_NOTIFICATION), PERMISSION_REQUEST_CODE)
     }
 
     override fun onResume() {
         resumeTimes.add(SystemClock.elapsedRealtime())
         if (shouldCheckDialogShowing) {
             val duration = resumeTimes.last() - resumeTimes.first()
             val dialogShown = duration >= TIME_BETWEEN_RESUME
             if (!dialogShown && isNeedToRouteSettings) {
                 resumeTimes.clear()
                 mindboxLogI("System dialog not shown because timeout=$duration -> open settings")
                 mindboxNotificationManager.openNotificationSettings(this)
             } else {
                 mindboxLogI("User dismiss permission request because timeout=$duration")
                 requestPermissionManager.decreaseRequestCounter()
             }
             shouldCheckDialogShowing = false
             finishWithResult(isGranted = false, dialogShown = dialogShown)
         }
         super.onResume()
     }
 
     override fun onTouchEvent(event: MotionEvent): Boolean {
         if (event.action == MotionEvent.ACTION_DOWN) {
             finishWithResult(isGranted = false)
             return true
         }
         return super.onTouchEvent(event)
     }
 
     override fun onDestroy() {
         if (!isResultSent && isFinishing && !isChangingConfigurations) {
             finishWithResult(false)
         }
         super.onDestroy()
     }
 
     private fun isDialogLikelyShown(): Boolean = resumeTimes.lastOrNull()?.let { lastResume ->
         SystemClock.elapsedRealtime() - lastResume >= TIME_BETWEEN_RESUME
     } ?: false
 
     private fun finishWithResult(isGranted: Boolean, dialogShown: Boolean = true) {
         RuntimePermissionRequestBridge.resolve(requestId.orEmpty(), isGranted, dialogShown)
         isResultSent = true
         finish()
     }
 }