From d85414b242959b3611247a85171e9f4fb93d5f7d Mon Sep 17 00:00:00 2001 From: Piotr Chmielowski <7473920+pchmielowski@users.noreply.github.com> Date: Fri, 10 Jun 2022 14:23:28 +0200 Subject: [PATCH 01/28] Manifest permissions --- app/src/main/AndroidManifest.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 75369ba1..deaa3708 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,11 @@ xmlns:tools="http://schemas.android.com/tools" package="net.chmielowski.randomchoice"> + + + Date: Fri, 10 Jun 2022 14:34:07 +0200 Subject: [PATCH 02/28] Create file --- .../chmielowski/randomchoice/utils/Camera.kt | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt b/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt index 0719ad6c..bbe2111c 100644 --- a/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt +++ b/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt @@ -5,13 +5,17 @@ import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.graphics.Bitmap +import android.net.Uri +import android.os.Environment import android.provider.MediaStore import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContract import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext +import androidx.core.content.FileProvider import net.chmielowski.randomchoice.R +import java.io.File @Composable internal fun createLaunchCamera(onResult: (Bitmap?) -> Unit): () -> Unit { @@ -28,8 +32,18 @@ internal fun createLaunchCamera(onResult: (Bitmap?) -> Unit): () -> Unit { private class CameraResultContract : ActivityResultContract() { - override fun createIntent(context: Context, input: Unit) = - Intent(MediaStore.ACTION_IMAGE_CAPTURE) + override fun createIntent(context: Context, input: Unit): Intent { + val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + val uri = createFile(context) ?: error("") // TODO@ + intent.putExtra(MediaStore.EXTRA_OUTPUT, uri) + return intent + } + + private fun createFile(context: Context): Uri? { + val directory = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) ?: return null + val file = File.createTempFile("Random Choice", ".jpg", directory) + return FileProvider.getUriForFile(context, "com.example.android.fileprovider", file) + } override fun parseResult(resultCode: Int, intent: Intent?) = if (resultCode == Activity.RESULT_OK) { From 1aacdc1f1e1332b822a919f64e3b36566cd4a07f Mon Sep 17 00:00:00 2001 From: Piotr Chmielowski <7473920+pchmielowski@users.noreply.github.com> Date: Fri, 10 Jun 2022 14:35:38 +0200 Subject: [PATCH 03/28] Crash fix --- app/src/main/AndroidManifest.xml | 10 ++++++++++ .../net/chmielowski/randomchoice/utils/Camera.kt | 3 ++- app/src/main/res/xml/provider_paths.xml | 6 ++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/xml/provider_paths.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index deaa3708..bc085f8e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,6 +39,16 @@ + + + + diff --git a/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt b/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt index bbe2111c..c85a9562 100644 --- a/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt +++ b/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt @@ -14,6 +14,7 @@ import androidx.activity.result.contract.ActivityResultContract import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.core.content.FileProvider +import net.chmielowski.randomchoice.BuildConfig import net.chmielowski.randomchoice.R import java.io.File @@ -42,7 +43,7 @@ private class CameraResultContract : ActivityResultContract() { private fun createFile(context: Context): Uri? { val directory = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) ?: return null val file = File.createTempFile("Random Choice", ".jpg", directory) - return FileProvider.getUriForFile(context, "com.example.android.fileprovider", file) + return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file) } override fun parseResult(resultCode: Int, intent: Intent?) = diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml new file mode 100644 index 00000000..a075ef96 --- /dev/null +++ b/app/src/main/res/xml/provider_paths.xml @@ -0,0 +1,6 @@ + + + + From d23b0c362a930c6d55d94cbea50b36ed852dd6cf Mon Sep 17 00:00:00 2001 From: Piotr Chmielowski <7473920+pchmielowski@users.noreply.github.com> Date: Fri, 10 Jun 2022 14:41:05 +0200 Subject: [PATCH 04/28] Saving file --- .../chmielowski/randomchoice/utils/Camera.kt | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt b/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt index c85a9562..e348a269 100644 --- a/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt +++ b/app/src/main/kotlin/net/chmielowski/randomchoice/utils/Camera.kt @@ -24,28 +24,22 @@ internal fun createLaunchCamera(onResult: (Bitmap?) -> Unit): () -> Unit { val context = LocalContext.current return { @Suppress("SwallowedException") try { - launcher.launch(Unit) + val file = createFile(context) + launcher.launch(file) } catch (e: ActivityNotFoundException) { context.showError() } } } -private class CameraResultContract : ActivityResultContract() { +private class CameraResultContract : ActivityResultContract() { - override fun createIntent(context: Context, input: Unit): Intent { + override fun createIntent(context: Context, input: Uri): Intent { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) - val uri = createFile(context) ?: error("") // TODO@ - intent.putExtra(MediaStore.EXTRA_OUTPUT, uri) + intent.putExtra(MediaStore.EXTRA_OUTPUT, input) return intent } - private fun createFile(context: Context): Uri? { - val directory = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) ?: return null - val file = File.createTempFile("Random Choice", ".jpg", directory) - return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file) - } - override fun parseResult(resultCode: Int, intent: Intent?) = if (resultCode == Activity.RESULT_OK) { intent?.extras?.getParcelableCompat("data") @@ -59,3 +53,9 @@ private fun Context.showError() { .makeText(this, R.string.error, Toast.LENGTH_LONG) .show() } + +private fun createFile(context: Context): Uri? { + val directory = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) ?: return null + val file = File.createTempFile("Random Choice", ".jpg", directory) + return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file) +} From c1d006d5f0989bfd07ede53ac703452805974de4 Mon Sep 17 00:00:00 2001 From: Piotr Chmielowski <7473920+pchmielowski@users.noreply.github.com> Date: Fri, 10 Jun 2022 15:32:53 +0200 Subject: [PATCH 05/28] Read file --- app/build.gradle | 3 +++ .../chmielowski/randomchoice/core/Dilemma.kt | 2 +- .../chmielowski/randomchoice/core/Option.kt | 12 +++------- .../ui/screen/component/MarqueeText.kt | 4 ++-- .../ui/screen/input/InputScreen.kt | 15 ++++++++----- .../chmielowski/randomchoice/utils/Camera.kt | 22 +++++++++---------- 6 files changed, 30 insertions(+), 28 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e26f8e32..1f15447a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -132,6 +132,9 @@ dependencies { implementation "io.insert-koin:koin-androidx-compose:$koin_version" testImplementation "io.insert-koin:koin-test:$koin_version" + implementation "io.coil-kt:coil:2.1.0" + implementation "io.coil-kt:coil-compose:2.1.0" + testImplementation 'junit:junit:4.13.2' testImplementation 'org.robolectric:robolectric:4.9' testImplementation "org.assertj:assertj-core:3.22.0" diff --git a/app/src/main/kotlin/net/chmielowski/randomchoice/core/Dilemma.kt b/app/src/main/kotlin/net/chmielowski/randomchoice/core/Dilemma.kt index 70974990..2cb5f14c 100644 --- a/app/src/main/kotlin/net/chmielowski/randomchoice/core/Dilemma.kt +++ b/app/src/main/kotlin/net/chmielowski/randomchoice/core/Dilemma.kt @@ -45,7 +45,7 @@ internal data class Dilemma(private val options: List