From 4d1e9b2d297cf42537abd85a9374298c21e29a07 Mon Sep 17 00:00:00 2001 From: Sayed Owais Ali Date: Tue, 30 Jul 2024 12:56:04 +0530 Subject: [PATCH] NTP-865 | Bottomsheet bug fix (#210) Co-authored-by: Varun Jain --- .../java/com/navi/alfred/AlfredManager.kt | 5 +++- .../com/navi/alfred/utils/CanvasDrawUtils.kt | 3 ++- .../com/navi/alfred/utils/PixelCopyUtils.kt | 23 ++++++++++------ .../com/navi/alfred/utils/ScreenShotUtils.kt | 26 ++++++++++++------- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/navi-alfred/src/main/java/com/navi/alfred/AlfredManager.kt b/navi-alfred/src/main/java/com/navi/alfred/AlfredManager.kt index 4123f4d..961b15a 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/AlfredManager.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/AlfredManager.kt @@ -343,7 +343,10 @@ object AlfredManager { if ( config.getAlfredStatus() && config.getMetricsApiEnableStatus() && - config.getAlfredSessionId().isNotEmpty() + config.getAlfredSessionId().isNotEmpty() && + isAppInBackground.not() && + isActivityResumed && + hasRecordingStarted ) { coroutineDispatcher.executor.execute { val duration: Long = endTime - startTime diff --git a/navi-alfred/src/main/java/com/navi/alfred/utils/CanvasDrawUtils.kt b/navi-alfred/src/main/java/com/navi/alfred/utils/CanvasDrawUtils.kt index 7ca480f..1ef5c47 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/utils/CanvasDrawUtils.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/utils/CanvasDrawUtils.kt @@ -51,7 +51,8 @@ internal suspend fun getScreenShotUsingCanvasDraw( context = AlfredManager.applicationContext, moduleName = AlfredManager.currentModuleName, screenName = AlfredManager.currentScreenName, - scope = AlfredManager.coroutineScope + scope = AlfredManager.coroutineScope, + view = view ) } } else { diff --git a/navi-alfred/src/main/java/com/navi/alfred/utils/PixelCopyUtils.kt b/navi-alfred/src/main/java/com/navi/alfred/utils/PixelCopyUtils.kt index f99ff1e..36f4c3d 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/utils/PixelCopyUtils.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/utils/PixelCopyUtils.kt @@ -35,15 +35,18 @@ fun getScreenShotUsingPixelCopy( ) { if (isViewCaptureNotReady(activity, view)) return - val handlerThread = HandlerThread("PixelCopyThread") - handlerThread.start() - val captureWindow = if (isBottomSheet == false) { activity?.window } else { AlfredManager.dialog?.window } + + if (isWindowCaptureNotReady(captureWindow)) return + + val handlerThread = HandlerThread("PixelCopyThread") + handlerThread.start() + captureWindow?.let { window -> val locationOfViewInWindow = IntArray(2) view.getLocationInWindow(locationOfViewInWindow) @@ -126,13 +129,17 @@ fun onPixelCopySuccess( context = AlfredManager.applicationContext, moduleName = AlfredManager.currentModuleName, screenName = AlfredManager.currentScreenName, - scope = scope + scope = scope, + view = view ) } else { - val bottomSheetView = - AlfredManager.reactBottomSheetView?.get() - ?: AlfredManager.dialog?.window?.decorView?.rootView - if (!AlfredManager.config.getDisableDialogScreenShot() && bottomSheetView != null) { + val bottomSheetView = AlfredManager.dialog?.window?.decorView?.rootView + val bottomSheetWindow = AlfredManager.dialog?.window + if ( + !AlfredManager.config.getDisableDialogScreenShot() && + bottomSheetView != null && + bottomSheetWindow != null + ) { captureBottomSheetUsingPixelCopy( bitmap = bitmap, activity = activity, diff --git a/navi-alfred/src/main/java/com/navi/alfred/utils/ScreenShotUtils.kt b/navi-alfred/src/main/java/com/navi/alfred/utils/ScreenShotUtils.kt index 7faf0e9..b10bbbf 100644 --- a/navi-alfred/src/main/java/com/navi/alfred/utils/ScreenShotUtils.kt +++ b/navi-alfred/src/main/java/com/navi/alfred/utils/ScreenShotUtils.kt @@ -9,7 +9,6 @@ package com.navi.alfred.utils import android.app.Activity import android.content.Context -import android.content.res.Resources import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.Color @@ -17,6 +16,7 @@ import android.graphics.Paint import android.os.Build import android.view.View import android.view.ViewGroup +import android.view.Window import androidx.core.view.isVisible import com.navi.alfred.AlfredManager import com.navi.alfred.db.AlfredDatabaseHelper @@ -47,7 +47,8 @@ internal fun combineScreenshots( context: Context, screenName: String? = null, moduleName: String? = null, - scope: CoroutineScope + scope: CoroutineScope, + view: View ): Bitmap? { if ( backgroundScreenshot == null || @@ -56,15 +57,13 @@ internal fun combineScreenshots( ) { return null } - var screenWidth = Resources.getSystem().displayMetrics.widthPixels / 2 - var screenHeight = Resources.getSystem().displayMetrics.heightPixels / 2 + var screenWidth = view.width / 2 + var screenHeight = view.height / 2 if (!isResolutionEven(screenWidth, screenHeight)) { screenHeight += 1 screenWidth += 1 } - val combinedBitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888) - val canvas = Canvas(combinedBitmap) - canvas.drawBitmap(backgroundScreenshot, 0f, 0f, null) + val canvas = Canvas(backgroundScreenshot) var bottomSheetLeft = (screenWidth - bottomSheetScreenshot.width) / 2f var bottomSheetTop = screenHeight - bottomSheetScreenshot.height.toFloat() if (!isResolutionEven(bottomSheetLeft.toInt(), bottomSheetTop.toInt())) { @@ -72,8 +71,8 @@ internal fun combineScreenshots( bottomSheetTop = (bottomSheetTop.toInt() + 1).toFloat() } canvas.drawBitmap(bottomSheetScreenshot, bottomSheetLeft, bottomSheetTop, null) - insertScreenShotPathInDb(scope, context, combinedBitmap) - return combinedBitmap + insertScreenShotPathInDb(scope, context, backgroundScreenshot) + return backgroundScreenshot } internal fun insertScreenShotPathInDb( @@ -340,7 +339,7 @@ internal fun isResolutionEven(width: Int, height: Int): Boolean { return width.mod(2) == 0 && height.mod(2) == 0 } -fun isViewCaptureNotReady(activity: Activity?, view: View): Boolean { +internal fun isViewCaptureNotReady(activity: Activity?, view: View): Boolean { return activity == null || !view.isVisible || !view.isAttachedToWindow || @@ -349,3 +348,10 @@ fun isViewCaptureNotReady(activity: Activity?, view: View): Boolean { activity.isFinishing || activity.isDestroyed } + +internal fun isWindowCaptureNotReady(window: Window?): Boolean { + return window == null || + window.decorView.width == 0 || + window.decorView.height == 0 || + window.peekDecorView() == null +}