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