app/src/main/kotlin/space/subread/anki/CaptureActivity.kt (2563 bytes)
1 package space.subread.anki 2 3 import android.app.Activity 4 import android.content.Intent 5 import android.content.pm.PackageManager 6 import android.media.projection.MediaProjectionManager 7 import android.os.Build 8 import android.os.Bundle 9 import android.widget.Toast 10 11 /** 12 * Asks Android for the capture and starts [CaptureService] with the answer. It shows nothing 13 * of its own: the dialog of Android is the whole screen. 14 */ 15 class CaptureActivity : Activity() { 16 17 override fun onCreate(savedInstanceState: Bundle?) { 18 super.onCreate(savedInstanceState) 19 val wanted = ArrayList<String>() 20 if (CaptureService.canCaptureAudio && !granted(android.Manifest.permission.RECORD_AUDIO)) wanted += android.Manifest.permission.RECORD_AUDIO 21 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !granted(android.Manifest.permission.POST_NOTIFICATIONS)) { 22 wanted += android.Manifest.permission.POST_NOTIFICATIONS 23 } 24 if (wanted.isEmpty()) ask() else requestPermissions(wanted.toTypedArray(), PERMISSIONS) 25 } 26 27 private fun granted(permission: String) = checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED 28 29 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { 30 super.onRequestPermissionsResult(requestCode, permissions, grantResults) 31 // Without the microphone permission the capture still takes pictures. 32 if (CaptureService.canCaptureAudio && !granted(android.Manifest.permission.RECORD_AUDIO)) { 33 Toast.makeText(this, R.string.capture_no_record, Toast.LENGTH_LONG).show() 34 } 35 ask() 36 } 37 38 @Suppress("DEPRECATION") // The result API of AndroidX would bring AppCompat in for one dialog. 39 private fun ask() { 40 val manager = getSystemService(MediaProjectionManager::class.java) 41 startActivityForResult(manager.createScreenCaptureIntent(), CONSENT) 42 } 43 44 @Suppress("DEPRECATION") 45 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 46 super.onActivityResult(requestCode, resultCode, data) 47 if (requestCode == CONSENT) { 48 if (resultCode == RESULT_OK && data != null) { 49 CaptureService.start(this, resultCode, data) 50 } else { 51 Toast.makeText(this, R.string.capture_denied, Toast.LENGTH_LONG).show() 52 } 53 finish() 54 } 55 } 56 57 companion object { 58 private const val PERMISSIONS = 1 59 private const val CONSENT = 2 60 } 61 }