From 042d5cf1a718631d4f2393453b33874fd8043d5b Mon Sep 17 00:00:00 2001 From: Damian Zaremba Date: Sun, 31 Aug 2025 15:06:51 +0000 Subject: [PATCH] Initial application logic --- .github/workflows/ci.yaml | 41 ++++ .github/workflows/release.yaml | 72 +++++++ .gitignore | 15 ++ LICENSE | 21 ++ README.md | 11 +- app/.gitignore | 1 + app/build.gradle.kts | 99 ++++++++++ app/proguard-rules.pro | 21 ++ app/src/main/AndroidManifest.xml | 30 +++ app/src/main/ic_launcher-playstore.png | Bin 0 -> 18162 bytes .../message_decoder/MainActivity.kt | 21 ++ .../message_decoder/MessageProcessor.kt | 62 ++++++ .../message_decoder/ui/Screen.kt | 148 ++++++++++++++ .../message_decoder/ui/Theme.kt | 33 ++++ .../res/drawable/ic_launcher_foreground.xml | 16 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1390 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 1136 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 3322 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1008 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 752 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 2146 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1414 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 1476 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3876 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2806 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 2160 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 6878 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3150 bytes .../ic_launcher_foreground.webp | Bin 0 -> 2796 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 8762 bytes app/src/main/res/values/colors.xml | 10 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/themes.xml | 5 + app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ build.gradle.kts | 6 + gradle.properties | 23 +++ gradle/libs.versions.toml | 32 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++++++++++++ gradlew.bat | 89 +++++++++ settings.gradle.kts | 23 +++ version.properties | 2 + 47 files changed, 1019 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/ci.yaml create mode 100644 .github/workflows/release.yaml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/eu/sailwithdamian/message_decoder/MainActivity.kt create mode 100644 app/src/main/java/eu/sailwithdamian/message_decoder/MessageProcessor.kt create mode 100644 app/src/main/java/eu/sailwithdamian/message_decoder/ui/Screen.kt create mode 100644 app/src/main/java/eu/sailwithdamian/message_decoder/ui/Theme.kt create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle.kts create mode 100644 version.properties diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..469abaa --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,41 @@ +name: CI +on: { pull_request: { } } +concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Setup Java + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: 17 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Build apk + run: | + ./gradlew assembleRelease + + - name: Build aab + run: | + ./gradlew bundleRelease + + - name: Upload apk + uses: actions/upload-artifact@v4 + with: + name: message-decoder.apk + path: ./app/build/outputs/apk/*/*.apk + retention-days: 7 + + - name: Upload bundle + uses: actions/upload-artifact@v4 + with: + name: message-decoder.aab + path: ./app/build/outputs/bundle/*/*.aab + retention-days: 7 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..816db66 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,72 @@ +name: Release +on: { push: { branches: [ main ], tags: [ 'v*' ] } } +concurrency: + group: ${{ github.head_ref || github.ref }} + cancel-in-progress: true +permissions: + contents: write +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - name: Setup Java + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: 17 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Setup android keystore + run: | + base64 -d <<<'${{ secrets.ANDROID_SIGNING_KEY_STORE }}' > android.jks + echo "ANDROID_KEYSTORE_PATH=$GITHUB_WORKSPACE/android.jks" >> $GITHUB_ENV + # Once the path is set, we need to be able to load it + echo "ANDROID_KEYSTORE_PASSWORD=${{ secrets.ANDROID_SIGNING_KEY_PASSWORD }}" >> $GITHUB_ENV + echo "ANDROID_KEYSTORE_KEY_NAME=Github CI" >> $GITHUB_ENV + echo "ANDROID_KEYSTORE_KEY_PASSWORD=${{ secrets.ANDROID_SIGNING_KEY_PASSWORD }}" >> $GITHUB_ENV + + - name: Update version code + run: | + ./gradlew increaseVersionCode + + git config user.email "ci-update-version-code[bot]@users.noreply.github.com" + git config user.name "ci-update-version-code[bot]" + + git add version.properties + git commit -m 'Increase version code' + + git push origin ${{ github.ref }} + if: "!startsWith(github.ref, 'refs/tags/')" + + - name: Update version.properties for release + run: | + sed -i 's/VERSION_NAME=.*/VERSION_NAME='${GITHUB_REF##*/}'/g' version.properties + sed -i 's/VERSION_CODE=.*/VERSION_CODE=1/g' version.properties + if: "startsWith(github.ref, 'refs/tags/')" + + + - name: Build apk + run: | + ./gradlew assembleRelease + + - name: Build aab + run: | + ./gradlew bundleRelease + + - name: Publish beta release + run: | + ./gradlew publishReleaseBundle --track 'internal' --release-name '${{ github.sha }}' + env: + ANDROID_PUBLISHER_CREDENTIALS: '${{ secrets.ANDROID_PUBLISHER_CREDENTIALS }}' + if: "!startsWith(github.ref, 'refs/tags/')" + + - name: Publish named release + run: | + ./gradlew publishReleaseBundle --track 'production' --release-name "${GITHUB_REF##*/}" + env: + ANDROID_PUBLISHER_CREDENTIALS: '${{ secrets.ANDROID_PUBLISHER_CREDENTIALS }}' + if: "startsWith(github.ref, 'refs/tags/')" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1524cdf --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Sailing with Damian + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index fab2e2b..021a63f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,9 @@ -# message-decoder -Message decoder for InReach Proxy +# Message Decoder + +This project supports decoding of multi-part messages sent via inreach-proxy. + +Expected input format: +`m:grib:1:2:Awetwet==` +`m:grib:2:2:Awetwet==` + +Output: `GRIB` file saved to storage. diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..741f9a6 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,99 @@ +import java.io.FileInputStream +import java.util.Properties + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) + id("com.github.triplet.play") version "3.12.1" +} + +val versionProperties = Properties().apply { + load(FileInputStream(rootProject.file("version.properties"))) +} + +val signingKeystorePath = file(System.getenv("ANDROID_KEYSTORE_PATH") ?: "keystore.jks") + +android { + namespace = "eu.sailwithdamian.message_decoder" + compileSdk = 35 + + defaultConfig { + applicationId = "eu.sailwithdamian.MessageDecoder" + minSdk = 33 + targetSdk = 35 + versionCode = versionProperties["VERSION_CODE"].toString().toInt() + versionName = versionProperties["VERSION_NAME"].toString() + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + signingConfigs { + if (signingKeystorePath.exists()) { + create("release") { + storeFile = signingKeystorePath + storePassword = System.getenv("ANDROID_KEYSTORE_PASSWORD") + keyAlias = System.getenv("ANDROID_KEYSTORE_KEY_NAME") + keyPassword = System.getenv("ANDROID_KEYSTORE_KEY_PASSWORD") + } + } + } + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + if (file(signingKeystorePath).exists()) { + signingConfig = signingConfigs.getByName("release") + } + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = "11" + } + buildFeatures { + compose = true + } + bundle { + storeArchive { + enable = true + } + } +} + +dependencies { + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) +} + +tasks.register("increaseVersionCode") { + doLast { + versionProperties["VERSION_CODE"] = + (versionProperties["VERSION_CODE"].toString().toInt() + 1).toString() + rootProject.file("version.properties").writer().use { writer -> + versionProperties.store(writer, null) + } + } +} + +play { +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..cbaaab9 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..819c7f78e075665a78029c6af7abe6c1863f5460 GIT binary patch literal 18162 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�_@i# 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: String? { + val downloadsDir = + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + if (!downloadsDir.exists()) { + downloadsDir.mkdirs() + } + val fileName: String = DateTimeFormatter.ISO_INSTANT.format(Instant.now()).replace(":", "-") + .replace(".", "-") + "." + messages[0].type + val outputFile = File(downloadsDir, fileName) + + messages.joinToString(separator = "") { it.payload } + + try { + FileOutputStream(outputFile).use { fileOutputStream -> + val encodedPayload = messages.joinToString(separator = "") { it.payload } + val compressedBytes = Base64.getDecoder().decode(encodedPayload) + val byteInputStream = ByteArrayInputStream(compressedBytes) + InflaterInputStream(byteInputStream).use { inflater -> + val buffer = ByteArray(1024) + var bytesRead: Int + while (inflater.read(buffer).also { bytesRead = it } != -1) { + fileOutputStream.write(buffer, 0, bytesRead) + } + } + } + } catch (e: Exception) { + e.printStackTrace() + return null + } + return outputFile.name +} + +fun DecodeMessage(input: String): Message? { + val parts = input.split(":") + if (parts.size != 5 || parts[0] != "msg") { + return null + } + return Message( + type = parts[1], + number = parts[2].toInt(), + total = parts[3].toInt(), + payload = parts[4] + ) +} diff --git a/app/src/main/java/eu/sailwithdamian/message_decoder/ui/Screen.kt b/app/src/main/java/eu/sailwithdamian/message_decoder/ui/Screen.kt new file mode 100644 index 0000000..4d83245 --- /dev/null +++ b/app/src/main/java/eu/sailwithdamian/message_decoder/ui/Screen.kt @@ -0,0 +1,148 @@ +package eu.sailwithdamian.message_decoder.ui + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import eu.sailwithdamian.message_decoder.DecodeMessage +import eu.sailwithdamian.message_decoder.ExportMessages +import eu.sailwithdamian.message_decoder.Message + +@Composable +fun DecoderScreen() { + val messages = remember { mutableStateListOf() } + val inputMessage = remember { mutableStateOf("") } + + val alertMessage = remember { mutableStateOf("") } + val showAlert = remember { mutableStateOf(false) } + + Scaffold { padding -> + Column( + modifier = Modifier + .padding(padding) + .fillMaxSize() + .padding(32.dp), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + OutlinedTextField( + value = inputMessage.value, + onValueChange = { newText -> inputMessage.value = newText }, + label = { Text("Enter message") }, + modifier = Modifier.fillMaxWidth() + ) + Spacer(modifier = Modifier.height(20.dp)) + Button( + onClick = { + if (inputMessage.value.length > 0) { + val decodedMessage = DecodeMessage(inputMessage.value); + if (decodedMessage == null) { + alertMessage.value = "Failed to decode message" + showAlert.value = true + } else { + val expectedMessageNumber = messages.size + 1; + var messageIsValid = false; + + if (messages.size == 0) { + if (decodedMessage.number != 1) { + alertMessage.value = "Expected first message, got ${decodedMessage.number}" + showAlert.value = true + } else { + // First message - setup + messageIsValid = true; + } + } else { + // Not first message - verify in sequence + if (decodedMessage.number != expectedMessageNumber) { + alertMessage.value = "Invalid Message - Expected index ${expectedMessageNumber} got ${decodedMessage.number}" + showAlert.value = true + } else if (decodedMessage.type != messages[0].type) { + alertMessage.value = "Invalid Message - Expected type ${messages[0].type} got ${decodedMessage.type}" + showAlert.value = true + } else { + messageIsValid = true; + } + } + + if (messageIsValid) { + // Valid message - add to array + messages.add(decodedMessage) + if (decodedMessage.number == decodedMessage.total) { + // Last message - process + val outputFileName = ExportMessages(messages) + if (outputFileName == null) { + alertMessage.value = "Failed to write message" + showAlert.value = true + } else { + alertMessage.value = "Output to ${outputFileName}" + showAlert.value = true + } + messages.clear() + } + } + } + inputMessage.value = "" + } + }, + modifier = Modifier.size(width = 1000.dp, height = 100.dp) + ) { + Text("Add") + } + Spacer(modifier = Modifier.height(20.dp)) + LazyColumn( + modifier = Modifier.weight(1f) + ) { + item { + if (messages.isNotEmpty()) { + Column { + Text("Expected Messages: ${messages[0].total}") + Text("Current Messages: ${messages.size}") + } + } else { + Text("Waiting for first message") + } + } + } + Spacer(modifier = Modifier.height(20.dp)) + Button( + onClick = { + messages.clear(); + }, + modifier = Modifier.size(width = 1000.dp, height = 100.dp) + ) { + Text("Reset") + } + if (showAlert.value) { + AlertDialog( + onDismissRequest = { }, + confirmButton = { + TextButton(onClick = { + showAlert.value = false + }) { + Text("OK") + } + }, + text = { Text(alertMessage.value) } + ) + } + } + } +} diff --git a/app/src/main/java/eu/sailwithdamian/message_decoder/ui/Theme.kt b/app/src/main/java/eu/sailwithdamian/message_decoder/ui/Theme.kt new file mode 100644 index 0000000..3416d5c --- /dev/null +++ b/app/src/main/java/eu/sailwithdamian/message_decoder/ui/Theme.kt @@ -0,0 +1,33 @@ +package eu.sailwithdamian.message_decoder.ui + +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Typography +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +@Composable +fun DecoderTheme( + content: @Composable () -> Unit +) { + MaterialTheme( + colorScheme = lightColorScheme( + primary = Color(0xFF6650a4), + secondary = Color(0xFF625b71) + ), + typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + ), + content = content + ) +} diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..f91f949 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..ac94b34 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..ac94b34 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..59ca1c034886a0cfc10ac954efbf3b25073f4217 GIT binary patch literal 1390 zcmV-!1(EtvNk&Fy1pok7MM6+kP&iCk1pojqN5Byfrv^EaBt??P(hK#MZMERTK_TGO zw(VM3^L}#9Ab<)#=%z;i2Izh|up`-a8qK`-0C{g?P}s`K{i!wzmIF7oZCA~@AMb4= z5JN-8twnH#bY%c~wxo^+= zN#`BVDoOw?ZKtE-;Hk!H(q(nTbY|Wx75w<#>|X=Q7l=BH2Ts0B(@^@??93y zDXAK6&=Hr}5`W#oZRKK|gN4~6QvzEcYB^uzn_sG@k)d*5@S z9(Y%sl%o1>6l^c}5ud7)MJWy+em(G`Ey2%ZF_M2ZXpi@KQ4+PG*GAb>_l+z@hF-4Y z@I@u$N>;*4Jie-cJ+r2JGpiNwf(Qx}yJ7?pMJFPOXSxj@`Mw>d47N-qt%f~L4<>Dr zfO{@MXl2e0V@(K{_K0`}(gcVvILdN#QGx*JJH?ah$XNN#JxFtCK^lP8l#{UAXjE1# zc*DY3Y)z^4hLp<+ttkT3u8RQS>#Zr#sC=c%4i+yBAYNdja#cy*>j2avqsKv4*Lc2VxU ziU82Nl~UWHCARKTsy|BrT(OhRY)^$4m&RzLR4WU4B>})I>BFMx(bjSmGJ^K)Rz}gKkuOGT$@kR?E<_+6ad^RqJD0hNRVkQ&}{Gs zqqmm1G2J@Bgv~-JLmqvj2 z>?7=Rl zlI?a=+qMk@uPO8!I5PkM00AC^2m}B^1O$K&q5#3Z0zw1<2tXkMevr<=a8ZCke0cC< z!oy!53edPP6a@&tu2&kN0K#|yWJ{85+Sc4Ywr$(CZQItK|Nn5;SR1{1uIqav`VYa4 zBt?>YX6Y8{sImG3$_2}R|NSQCNh=$k-#&TPvOJ$`&-aw2dE7&K^YVp`tz0ZOq`HBe z;R794c|RD=GFzyA`%A}P-qx!_#!48v(x`IPlVIkpu}2-HgrAO9=H})G=jP_tj-J9g zN_p%G7{^<88Tq-_tKCJ3Q36XW9bCPR{M5@juUYbTb%gS9JdhW2cm)H;A38$W%rl5@ z;5AZBHkln~jMG2(?Lx z2|B*CblZyjTk&_;E1Z{h{<>qzRxf-mCxHV_TDAoop7N5P)AmOz9f-N+!4~th*NAf~ zIrh#~?Rcdp_MXjNgu{SyDj55@q_v)n{RqzRA5*rbq0OUWmMa3wjidWIVrw`iXg??{ z&xUwHD-;Uj39LaLVbaej`I2Y7a+Io<#|veBoN;BpjRClMl|k4Cur;y0%5iGM*6{l1 z4A?%%L%?JEoKCuK-m9<|R0LFTPxi1f$!g$D*@7i23M&0U_EWu7>SWziqe!S4SzlH$ z30w-xiiTR21CjudF*yoLB9bIKfo(*?$w#3>5m6oTDoCS8TTcB{{Ia*-LNlXrB~&OX zszSDCArkd+u;wM>mBYGf66->vBBNS_bq-l?mYX1*pcucurBE2wmPtiNO^O)XDIAE- zUN)iZ56cdN)OX9VBBYMR)N3k%25lJt!*(Pa2rP=eN*<-Wuo!PT&vRxuSCrJX<;>%_ zL~U6mwJM@abX=LxO{!ZcCh4sdkt!0p95*kXnMf*;s!<}HG`gbdH1Q(s4Siwa!>a!c z{IHQ!TH&{Xei=(Wj4tSUn4~R(L$_rl{Q)?1e}JV=g@*1^vGhyP(EU=DzC9YcZ_hG5 zLPL*_SjL#l&ph+cjMKru<8+?64lwXs2hV&F7i!NYFJ1vUMCJ=sFJDS{M*=EsSnG5eT`S$hRho16-3OT-U|{u4^;q z2EgEQ132?5P;mJbq&X^}Rt%P-LYwD!Cv z4SH{p`|Zzi!98v+w@>iCE#Q88E!}Uws_X6fb+vudXNwJ~F1Gi4L+(9y!SdgKzkw*q Ci6s&M literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..6b8962a0740050f84b60971ceb6eb3a0ed6ba7fa GIT binary patch literal 3322 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 E05^?ZTmS$7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..3ff1b996f2e4bc875ef66319a8169903bffc6fc7 GIT binary patch literal 1008 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 YrJ#{|8bbuo31Hs4f2h&($bs%V0b8*&SO5S3 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c411e1142a4b229f03d928df9878067745b85b85 GIT binary patch literal 1414 zcmV;11$p{XNk&F~1pok7MM6+kP&iC+1pojqU%(d-*9IYyB-u*VzV|=@N|22nyxjXv z5s)LZ*ePPAP@2+1k&;#v-8qBup`-4t@PUG3N8Ua{vnVEB;oRTWy7s)TeULJ z!`>5YPev0R{9z7X-9IKr0** zM6zw~Fc2g`lw-Nnw20<$tz;&dtgB{K`A2os`bL_x9RxH%+8)qG)|r-WN!_3#U@!<{ z$M~o`A*!e!bR~mS1B2WSL_l_^ug#4tG_0-v)qw%WJ|VM4pC|k87L)%{cJKbX6|cMJ zvF4?|E$4%Em^PZ1HZ@|DhI!3xsIqY}bDr;Me>FNcdrysAr>Qzy?P^DkX>RJAFam-g zh-K*U|F%vnb55B%Rhj;@UTK_>hazDR1cET1bqVpQYB&XSBj`Od#JE3px-3X1ROjDu zSL^ltV_W`bKdMsRo5L~A<+-`pe(AcJ!GMeUsv@O;u|ozyP(qzr5l{e$D&ZQHhOoBPifaD-<7=00Uk9MNqUIn5fcXbtCt$+7ikuRa(-rYG^XiEa7U53QAK>^kTjs?Yzfy$boF`(Gq zKj`X`_ zdHROKNX0vC0Nd#U`kx_ypl$;M>VNqEVvF-*Es;-Gp)&;T4@=_*Z zjomoAt8;`>%YmH8R~#X+>M|5x6?BvWOuAlz9*|V2njg2KM32x{88dwzX|{}st|aWo zxg^c2=}efAQgRV#wv1_M>7}H|^HLN8#-*CPEGcdll(eGwLQ>o*&eO)*&ZKlCFntnt zPH~G-kiHob*6w7x>6DD#KPh(R5@$V0`eNwwsxEf3xeXeeB}lUiN)wJ)K$=%*NVnc% z`|7Ptv1cF+i?NeQbrokRb}LP{GB|8YBWxgEr@WtXOC-)h>{T{VOw!%P`dADtz&Y8{ zkE;oxfW=w^k4e5k%AAWWpe>i@W1~>a@}-Tn6R|`_hrqJKIvW}0duwZ=*D1Axh9#xY z3pwkq+Ry0|xW3AGE_7Teb)>l;$5TqlrGg`9pTa$DAH$jvtb+dV@;c8ZseV#joo9Iy z{jI7AD*NbbGSd6|fypja?cD|bi2$eTUm#xsny=0y=BvLzxd6OeYrK^KTN-24H>lqs&x#||1$2rqWYU*<@c!l&u?6S!8v|pl>6PVCZg@C zGyKlW7tD2U^D{GhMEm*AGkSa70}N|}i^TLCIcvq5)gDt_Z{@5J zyVU%Rt5!!Fqdm-{8v%{05n#@5&!@I literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..660218940f47858939722bd50c287671e2ef2842 GIT binary patch literal 1476 zcmV;#1v~muNk&Gz1pok7MM6+kP&iDl1pojq*T6Lp7sQ}#8$sqz`tH7Y4)Z_%3fs1A zLzUF6$Zgvu9k&3~H!#kE90(zR2mmw$LJ+`kqS+pR+rtC^qW(CT2mpLI9yY*4cyL|_ zP~ccKw`Vb*``3U2vEYYWWZQs(!nN&b+svUcGcz+YGc#{xW=v9U>Yu(NDT&_qk@jKr z+7bPS#72@L$#t;2JqI(5HUG$4vFN`=|NWhB%lW%cn!A3C)%@6kGoodOkr=zj82v3hV)0(>jiQTC5+*sj2neDHpVuC1! zt**Otv>~C2nIA_p4s)!=OAD2r^ywWDxh!`?4*2%2$=Ry0MRUk8i4_ zh?~wnY#giQAN1r zDX9`+zgrX@OeJP5H`m%L^4g@oN|C2R!67zR*-y=UIhnD%^FG-+V=i~YW@k7tVZQWc zCq>EA#C%~QIHCsnz`QH{x`V3pNt<~memm=e&(E>R;OU4k&W#v1Amrg~=!{Js=Y%xU z#JCBa0o=yn*r0z~L>>pz*bu`3`*XFb>iclc!hz>X z(fHwl&#v7T>UZDb-|^PM4)(wR{>KK>Grp~s`dwE`7^MD4yG>8nfcdVbH+pX6F!w^0 z+9=_Q=Y|dX8L*F+X(r-DGO6kKnZ@%U*1Z(rM&zZb#)DTEHC+~t#B?#BwHzi4&&cqU zF+5=ct5s1jG>F=>5l^zh@IDO%$Om<;7OrHq;rMwAsk329uifm9_>u#9jb|#r$ad>> z(JR84T+!>Ozp^N9#F|GDZ}Lpvz8fh0lSREjRN$_lH|oZi>+3cykQS9dN#Am@T=b_;($G;M-G0?fCqTF0sEK(RyL z&VceNZv=(B0r|FOO8d3##IaNRR$PHm#rYE9kXDS!PLJj!l9QSq){a!Pnp*}*Mythz zU7S5lR5t~Q+|)Mq9_PNVQEhN{Eta(lAZIc~xyLAvnZcvadFW z{Ka8cuDS2Z9V$y3i67!Hvh>;uD{)MaF%LvTOuDhD>u>c0?nlRKvSHOO3ic z%e?=A7Y^V*U~(()mjm^UVm6&NsuD zA4rIDejvzvPC~Al&$*(g&%dQZIsX=AzBC=e`O-M^+sP2lZ^v1WK!$ET0@C^sDs<~d zkkx&WBgA<@x z501Hh-#(J{`>6RAtXJ$w@-4vT$FN=NpvaGbo6p2Hf_x^(`DZM%pMM5BUy$89?dJ;u z&+lY)tF7mEg3rfg^G$8%<8na$G>a7j%lXsXknhe`rOk4_J8$JD^j1DeZ{`2=R=!qm z<=6F9K4fp@uXb3z@qXfbPcm(G_l`)aeN&Tn$WSLdVg)%k-wb-pKG eouA7`=Tker&O7J76FIsi@>VSRZ_$5$;}ZZUjR9`} literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..d9dc76f54133df4b71d7497546d0b0746015cdc9 GIT binary patch literal 3876 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..38765bea881b9c9ae427155e479f9fe081425945 GIT binary patch literal 2806 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..cdea376ffb83c54134a3c6f37f6167f5865293a2 GIT binary patch literal 2160 zcmV-$2#@ztNk&F!2mkK((P9S!pQkA=f9l)a{kLTtTv@*?lR_zRE9Oi z%uMM>&=E;YTekD|3z=cuy}fhUv_vGJNSdP;WftS2HDS=uG`{coH<|SaAFLU#2n-q) zos;gxv$KmD0)V!qm%dAvGsWYoRFDD`lmU+Bb?Xsdlc*N_t?B6v_DN+ zW*9HG_~I}PYcf2?{R?Ym4T_9n&>jvyW_X4*4Spv+`B5fc^p}TMwj@MWqOrvuewoRS zz@y1=Uo&(=I*(KH`m>!wxY=fq#Q6^YQoj9*bm-m1B^CK@Dph?fyY8*A*Jk7~ zEL~^3ca&e~6DB#?l6tYJm}iCw`@%^xZrm44{N&&_dtWW%cKm4vf2}@E#4ontr&PK( z!aLFMo;pvnAqHObfK>Xw~&}Xr{UGC!qhPdWU&$M0slZNS(;O z`af!({q-XI5nfL#PegoysCu-`t~4fh%Rj=p($);sgWN5!t$rWo22k2oqVIJlq}Zv#wXROeZs4>eW$9~ z$B{PKzNprYq=a|rlvQ<)aJJw|uc`K@gqP`*YVS3R(puFe`h>S>tGd8ilyf$}6jziK zUZ<0a>#-Q;b~+W)Uhn&a_vxvs2{MGUj3p-}ZKFUy8`V^82|imDwfW{k3<@_ZYW9Wr z7NUf-BSK@K^>xKh)Bw8WPlZlaeo4n-XgcV^$V?YVXhlc; z6S8%Y@$-sitH7d2F}GvmxJ*{e9F~BgjbfH@GOlIvkLdo^m_S3DpQIa6RMtq+UV(?+ zE6FgRRQ#Y9qD(-<(92hTSV;0t&>e*lfruWVyD(cI8J48e0uxQ&I`L&4B4_9k+fcFe zfEy6q`tJv6lR!mVdIP@(kK=T+GJ#9N(EUI>qr4`~5V+_W^c-CU8r$ew8ss69XC)N| zO=(1boFtIZljsiyi*@u(hT_;*`bJ2zu&mF!MQ+wl7TD-n^iqKc67BRT0-Z{F{ftFo zKWQ~QdNs))8Tm0;8r9%q$Rg>n#bK$W92Z=%Ekj0exJ2qfsE4!%$42RQ@(v9O5VD5y z6^2EU{u=Y*g?#iB6wZ=s99uAIc}LEAqPX-k^6p^;Mw-0CTU&v_xTGvW$x12=o@vAi zlq{Z!#RudaUFD->Ead?N$#0Z-0wrz8Mb@ ziZnXzc`2W$vQvKx+rZ z{1tSNGJw_q5cH}5w0bB{10n5~4un~b!Ga*c#W)%dg7lFnWDm>0(2FwG{0@CYA`^K1zQ3 zMQZ@m90Xcn;8gyfY{@%TavQ)LeqZs;eA0uw;kQyLH+#I8) zEj?@YEqzR;gEc$T5tA)q&CV9ZWZYP@Gj1_iOV;SDWlrXoGdlB|lRf8*&Yt%$5Ezpg z2th0k#$*;p5EF(mnF$lbCSpux69qA{7?(&eBP)s3#uvkYXY$L9a%%ja6wIl`0LIg-|W z!xGwk)7HVn657EO*9FFr*#%bDNym}dNtf4+$Pn3$*w@j?5ZTcg*cHo<*cF@DSYBod=9<## zJi`g*Jd^9*!-wVG)9Zl5hvk42>>|YmA&9ZH80p5!`Ow?H(C! zx2JFncCk-sI0i51y1b!t^@Q%<6FR6*=t94slmCR<5GLFxG2vE@1vi^axEd literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..0dff8e18035981c3b218f8cefd8dac185f3df5e0 GIT binary patch literal 6878 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..bc6dea6ea13ecabfc754a867efa31640b10a4303 GIT binary patch literal 3150 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..0129efee95d80be58482f472178051411cc28147 GIT binary patch literal 2796 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 kDk^k3T|A9Covxyy!l9@O^Hp6YML0SWDHpF literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..b1f848b --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #DC3DA2 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..b440fb9 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Message Decoder + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..df69727 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + +