diff --git a/.gitignore b/.gitignore
index 64cd9da..f9db208 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,5 @@ local.properties
*.code-workspace
/app/release/*
sample-database.zip
+todo.md
+thomas-sample-img
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..c00ae83
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,20 @@
+# Changelog
+
+## [1.1.0] - 2023-03-15
+
+### New features
+
+* Added feature for image import (only via copy)
+* New Screenshots of updated UI with new sample pictures
+
+## [1.0.0] - 2023-02-20
+
+Initial release including:
+
+* Implementation of base application in Kotlin and UI in Jetpack Compose:
+ * Request for folder permission
+ * CRUD for capture image, happiness, diary
+ * Flashbacks, diary view, calendar view and streak-count
+* Room database storage and data export to JSON
+* Dark- / light theme aligned with system design
+* App Logo v1
diff --git a/README.md b/README.md
index 1dff552..1a065c9 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,16 @@
+
+
# OneShot
-
+
**Remember the happy days!**
+
+
OneShot is made to remind you of the special moments. Because every day has at least one. And that's what counts in life! So make it your habit and remember the happy days!
## Features
@@ -14,18 +21,20 @@ It stores your photos in a local folder and your diary within the app. Import an
+Thank's to [@Cynog](https://github.com/Cynog) for providing the beautiful images in the screenshots!
+
## Privacy
Your data is yours!
diff --git a/app/build.gradle b/app/build.gradle
index 3ef2b86..2f651f5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -15,8 +15,8 @@ android {
applicationId "de.ptrlx.oneshot"
minSdk 29
targetSdk 32
- versionCode 1
- versionName "1.0"
+ versionCode 110
+ versionName '1.1.0'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
diff --git a/app/src/main/java/de/ptrlx/oneshot/feature_diary/domain/util/DiaryFileManager.kt b/app/src/main/java/de/ptrlx/oneshot/feature_diary/domain/util/DiaryFileManager.kt
index bf309f6..a606917 100644
--- a/app/src/main/java/de/ptrlx/oneshot/feature_diary/domain/util/DiaryFileManager.kt
+++ b/app/src/main/java/de/ptrlx/oneshot/feature_diary/domain/util/DiaryFileManager.kt
@@ -2,19 +2,15 @@ package de.ptrlx.oneshot.feature_diary.domain.util
import android.content.Context
import android.net.Uri
-import android.util.Log
+import android.os.FileUtils
import androidx.documentfile.provider.DocumentFile
import de.ptrlx.oneshot.feature_diary.domain.model.DiaryEntry
-import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.decodeFromStream
-import kotlinx.serialization.json.internal.readJson
-import okio.use
-class DiaryFileManager(baseLocation: Uri, context: Context) {
- val baseLocation = baseLocation
- val context = context
+
+class DiaryFileManager(val baseLocation: Uri, val context: Context) {
private val baseFolder: DocumentFile? = DocumentFile.fromTreeUri(context, baseLocation)
private var diaryEntryFileRepository = HashMap()
private val baseLocationDocumentPath = baseLocation.encodedPath.toString().substring(6)
@@ -56,7 +52,7 @@ class DiaryFileManager(baseLocation: Uri, context: Context) {
/**
* Create a new dummy file before launching camara activity.
*
- * @param filename
+ * @param filename filename of new dummy
* @return the URI of the dummy file or null if file could not be created
*/
fun createNewImageDummy(filename: String): Uri? {
@@ -64,6 +60,39 @@ class DiaryFileManager(baseLocation: Uri, context: Context) {
return file?.uri
}
+ /**
+ * Copy an image to baseFolder.
+ *
+ * @param srcUri Source Uri of image
+ * @param filename filename of new image
+ */
+ fun copyImage(srcUri: Uri, filename: String): Uri? {
+ val file: DocumentFile? = baseFolder?.createFile("image/jpg", filename)
+ return file?.let { df ->
+ val inStream = context.contentResolver.openInputStream(srcUri)
+ inStream?.let {
+ val uri = context.contentResolver.openOutputStream(df.uri)?.let { outStream ->
+ FileUtils.copy(
+ inStream,
+ outStream
+ )
+
+ outStream.flush()
+ outStream.close()
+
+ df.uri
+ } ?: run {
+ deleteImage(filename)
+ null
+ }
+
+ inStream.close()
+ uri
+ }
+ }
+ }
+
+
/**
* Delete an image from baseFolder.
*
@@ -77,7 +106,7 @@ class DiaryFileManager(baseLocation: Uri, context: Context) {
* Write a JSON export to base location
*
* @param filename
- * @param export JSON String of export
+ * @param entries list of diary entries to export
* @return success of write
*/
fun writeJSONExport(filename: String, entries: List): Boolean {
diff --git a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/DiaryEvent.kt b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/DiaryEvent.kt
index 389b01e..a28fcbc 100644
--- a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/DiaryEvent.kt
+++ b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/DiaryEvent.kt
@@ -1,7 +1,6 @@
package de.ptrlx.oneshot.feature_diary.presentation.diary
import android.app.Activity
-import android.content.Context
import android.net.Uri
import de.ptrlx.oneshot.feature_diary.domain.model.DiaryEntry
import de.ptrlx.oneshot.feature_diary.domain.util.HappinessType
@@ -16,9 +15,10 @@ sealed class DiaryEvent {
val text: String? = null,
val happiness: HappinessType? = null
) : DiaryEvent()
+ data class ImageImport(val uri: Uri): DiaryEvent()
- object WriteExport : DiaryEvent()
- object ReadImport : DiaryEvent()
+ object WriteDBExport : DiaryEvent()
+ object ReadDBImport : DiaryEvent()
object CaptureImageAborted : DiaryEvent()
object CaptureUpdateEntry : DiaryEvent()
object SnackbarDismissed : DiaryEvent()
diff --git a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/DiaryViewModel.kt b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/DiaryViewModel.kt
index 6d22451..36ae7f0 100644
--- a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/DiaryViewModel.kt
+++ b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/DiaryViewModel.kt
@@ -47,7 +47,7 @@ class DiaryViewModel @Inject constructor(
// private var searchQuery: String by mutableStateOf("")
// private var searchEntries: List by mutableStateOf(emptyList())
- var fielManager: DiaryFileManager? by mutableStateOf(null)
+ var fileManager: DiaryFileManager? by mutableStateOf(null)
private set
var currentImageAddEditEntry: DiaryEntry? by mutableStateOf(null)
@@ -77,7 +77,7 @@ class DiaryViewModel @Inject constructor(
var snackbarCause: SnackbarCause = SnackbarCause.DELETE_ENTRY
private set
- var currentIsCapture: Boolean = true
+ var currentIsNewEntry: Boolean = true
private set
init {
@@ -119,10 +119,14 @@ class DiaryViewModel @Inject constructor(
showModalBottomSheet()
Log.d(LOG_TAG, "Image saved")
}
+ is DiaryEvent.ImageImport -> {
+ createNewImageDummyOrImport(copyImageUri = event.uri)
+ showModalBottomSheet()
+ }
is DiaryEvent.CaptureImageAborted -> {
// cleanup created (but empty) file
currentImageAddEditEntry?.let { entry ->
- fielManager?.deleteImage(entry.relativePath)
+ fileManager?.deleteImage(entry.relativePath)
currentImageAddEditEntry = null
}
}
@@ -149,7 +153,7 @@ class DiaryViewModel @Inject constructor(
}
is DiaryEvent.DiaryEditEntry -> {
currentImageAddEditEntry = event.entry
- currentIsCapture = false
+ currentIsNewEntry = false
showModalBottomSheet()
}
is DiaryEvent.FilterHappinessType -> {
@@ -189,21 +193,21 @@ class DiaryViewModel @Inject constructor(
// nothing to do here
}
}
- is DiaryEvent.WriteExport -> {
+ is DiaryEvent.WriteDBExport -> {
if (entries.isNotEmpty()) {
val timestamp = System.currentTimeMillis()
val currentDate =
SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()).format(timestamp)
val filename = "OneShot_DB_$currentDate.json"
- val success = fielManager?.writeJSONExport(filename, entries)
+ val success = fileManager?.writeJSONExport(filename, entries)
snackbarCause =
(if (success == true) SnackbarCause.SUCCESS else SnackbarCause.ERROR)
isSnackbarShowing = true
}
}
- is DiaryEvent.ReadImport -> {
+ is DiaryEvent.ReadDBImport -> {
var success = false
- fielManager?.let { fileManager ->
+ fileManager?.let { fileManager ->
currentImportDatabaseUri?.let { uri ->
Log.d(LOG_TAG, "Importing entries from $uri")
val importEntries = fileManager.readJSONExport(uri)
@@ -243,7 +247,7 @@ class DiaryViewModel @Inject constructor(
diaryUseCases.getSettingsString(imageBaseLocationKey).onEach { uriString ->
Log.d(LOG_TAG, "New element received in GetImageBaseLocationJob")
uriString?.let {
- fielManager = DiaryFileManager(Uri.parse(uriString), context)
+ fileManager = DiaryFileManager(Uri.parse(uriString), context)
}
}.launchIn(viewModelScope)
@@ -289,16 +293,24 @@ class DiaryViewModel @Inject constructor(
* @return Uri that can be used to store an image
*/
fun createNewImageDummy(): Uri? {
+ return createNewImageDummyOrImport(copyImageUri = null)
+ }
+
+ private fun createNewImageDummyOrImport(copyImageUri: Uri? = null): Uri? {
val localDate = LocalDate.now()
val timestamp = System.currentTimeMillis()
val currentDate =
SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()).format(timestamp)
val filename = "OneShot_$currentDate.jpg"
- val uri = fielManager?.createNewImageDummy(filename)
+ val uri = copyImageUri?.let {
+ fileManager?.copyImage(srcUri = copyImageUri, filename = filename)
+ }?: run {
+ fileManager?.createNewImageDummy(filename)
+ }
uri?.let {
- currentIsCapture = true
+ currentIsNewEntry = true
currentImageAddEditEntry = DiaryEntry(
localDate,
timestamp / 1000L,
diff --git a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/AddEditEntry.kt b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/AddEditEntry.kt
index 424ca24..e1f214c 100644
--- a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/AddEditEntry.kt
+++ b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/AddEditEntry.kt
@@ -22,10 +22,12 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import de.ptrlx.oneshot.R
+import de.ptrlx.oneshot.feature_diary.domain.model.DiaryEntry
import de.ptrlx.oneshot.feature_diary.domain.util.HappinessType
import de.ptrlx.oneshot.feature_diary.presentation.diary.DiaryEvent
import de.ptrlx.oneshot.feature_diary.presentation.diary.DiaryViewModel
import java.time.Instant
+import java.time.LocalDate
import java.time.ZoneId
@Composable
@@ -70,7 +72,7 @@ fun AddEditEntryModalBottomSheetContent(
.fillMaxWidth()
.height(670.dp)
) {
- if (!viewModel.currentIsCapture)
+ if (!viewModel.currentIsNewEntry)
Icon(
Icons.Default.Delete,
contentDescription = "delete",
@@ -175,9 +177,17 @@ fun AddEditEntryModalBottomSheetContent(
fun AddEditOrSetLocationButton(
modifier: Modifier = Modifier,
viewModel: DiaryViewModel,
+ hideWhenCaptured: Boolean = false
) {
- if (viewModel.fielManager == null)
- SetLocation(modifier, viewModel = viewModel)
- else
- AddEntryButton(modifier, viewModel = viewModel)
+ var lastEntry: DiaryEntry? = null
+ try {
+ lastEntry = viewModel.entries.last()
+ } catch (e: NoSuchElementException) {}
+
+ if (viewModel.fileManager == null)
+ SetLocation(modifier.padding(top = 4.dp), viewModel = viewModel)
+ else if ((!hideWhenCaptured) || (lastEntry?.date != LocalDate.now()))
+ AddEntryButton(modifier.padding(top = 4.dp), viewModel = viewModel)
+
}
+
diff --git a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/ImageCard.kt b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/ImageCard.kt
index 56958f1..01a3a36 100644
--- a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/ImageCard.kt
+++ b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/ImageCard.kt
@@ -54,7 +54,7 @@ fun ImageCard(
) {
AsyncImage(
modifier = Modifier.fillMaxWidth(),
- model = viewModel.fielManager?.resolveUri(entry.relativePath),
+ model = viewModel.fileManager?.resolveUri(entry.relativePath),
contentDescription = contentDescription,
error = painterResource(R.drawable.ic_baseline_error_24),
contentScale = if (!expanded) ContentScale.Crop else ContentScale.FillWidth,
diff --git a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/ImportImage.kt b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/ImportImage.kt
new file mode 100644
index 0000000..017c50e
--- /dev/null
+++ b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/ImportImage.kt
@@ -0,0 +1,31 @@
+package de.ptrlx.oneshot.feature_diary.presentation.diary.components.common
+
+import androidx.activity.compose.rememberLauncherForActivityResult
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import de.ptrlx.oneshot.feature_diary.presentation.diary.DiaryEvent
+import de.ptrlx.oneshot.feature_diary.presentation.diary.DiaryViewModel
+
+@Composable
+fun ImportImageButton(
+ modifier: Modifier = Modifier,
+ viewModel: DiaryViewModel
+) {
+ if (viewModel.fileManager != null) {
+ val launcher =
+ rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) {
+ it?.let {
+ viewModel.onEvent(DiaryEvent.ImageImport(it))
+ }
+ }
+
+ RoundedButton(
+ modifier = modifier,
+ text = "Import image",
+ onClick = {
+ launcher.launch("image/*")
+ }
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/SetLocation.kt b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/SetLocation.kt
index 8725a79..279f887 100644
--- a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/SetLocation.kt
+++ b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/common/SetLocation.kt
@@ -22,7 +22,7 @@ fun SetLocation(
val launcher =
rememberLauncherForActivityResult(ActivityResultContracts.OpenDocumentTree()) { uri ->
uri?.let {
- viewModel.fielManager?.let {
+ viewModel.fileManager?.let {
val toast =
Toast.makeText(
context,
@@ -38,7 +38,7 @@ fun SetLocation(
RoundedButton(
modifier = modifier,
text = "Set image file path",
- onClick = { launcher.launch(viewModel.fielManager?.baseLocation) },
+ onClick = { launcher.launch(viewModel.fileManager?.baseLocation) },
arrow = arrow
)
}
\ No newline at end of file
diff --git a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/diary/DiaryScreen.kt b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/diary/DiaryScreen.kt
index 199a770..db5fdb4 100644
--- a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/diary/DiaryScreen.kt
+++ b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/diary/DiaryScreen.kt
@@ -24,28 +24,19 @@ fun DiaryScreen(
modifier: Modifier = Modifier,
viewModel: DiaryViewModel
) {
- Box(
+ Column(
modifier = modifier
- .padding(start = 8.dp, end = 8.dp, bottom = 8.dp)
+ .padding(start = 8.dp, end = 8.dp)
) {
- //todo use fab instead
- AddEditOrSetLocationButton(
- modifier = Modifier
- .align(Alignment.BottomCenter),
+ DiaryTop()
+ DiaryEntryList(
+ modifier = Modifier.weight(1f),
viewModel = viewModel
)
- Column(
- modifier = Modifier
- .align(Alignment.TopStart)
- .padding(
- bottom = 64.dp
- )
- ) {
- DiaryTop()
- DiaryEntryList(
- viewModel = viewModel
- )
- }
+ AddEditOrSetLocationButton(
+ viewModel = viewModel,
+ hideWhenCaptured = true
+ )
}
}
diff --git a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/home/HomeScreen.kt b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/home/HomeScreen.kt
index e0b26b1..dc115b5 100644
--- a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/home/HomeScreen.kt
+++ b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/home/HomeScreen.kt
@@ -18,6 +18,7 @@ import de.ptrlx.oneshot.feature_diary.presentation.diary.DiaryEvent
import de.ptrlx.oneshot.feature_diary.presentation.diary.DiaryViewModel
import de.ptrlx.oneshot.feature_diary.presentation.diary.components.common.AddEditOrSetLocationButton
import de.ptrlx.oneshot.feature_diary.presentation.diary.components.common.ImageCard
+import de.ptrlx.oneshot.feature_diary.presentation.diary.components.common.ImportImageButton
/**
* Main Composable for home screen.
@@ -32,13 +33,17 @@ fun HomeScreen(
viewModel: DiaryViewModel,
controller: NavController
) {
+ //todo pull to reload event => reset uri resolver storage; reset viewmodel.now; kill and relaunch jobs; display loading spinner
Column(
- modifier = modifier
- .verticalScroll(rememberScrollState()),
+ modifier = modifier,
verticalArrangement = Arrangement.SpaceBetween
) {
- //todo pull to reload event => reset uri resolver storage; reset viewmodel.now; kill and relaunch jobs; display loading spinner
- Column(verticalArrangement = Arrangement.spacedBy(32.dp)) {
+ Column(
+ modifier = Modifier
+ .verticalScroll(rememberScrollState())
+ .weight(1f),
+ verticalArrangement = Arrangement.spacedBy(32.dp)
+ ) {
HomeTop(
Modifier.padding(start = 8.dp, end = 8.dp),
controller = controller
@@ -47,11 +52,15 @@ fun HomeScreen(
Flashbacks(
viewModel = viewModel
)
+ //todo motivation => fetch motivation api and display daily motivation -> Store in DiaryEntry.motivation
- //todo fetch motivation api and display daily motivation -> Store in DiaryEntry.motivation
}
+ ImportImageButton(
+ Modifier.padding(start = 8.dp, end = 8.dp),
+ viewModel = viewModel
+ )
AddEditOrSetLocationButton(
- Modifier.padding(top = 16.dp, bottom = 8.dp, start = 8.dp, end = 8.dp),
+ Modifier.padding(start = 8.dp, end = 8.dp),
viewModel = viewModel
)
}
diff --git a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/settings/Settings.kt b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/settings/Settings.kt
index 4decbf1..a07c550 100644
--- a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/settings/Settings.kt
+++ b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/settings/Settings.kt
@@ -76,7 +76,7 @@ fun SettingsButtons(
Spacer(modifier = Modifier.size(8.dp))
RoundedButton(
text = "Export database",
- onClick = { viewModel.onEvent(DiaryEvent.WriteExport) },
+ onClick = { viewModel.onEvent(DiaryEvent.WriteDBExport) },
arrow = false
)
Spacer(modifier = Modifier.size(8.dp))
@@ -227,7 +227,7 @@ fun ImportDatabaseButton(
colors = ButtonDefaults.buttonColors(backgroundColor = MaterialTheme.colors.error),
onClick = {
showDialog = false
- viewModel.onEvent(DiaryEvent.ReadImport)
+ viewModel.onEvent(DiaryEvent.ReadDBImport)
}) {
Text("OK", color = MaterialTheme.colors.onError)
}
diff --git a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/stats/StatsScreen.kt b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/stats/StatsScreen.kt
index b96f0e9..a8cbbcd 100644
--- a/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/stats/StatsScreen.kt
+++ b/app/src/main/java/de/ptrlx/oneshot/feature_diary/presentation/diary/components/stats/StatsScreen.kt
@@ -1,7 +1,6 @@
package de.ptrlx.oneshot.feature_diary.presentation.diary.components.stats
import androidx.compose.animation.*
-import androidx.compose.animation.core.FiniteAnimationSpec
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.grid.GridCells
@@ -29,7 +28,7 @@ fun StatsScreen(
) {
Column(
modifier = modifier
- .padding(bottom = 8.dp, top = 8.dp)
+ .padding(top = 8.dp)
// .verticalScroll(rememberScrollState()),
.verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(16.dp),
@@ -163,9 +162,7 @@ fun HappinessCalendarEntry(
color = onColor
)
Text(
- fontSize = 30.sp, color = onColor, text = (entry?.let {
- it.happiness
- } ?: run { HappinessType.NOT_SPECIFIED }).emoticon()
+ fontSize = 30.sp, color = onColor, text = (entry?.happiness ?: run { HappinessType.NOT_SPECIFIED }).emoticon()
)
}
}
diff --git a/assets/preview_1.png b/assets/preview_1.png
deleted file mode 100755
index f263d72..0000000
Binary files a/assets/preview_1.png and /dev/null differ
diff --git a/assets/preview_2.png b/assets/preview_2.png
deleted file mode 100755
index bd2a26f..0000000
Binary files a/assets/preview_2.png and /dev/null differ
diff --git a/assets/preview_3.png b/assets/preview_3.png
deleted file mode 100755
index 3258dca..0000000
Binary files a/assets/preview_3.png and /dev/null differ
diff --git a/assets/preview_4.png b/assets/preview_4.png
deleted file mode 100755
index 8450d9c..0000000
Binary files a/assets/preview_4.png and /dev/null differ
diff --git a/assets/preview_5.png b/assets/preview_5.png
deleted file mode 100755
index 62ac9f9..0000000
Binary files a/assets/preview_5.png and /dev/null differ
diff --git a/assets/preview_6.png b/assets/preview_6.png
deleted file mode 100755
index 38c9872..0000000
Binary files a/assets/preview_6.png and /dev/null differ
diff --git a/fastlane/metadata/android/en-US/changelogs/110.txt b/fastlane/metadata/android/en-US/changelogs/110.txt
new file mode 100644
index 0000000..cdb943b
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/110.txt
@@ -0,0 +1 @@
+* Added feature for image import (only via copy)
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_1.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_1.jpg
index 9ee2f04..28a4d85 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_1.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_1.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_2.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_2.jpg
index 4e9e639..1852e73 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_2.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_2.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_3.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_3.jpg
index 2609377..e6dae2a 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_3.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_3.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_4.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_4.jpg
index 6620d50..e1d6573 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_4.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_4.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_5.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_5.jpg
index 25ef49d..07b0d52 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_5.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_5.jpg differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_6.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_6.jpg
index 915bd73..7a1abc8 100644
Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_6.jpg and b/fastlane/metadata/android/en-US/images/phoneScreenshots/preview_6.jpg differ