Recently Written · git

subread-anki

One tap makes an Anki card on Android: word, definition, sentence, screenshot, audio. Works with any app, with SubRead Dictionary and SubRead Overlay.

git clone https://github.com/equwal/subread-anki

Log | Files | Refs


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 }