diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 0000000..a1a76cd --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,23 @@ +name: Android CI + +on: pull_request + +jobs: + build: + + runs-on: macos-latest + + steps: + - uses: actions/checkout@v4 + - name: set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 17 + - name: Build android app + run: ./gradlew assembleDebug + - name: Run Unit Tests + run: ./gradlew test + - name: Build iOS shared code + run: ./gradlew :composeApp:compileKotlinIosSimulatorArm64 + diff --git a/composeApp/src/androidMain/kotlin/actual.kt b/composeApp/src/androidMain/kotlin/actual.kt index c4f8f8d..bdb8684 100644 --- a/composeApp/src/androidMain/kotlin/actual.kt +++ b/composeApp/src/androidMain/kotlin/actual.kt @@ -1,14 +1,19 @@ +import android.content.ContentResolver import android.graphics.BitmapFactory +import android.net.Uri import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.platform.LocalContext import com.darkrockstudios.libraries.mpfilepicker.FilePicker +import com.darkrockstudios.libraries.mpfilepicker.MPFile import com.mikepenz.markdown.m3.Markdown import kotlinx.coroutines.launch import kotlin.io.encoding.Base64 import kotlin.io.encoding.ExperimentalEncodingApi + actual fun ByteArray.toComposeImageBitmap(): ImageBitmap { return BitmapFactory.decodeByteArray(this, 0, size).asImageBitmap() } @@ -29,15 +34,29 @@ actual fun ImagePicker( onImageSelected: ImageFileImported, ) { val coroutineScope = rememberCoroutineScope() + val contentResolver = LocalContext.current.contentResolver val fileExtensions = listOf("jpg", "png") FilePicker(show = show, fileExtensions = fileExtensions) { file -> coroutineScope.launch { - val data = file?.getFileByteArray() - data?.let { - val base64EncodedImageData = Base64.encode(data) - onImageSelected(file.path, base64EncodedImageData) + file?.let { + val data = getImageByteArray(file, contentResolver) + data?.let { + val base64EncodedImageData = Base64.encode(data) + onImageSelected(file.path, base64EncodedImageData) + } } } } } + + +fun getImageByteArray(file: MPFile, contentResolver: ContentResolver): ByteArray? { + val uri = Uri.parse(file.path) + val stream = contentResolver.openInputStream(uri) + stream?.let { + val bytes = stream.readBytes() + stream.close() + return bytes + } ?: return null +} \ No newline at end of file