2021-08-17 09:50:06 +02:00
|
|
|
package be.kuleuven.howlongtobeat
|
|
|
|
|
2021-08-17 12:17:43 +02:00
|
|
|
import android.Manifest
|
|
|
|
import android.graphics.Bitmap
|
2021-08-17 15:58:19 +02:00
|
|
|
import android.net.Uri
|
2021-08-17 12:17:43 +02:00
|
|
|
import android.os.Bundle
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import androidx.activity.result.ActivityResultLauncher
|
|
|
|
import androidx.activity.result.contract.ActivityResultContracts
|
2021-08-17 15:58:19 +02:00
|
|
|
import androidx.core.content.FileProvider
|
|
|
|
import androidx.core.content.PermissionChecker
|
2021-08-17 12:17:43 +02:00
|
|
|
import androidx.core.os.bundleOf
|
2021-08-17 15:58:19 +02:00
|
|
|
import androidx.core.view.isVisible
|
2021-08-17 09:50:06 +02:00
|
|
|
import androidx.fragment.app.Fragment
|
2021-08-17 12:17:43 +02:00
|
|
|
import androidx.navigation.fragment.findNavController
|
|
|
|
import be.kuleuven.howlongtobeat.cartridges.Cartridge
|
|
|
|
import be.kuleuven.howlongtobeat.cartridges.CartridgesRepository
|
|
|
|
import be.kuleuven.howlongtobeat.databinding.FragmentLoadingBinding
|
|
|
|
import be.kuleuven.howlongtobeat.google.GoogleVisionClient
|
|
|
|
import be.kuleuven.howlongtobeat.hltb.HLTBClient
|
|
|
|
import be.kuleuven.howlongtobeat.hltb.HowLongToBeatResult
|
|
|
|
import com.google.android.material.snackbar.Snackbar
|
|
|
|
import kotlinx.coroutines.MainScope
|
|
|
|
import kotlinx.coroutines.launch
|
2021-08-17 15:58:19 +02:00
|
|
|
import java.io.File
|
|
|
|
|
2021-08-17 09:50:06 +02:00
|
|
|
|
2021-08-17 12:17:43 +02:00
|
|
|
class LoadingFragment : Fragment(R.layout.fragment_loading) {
|
|
|
|
|
|
|
|
private lateinit var hltbClient: HLTBClient
|
|
|
|
private lateinit var cartRepo: CartridgesRepository
|
|
|
|
private lateinit var visionClient: GoogleVisionClient
|
|
|
|
|
|
|
|
private lateinit var cameraPermissionActivityResult: ActivityResultLauncher<String>
|
2021-08-17 15:58:19 +02:00
|
|
|
private lateinit var cameraActivityResult: ActivityResultLauncher<Uri>
|
2021-08-17 12:17:43 +02:00
|
|
|
private lateinit var main: MainActivity
|
|
|
|
private lateinit var binding: FragmentLoadingBinding
|
|
|
|
|
2021-08-17 15:58:19 +02:00
|
|
|
private var snapshot: Uri? = null
|
|
|
|
|
2021-08-17 12:17:43 +02:00
|
|
|
override fun onCreateView(
|
|
|
|
inflater: LayoutInflater,
|
|
|
|
container: ViewGroup?,
|
|
|
|
savedInstanceState: Bundle?
|
|
|
|
): View? {
|
|
|
|
binding = FragmentLoadingBinding.inflate(layoutInflater)
|
|
|
|
main = activity as MainActivity
|
|
|
|
|
|
|
|
cartRepo = CartridgesRepository.fromAsset(main.applicationContext)
|
|
|
|
visionClient = GoogleVisionClient()
|
|
|
|
hltbClient = HLTBClient(main.applicationContext)
|
|
|
|
|
2021-08-17 15:58:19 +02:00
|
|
|
cameraActivityResult = registerForActivityResult(ActivityResultContracts.TakePicture(), this::cameraSnapTaken)
|
2021-08-17 12:17:43 +02:00
|
|
|
cameraPermissionActivityResult = registerForActivityResult(ActivityResultContracts.RequestPermission(), this::cameraPermissionAcceptedOrDenied)
|
2021-08-17 15:58:19 +02:00
|
|
|
binding.btnRetryAfterLoading.setOnClickListener {
|
|
|
|
tryToMakeCameraSnap()
|
|
|
|
}
|
2021-08-17 12:17:43 +02:00
|
|
|
tryToMakeCameraSnap()
|
|
|
|
|
|
|
|
return binding.root
|
|
|
|
}
|
|
|
|
|
2021-08-17 15:58:19 +02:00
|
|
|
private fun cameraSnapTaken(succeeded: Boolean) {
|
|
|
|
if(!succeeded || snapshot == null) {
|
|
|
|
errorInProgress("Photo could not be saved, try again?")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
progress("Scaling image for upload...")
|
|
|
|
val bitmap = snapshot!!.toBitmap(main).scaleToWidth(1600)
|
|
|
|
|
2021-08-17 12:17:43 +02:00
|
|
|
MainScope().launch{
|
2021-08-17 15:58:19 +02:00
|
|
|
findGameBasedOnCameraSnap(bitmap)
|
2021-08-17 12:17:43 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private suspend fun findGameBasedOnCameraSnap(pic: Bitmap) {
|
|
|
|
progress("Unleashing Google Vision on the pic...")
|
2021-08-17 15:58:19 +02:00
|
|
|
val cartCode = visionClient.findCartCodeViaGoogleVision(pic)
|
2021-08-17 12:17:43 +02:00
|
|
|
|
|
|
|
if (cartCode == null) {
|
|
|
|
errorInProgress("Unable to find a code in your pic. Retry?")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
progress("Found cart code $cartCode, looking in DB...")
|
|
|
|
val foundCart = cartRepo.find(cartCode)
|
|
|
|
|
|
|
|
if (foundCart == Cartridge.UNKNOWN_CART) {
|
|
|
|
errorInProgress("$cartCode is an unknown game cartridge. Retry?")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
progress("Valid cart code $cartCode, looking in HLTB...")
|
|
|
|
hltbClient.find(foundCart.title) {
|
|
|
|
Snackbar.make(requireView(), "Found ${it.size} game(s) for cart $cartCode", Snackbar.LENGTH_LONG).show()
|
|
|
|
|
|
|
|
// TODO wat als geen hltb results gevonden?
|
|
|
|
val bundle = bundleOf(HowLongToBeatResult.RESULT to it, HowLongToBeatResult.CODE to cartCode)
|
|
|
|
findNavController().navigate(R.id.action_loadingFragment_to_hltbResultsFragment, bundle)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun cameraPermissionAcceptedOrDenied(succeeded: Boolean) {
|
|
|
|
if(succeeded) {
|
|
|
|
makeCameraSnap()
|
|
|
|
} else {
|
2021-08-17 15:58:19 +02:00
|
|
|
errorInProgress("Camera permission required!")
|
2021-08-17 12:17:43 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun tryToMakeCameraSnap() {
|
2021-08-17 15:58:19 +02:00
|
|
|
binding.btnRetryAfterLoading.hide()
|
2021-08-17 12:17:43 +02:00
|
|
|
progress("Making snapshot with camera...")
|
2021-08-17 15:58:19 +02:00
|
|
|
|
|
|
|
if(PermissionChecker.checkSelfPermission(main, Manifest.permission.CAMERA) != PermissionChecker.PERMISSION_GRANTED) {
|
2021-08-17 12:17:43 +02:00
|
|
|
cameraPermissionActivityResult.launch(Manifest.permission.CAMERA)
|
2021-08-17 15:58:19 +02:00
|
|
|
} else {
|
|
|
|
makeCameraSnap()
|
2021-08-17 12:17:43 +02:00
|
|
|
}
|
2021-08-17 15:58:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private fun createNewTempCameraFile() {
|
|
|
|
val tempFile = File.createTempFile("hltbCameraSnap", ".png", main.cacheDir).apply {
|
|
|
|
createNewFile()
|
|
|
|
deleteOnExit()
|
|
|
|
}
|
|
|
|
snapshot = FileProvider.getUriForFile(main.applicationContext, "${BuildConfig.APPLICATION_ID}.provider", tempFile)
|
2021-08-17 12:17:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private fun makeCameraSnap() {
|
2021-08-17 15:58:19 +02:00
|
|
|
createNewTempCameraFile()
|
|
|
|
cameraActivityResult.launch(snapshot)
|
2021-08-17 12:17:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private fun progress(msg: String) {
|
2021-08-17 15:58:19 +02:00
|
|
|
if(!binding.indeterminateBar.isVisible) {
|
|
|
|
binding.indeterminateBar.visibility = View.VISIBLE
|
2021-08-17 12:17:43 +02:00
|
|
|
}
|
|
|
|
binding.txtLoading.text = msg
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun errorInProgress(msg: String) {
|
|
|
|
progress(msg)
|
2021-08-17 15:58:19 +02:00
|
|
|
binding.indeterminateBar.visibility = View.GONE
|
2021-08-17 12:17:43 +02:00
|
|
|
Snackbar.make(requireView(), msg, Snackbar.LENGTH_LONG).show()
|
2021-08-17 15:58:19 +02:00
|
|
|
binding.btnRetryAfterLoading.show()
|
2021-08-17 12:17:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|