diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9ecc666..72b0f7d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -32,6 +32,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/android/qrcodetransfer/Util.kt b/app/src/main/java/org/fnives/android/qrcodetransfer/Util.kt
index 8123c77..cbb87ad 100644
--- a/app/src/main/java/org/fnives/android/qrcodetransfer/Util.kt
+++ b/app/src/main/java/org/fnives/android/qrcodetransfer/Util.kt
@@ -14,11 +14,14 @@ import android.graphics.Color
import android.icu.text.MessageFormat
import android.net.Uri
import android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS
+import androidx.core.content.ContextCompat
+import androidx.core.content.FileProvider
import com.google.zxing.BinaryBitmap
import com.google.zxing.LuminanceSource
import com.google.zxing.RGBLuminanceSource
import com.google.zxing.common.BitMatrix
import com.google.zxing.common.HybridBinarizer
+import java.io.File
import java.util.Locale
@@ -60,8 +63,8 @@ fun Int.toOrdinal(): String {
}
fun Context.copyToClipboard(text: String) {
- val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager;
- val clipData = ClipData.newPlainText("label", text);
+ val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
+ val clipData = ClipData.newPlainText("label", text)
clipboard.setPrimaryClip(clipData)
}
@@ -76,4 +79,50 @@ fun Context.openLink(link: String) {
} catch (ignored: Throwable) {
}
+}
+
+private val Context.sharedDir: File
+ get() {
+ // must be the same as in filepaths.xml!
+ val cachePath = File(cacheDir, "shared")
+ cachePath.mkdirs()
+ return cachePath
+ }
+
+private val Context.sharedFile: File
+ get() {
+ // must be the same as in filepaths.xml!
+ return File(sharedDir, "qrcode.jpg")
+ }
+
+private fun Context.bitmapToSharedFile(bitmap: Bitmap): Boolean {
+ try {
+ sharedFile.createNewFile()
+ sharedFile.outputStream().use { stream ->
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream)
+ }
+ return true
+ } catch (e: Throwable) {
+ e.printStackTrace()
+ return false
+ }
+}
+
+private fun Context.shareQRCodeImageFile() {
+ // must be the same as in manifest.xml!
+ val contentUri = FileProvider.getUriForFile(this, "${packageName}.fileprovider", sharedFile)
+ ?: return
+
+ val shareIntent = Intent()
+ shareIntent.action = Intent.ACTION_SEND
+ shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // temp permission for receiving app to read this file
+ shareIntent.setDataAndType(contentUri, contentResolver.getType(contentUri))
+ shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri)
+ val chooserIntent = Intent.createChooser(shareIntent, ContextCompat.getString(this, R.string.share))
+ ContextCompat.startActivity(this, chooserIntent, null)
+}
+
+fun Context.shareBitmap(bitmap: Bitmap) {
+ bitmapToSharedFile(bitmap)
+ shareQRCodeImageFile()
}
\ No newline at end of file
diff --git a/app/src/main/java/org/fnives/android/qrcodetransfer/create/CreateQRCode.kt b/app/src/main/java/org/fnives/android/qrcodetransfer/create/CreateQRCode.kt
index 5e70f2b..12b7de0 100644
--- a/app/src/main/java/org/fnives/android/qrcodetransfer/create/CreateQRCode.kt
+++ b/app/src/main/java/org/fnives/android/qrcodetransfer/create/CreateQRCode.kt
@@ -2,6 +2,7 @@ package org.fnives.android.qrcodetransfer.create
import android.graphics.Bitmap
import androidx.compose.foundation.Image
+import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -34,6 +35,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction
@@ -45,6 +47,7 @@ import kotlinx.coroutines.withContext
import org.fnives.android.qrcodetransfer.R
import org.fnives.android.qrcodetransfer.SequenceProtocol
import org.fnives.android.qrcodetransfer.intent.LocalIntentText
+import org.fnives.android.qrcodetransfer.shareBitmap
import org.fnives.android.qrcodetransfer.storage.LocalAppPreferences
import org.fnives.android.qrcodetransfer.toBitmap
@@ -87,6 +90,7 @@ fun QRCodeCarousel(
bitmapIndex: Int,
setBitmapIndex: (Int) -> Unit
) {
+ val context = LocalContext.current
Column(Modifier.fillMaxSize()) {
val imageBitmap = remember(bitmaps, bitmapIndex) {
if (bitmapIndex < bitmaps.size) {
@@ -100,7 +104,8 @@ fun QRCodeCarousel(
Image(
modifier = Modifier
.weight(1f)
- .fillMaxWidth(),
+ .fillMaxWidth()
+ .clickable { context.shareBitmap(bitmaps[bitmapIndex]) },
bitmap = imageBitmap,
contentDescription = "",
contentScale = ContentScale.Fit
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 6c2f867..2dd2872 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -19,4 +19,5 @@
Open
Scan QR Code
Create QR Code
+ Share QR Code
\ No newline at end of file
diff --git a/app/src/main/res/xml/filepaths.xml b/app/src/main/res/xml/filepaths.xml
new file mode 100644
index 0000000..77748b2
--- /dev/null
+++ b/app/src/main/res/xml/filepaths.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file