Skip to content

Commit

Permalink
Add steps for closing ML Kit detector handles when the fragment is de…
Browse files Browse the repository at this point in the history
…stroyed
  • Loading branch information
calren committed Jun 22, 2020
1 parent 0aeef1f commit 5930be1
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 0 deletions.
Expand Up @@ -23,6 +23,7 @@ import android.util.Log
import android.widget.Toast
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageProxy
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.MutableLiveData
import com.google.android.gms.tasks.Task
import com.google.mlkit.common.MlKitException
Expand All @@ -38,12 +39,15 @@ import java.lang.Exception
*/
class TextAnalyzer(
private val context: Context,
private val lifecycle: Lifecycle,
private val result: MutableLiveData<String>,
private val imageCropPercentages: MutableLiveData<Pair<Int, Int>>
) : ImageAnalysis.Analyzer {

// TODO: Instantiate TextRecognition detector

// TODO: Add lifecycle observer to properly close ML Kit detectors

@androidx.camera.core.ExperimentalGetImage
override fun analyze(imageProxy: ImageProxy) {
val mediaImage = imageProxy.image ?: return
Expand Down
Expand Up @@ -42,6 +42,7 @@ import androidx.lifecycle.Observer
import com.google.mlkit.codelab.translate.R
import com.google.mlkit.codelab.translate.analyzer.TextAnalyzer
import com.google.mlkit.codelab.translate.util.Language
import com.google.mlkit.codelab.translate.util.ScopedExecutor
import kotlinx.android.synthetic.main.main_fragment.*
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
Expand Down Expand Up @@ -83,6 +84,8 @@ class MainFragment : Fragment() {
/** Blocking camera operations are performed using this executor */
private lateinit var cameraExecutor: ExecutorService

private lateinit var scopedExecutor: ScopedExecutor

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
Expand All @@ -95,6 +98,7 @@ class MainFragment : Fragment() {

// Shut down our background executor
cameraExecutor.shutdown()
scopedExecutor.shutdown()
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Expand All @@ -105,6 +109,7 @@ class MainFragment : Fragment() {

// Initialize our background executor
cameraExecutor = Executors.newSingleThreadExecutor()
scopedExecutor = ScopedExecutor(cameraExecutor)

// Request camera permissions
if (allPermissionsGranted()) {
Expand Down Expand Up @@ -228,6 +233,7 @@ class MainFragment : Fragment() {
cameraExecutor
, TextAnalyzer(
requireContext(),
lifecycle,
viewModel.sourceText,
viewModel.imageCropPercentages
)
Expand Down
Expand Up @@ -78,6 +78,10 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
result
}

override fun onCleared() {
// TODO Shut down ML Kit clients.
}

private fun translate(): Task<String> {
// TODO
return Tasks.forResult("") // replace this with your code
Expand Down
@@ -0,0 +1,19 @@
package com.google.mlkit.codelab.translate.util

import java.util.concurrent.Executor
import java.util.concurrent.atomic.AtomicBoolean

class ScopedExecutor(private val executor: Executor) : Executor {

private val isShutdown = AtomicBoolean()

fun shutdown() {
isShutdown.set(true)
}

override fun execute(command: Runnable) {
executor.execute {
if (!isShutdown.get()) command.run()
}
}
}

0 comments on commit 5930be1

Please sign in to comment.