secant-android-wallet/app/src/androidTest/java/co/electriccoin/zcash/app/test/EccScreenCaptureProcessor.kt

56 lines
1.9 KiB
Kotlin

package co.electriccoin.zcash.app.test
import android.os.Build
import android.os.Environment
import androidx.test.runner.screenshot.ScreenCapture
import androidx.test.runner.screenshot.ScreenCaptureProcessor
import java.io.BufferedOutputStream
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.util.UUID
class EccScreenCaptureProcessor private constructor(private val screenshotDir: File) : ScreenCaptureProcessor {
@Throws(IOException::class)
override fun process(capture: ScreenCapture): String {
screenshotDir.checkDirectoryIsWriteable()
val filename = newFilename(
name = capture.name ?: "",
suffix = capture.format.toString().lowercase()
)
BufferedOutputStream(FileOutputStream(File(screenshotDir, filename))).use {
capture.bitmap.compress(capture.format, DEFAULT_QUALITY, it)
it.flush()
}
return filename
}
companion object {
const val DEFAULT_QUALITY = 100
fun new(): EccScreenCaptureProcessor {
// Screenshots need to be stored in a public directory so they won't get cleared by Test Orchestrator
// This path must be coordinated with the build.gradle.kts script which copies these off the device
@Suppress("DEPRECATION")
val screenshotsDirectory = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "zcash_screenshots").also {
it.mkdirs()
}
return EccScreenCaptureProcessor(screenshotsDirectory)
}
private fun newFilename(name: String, suffix: String) = "screenshot-$name-${Build.VERSION.SDK_INT}-${Build.DEVICE}-${UUID.randomUUID()}.$suffix"
}
}
private fun File.checkDirectoryIsWriteable() {
if (!isDirectory && !canWrite()) {
throw IOException("The directory $this does not exist or is not writable.")
}
}