From 008f24ca8e49d95b7b058a87b094832cf5ed3287 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Sun, 9 Nov 2025 16:19:10 -0600 Subject: [PATCH 1/7] android: empty app --- android/.gitignore | 15 ++ android/app/.gitignore | 1 + android/app/build.gradle.kts | 64 +++++ android/app/proguard-rules.pro | 21 ++ .../android/ExampleInstrumentedTest.kt | 24 ++ android/app/src/main/AndroidManifest.xml | 35 +++ .../org/turbowarp/android/EditorActivity.kt | 47 ++++ .../org/turbowarp/android/MainActivity.kt | 47 ++++ .../org/turbowarp/android/ui/theme/Color.kt | 11 + .../org/turbowarp/android/ui/theme/Theme.kt | 58 ++++ .../org/turbowarp/android/ui/theme/Type.kt | 34 +++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++ .../res/drawable/ic_launcher_foreground.xml | 30 +++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes android/app/src/main/res/values/colors.xml | 10 + android/app/src/main/res/values/strings.xml | 4 + android/app/src/main/res/values/themes.xml | 5 + android/app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 ++ .../org/turbowarp/android/ExampleUnitTest.kt | 17 ++ android/build.gradle.kts | 6 + android/gradle.properties | 23 ++ android/gradle/libs.versions.toml | 40 +++ android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 45457 bytes .../gradle/wrapper/gradle-wrapper.properties | 8 + android/gradlew | 251 ++++++++++++++++++ android/gradlew.bat | 94 +++++++ android/settings.gradle.kts | 23 ++ 39 files changed, 1082 insertions(+) create mode 100644 android/.gitignore create mode 100644 android/app/.gitignore create mode 100644 android/app/build.gradle.kts create mode 100644 android/app/proguard-rules.pro create mode 100644 android/app/src/androidTest/java/org/turbowarp/android/ExampleInstrumentedTest.kt create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/java/org/turbowarp/android/EditorActivity.kt create mode 100644 android/app/src/main/java/org/turbowarp/android/MainActivity.kt create mode 100644 android/app/src/main/java/org/turbowarp/android/ui/theme/Color.kt create mode 100644 android/app/src/main/java/org/turbowarp/android/ui/theme/Theme.kt create mode 100644 android/app/src/main/java/org/turbowarp/android/ui/theme/Type.kt create mode 100644 android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 android/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 android/app/src/main/res/values/colors.xml create mode 100644 android/app/src/main/res/values/strings.xml create mode 100644 android/app/src/main/res/values/themes.xml create mode 100644 android/app/src/main/res/xml/backup_rules.xml create mode 100644 android/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 android/app/src/test/java/org/turbowarp/android/ExampleUnitTest.kt create mode 100644 android/build.gradle.kts create mode 100644 android/gradle.properties create mode 100644 android/gradle/libs.versions.toml create mode 100644 android/gradle/wrapper/gradle-wrapper.jar create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100755 android/gradlew create mode 100644 android/gradlew.bat create mode 100644 android/settings.gradle.kts diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 00000000..aa724b77 --- /dev/null +++ b/android/.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/android/app/.gitignore b/android/app/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/android/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 00000000..27384bf6 --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,64 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) +} + +android { + namespace = "org.turbowarp.android" + compileSdk { + version = release(36) + } + + defaultConfig { + applicationId = "org.turbowarp.android" + minSdk = 24 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = "11" + } + buildFeatures { + compose = 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.compose.ui) + implementation(libs.androidx.compose.ui.graphics) + implementation(libs.androidx.compose.ui.tooling.preview) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.appcompat) + implementation(libs.material) + implementation(libs.androidx.activity) + implementation(libs.androidx.constraintlayout) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.compose.ui.test.junit4) + debugImplementation(libs.androidx.compose.ui.tooling) + debugImplementation(libs.androidx.compose.ui.test.manifest) +} \ No newline at end of file diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/android/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/android/app/src/androidTest/java/org/turbowarp/android/ExampleInstrumentedTest.kt b/android/app/src/androidTest/java/org/turbowarp/android/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..9ae823a8 --- /dev/null +++ b/android/app/src/androidTest/java/org/turbowarp/android/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package org.turbowarp.android + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("org.turbowarp.android", appContext.packageName) + } +} \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..28b80b78 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/java/org/turbowarp/android/EditorActivity.kt b/android/app/src/main/java/org/turbowarp/android/EditorActivity.kt new file mode 100644 index 00000000..c73e9dc2 --- /dev/null +++ b/android/app/src/main/java/org/turbowarp/android/EditorActivity.kt @@ -0,0 +1,47 @@ +package org.turbowarp.android + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import org.turbowarp.android.ui.theme.TurboWarpTheme + +class MainActivity2 : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent { + TurboWarpTheme { + Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> + Greeting2( + name = "Android", + modifier = Modifier.padding(innerPadding) + ) + } + } + } + } +} + +@Composable +fun Greeting2(name: String, modifier: Modifier = Modifier) { + Text( + text = "Hello $name!", + modifier = modifier + ) +} + +@Preview(showBackground = true) +@Composable +fun GreetingPreview2() { + TurboWarpTheme { + Greeting2("Edito") + } +} \ No newline at end of file diff --git a/android/app/src/main/java/org/turbowarp/android/MainActivity.kt b/android/app/src/main/java/org/turbowarp/android/MainActivity.kt new file mode 100644 index 00000000..f0951930 --- /dev/null +++ b/android/app/src/main/java/org/turbowarp/android/MainActivity.kt @@ -0,0 +1,47 @@ +package org.turbowarp.android + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import org.turbowarp.android.ui.theme.TurboWarpTheme + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent { + TurboWarpTheme { + Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> + Greeting( + name = "Android", + modifier = Modifier.padding(innerPadding) + ) + } + } + } + } +} + +@Composable +fun Greeting(name: String, modifier: Modifier = Modifier) { + Text( + text = "Hello $name!", + modifier = modifier + ) +} + +@Preview(showBackground = true) +@Composable +fun GreetingPreview() { + TurboWarpTheme { + Greeting("Android") + } +} \ No newline at end of file diff --git a/android/app/src/main/java/org/turbowarp/android/ui/theme/Color.kt b/android/app/src/main/java/org/turbowarp/android/ui/theme/Color.kt new file mode 100644 index 00000000..a7e222bc --- /dev/null +++ b/android/app/src/main/java/org/turbowarp/android/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package org.turbowarp.android.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) \ No newline at end of file diff --git a/android/app/src/main/java/org/turbowarp/android/ui/theme/Theme.kt b/android/app/src/main/java/org/turbowarp/android/ui/theme/Theme.kt new file mode 100644 index 00000000..d44a5974 --- /dev/null +++ b/android/app/src/main/java/org/turbowarp/android/ui/theme/Theme.kt @@ -0,0 +1,58 @@ +package org.turbowarp.android.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext + +private val DarkColorScheme = darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun TurboWarpTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/android/app/src/main/java/org/turbowarp/android/ui/theme/Type.kt b/android/app/src/main/java/org/turbowarp/android/ui/theme/Type.kt new file mode 100644 index 00000000..9a73b7b4 --- /dev/null +++ b/android/app/src/main/java/org/turbowarp/android/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package org.turbowarp.android.ui.theme + +import androidx.compose.material3.Typography +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 + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..07d5da9c --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..6f3b755b --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..6f3b755b --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c209e78ecd372343283f4157dcfd918ec5165bb3 GIT binary patch literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9 GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f0f1d64e58ba64d180ce43ee13bf9a17835fbca GIT binary patch literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0 GIT binary patch literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f GIT binary patch literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..f8c6127d --- /dev/null +++ b/android/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/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..c5da3c09 --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + TurboWarp + MainActivity2 + \ No newline at end of file diff --git a/android/app/src/main/res/values/themes.xml b/android/app/src/main/res/values/themes.xml new file mode 100644 index 00000000..57ba7ec8 --- /dev/null +++ b/android/app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values/attrs_my_view.xml b/android/app/src/main/res/values/attrs_my_view.xml new file mode 100644 index 00000000..0c48d8d9 --- /dev/null +++ b/android/app/src/main/res/values/attrs_my_view.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index f8c6127d..66e3f6cf 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -7,4 +7,8 @@ #FF018786 #FF000000 #FFFFFFFF + #FF29B6F6 + #FF039BE5 + #FFBDBDBD + #FF757575 \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..0ca81d89 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index 5844e793..8acf1b4f 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -12,9 +12,11 @@ appcompat = "1.6.1" material = "1.10.0" activity = "1.11.0" constraintlayout = "2.1.4" +webkit = "1.14.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } From 866eeb21a74c9acca94058a3b25367d18a17f631 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Sun, 9 Nov 2025 19:57:18 -0600 Subject: [PATCH 3/7] android: editor loads (with error), some i18n groundwork --- android/app/build.gradle.kts | 1 + android/app/src/main/assets/l10n | 1 + android/app/src/main/assets/preload/editor.js | 88 ++++++++++++++++++- .../app/src/main/assets/preload/ipc-init.js | 30 ++++++- .../java/org/turbowarp/android/EditorView.kt | 33 ++++++- .../main/java/org/turbowarp/android/L10N.kt | 43 +++++++++ .../org/turbowarp/android/MainActivity.kt | 7 ++ .../org/turbowarp/android/TurboWarpAssets.kt | 9 ++ .../org/turbowarp/android/TurboWarpWebView.kt | 67 ++++++++++---- 9 files changed, 254 insertions(+), 25 deletions(-) create mode 120000 android/app/src/main/assets/l10n create mode 100644 android/app/src/main/java/org/turbowarp/android/L10N.kt create mode 100644 android/app/src/main/java/org/turbowarp/android/TurboWarpAssets.kt diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index cdf82860..1eba4b02 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -38,6 +38,7 @@ android { } buildFeatures { compose = true + buildConfig = true } } diff --git a/android/app/src/main/assets/l10n b/android/app/src/main/assets/l10n new file mode 120000 index 00000000..ea249202 --- /dev/null +++ b/android/app/src/main/assets/l10n @@ -0,0 +1 @@ +../../../../../src-main/l10n/ \ No newline at end of file diff --git a/android/app/src/main/assets/preload/editor.js b/android/app/src/main/assets/preload/editor.js index 2fa61ad8..c77cb6c0 100644 --- a/android/app/src/main/assets/preload/editor.js +++ b/android/app/src/main/assets/preload/editor.js @@ -1,5 +1,89 @@ +const {contextBridge, ipcRenderer} = require('electron'); +contextBridge.exposeInMainWorld('EditorPreload', { + isInitiallyFullscreen: () => ipcRenderer.sendSync('is-initially-fullscreen'), + getInitialFile: () => ipcRenderer.invoke('get-initial-file'), + getFile: (id) => ipcRenderer.invoke('get-file', id), + openedFile: (id) => ipcRenderer.invoke('opened-file', id), + closedFile: () => ipcRenderer.invoke('closed-file'), + showSaveFilePicker: (suggestedName) => ipcRenderer.invoke('show-save-file-picker', suggestedName), + showOpenFilePicker: () => ipcRenderer.invoke('show-open-file-picker'), + setLocale: (locale) => ipcRenderer.sendSync('set-locale', locale), + setChanged: (changed) => ipcRenderer.invoke('set-changed', changed), + openNewWindow: () => ipcRenderer.invoke('open-new-window'), + openAddonSettings: (search) => ipcRenderer.invoke('open-addon-settings', search), + openPackager: () => ipcRenderer.invoke('open-packager'), + openDesktopSettings: () => ipcRenderer.invoke('open-desktop-settings'), + openPrivacy: () => ipcRenderer.invoke('open-privacy'), + openAbout: () => ipcRenderer.invoke('open-about'), + getPreferredMediaDevices: () => ipcRenderer.invoke('get-preferred-media-devices'), + getAdvancedCustomizations: () => ipcRenderer.invoke('get-advanced-customizations'), + setExportForPackager: (callback) => { + exportForPackager = callback; + }, + setIsFullScreen: (isFullScreen) => ipcRenderer.invoke('set-is-full-screen', isFullScreen) +}); -window.EditorPreload = { +let exportForPackager = () => Promise.reject(new Error('exportForPackager missing')); -}; +ipcRenderer.on('export-project-to-port', (e) => { + const port = e.ports[0]; + exportForPackager() + .then(({data, name}) => { + port.postMessage({ data, name }); + }) + .catch((error) => { + console.error(error); + port.postMessage({ error: true }); + }); +}); + +window.addEventListener('message', (e) => { + if (e.source === window) { + const data = e.data; + if (data && typeof data.ipcStartWriteStream === 'string') { + ipcRenderer.postMessage('start-write-stream', data.ipcStartWriteStream, e.ports); + } + } +}); + +ipcRenderer.on('enumerate-media-devices', (e) => { + navigator.mediaDevices.enumerateDevices() + .then((devices) => { + e.sender.send('enumerated-media-devices', { + devices: devices.map((device) => ({ + deviceId: device.deviceId, + kind: device.kind, + label: device.label + })) + }); + }) + .catch((error) => { + console.error(error); + e.sender.send('enumerated-media-devices', { + error: `${error}` + }); + }); +}); + +contextBridge.exposeInMainWorld('PromptsPreload', { + alert: (message) => ipcRenderer.sendSync('alert', message), + confirm: (message) => ipcRenderer.sendSync('confirm', message), +}); + +// In some Linux environments, people may try to drag & drop files that we don't have access to. +// Remove when https://github.com/electron/electron/issues/30650 is fixed. +if (navigator.userAgent.includes('Linux')) { + document.addEventListener('drop', (e) => { + if (e.isTrusted) { + for (const file of e.dataTransfer.files) { + // Using webUtils is safe as we don't have a legacy build for Linux + const {webUtils} = require('electron'); + const path = webUtils.getPathForFile(file); + ipcRenderer.invoke('check-drag-and-drop-path', path); + } + } + }, { + capture: true + }); +} diff --git a/android/app/src/main/assets/preload/ipc-init.js b/android/app/src/main/assets/preload/ipc-init.js index 03ed2476..be52dec8 100644 --- a/android/app/src/main/assets/preload/ipc-init.js +++ b/android/app/src/main/assets/preload/ipc-init.js @@ -1,3 +1,29 @@ -const contextBridge = { +const require = (function() { + const contextBridge = { + exposeInMainWorld: (objectName, objectImplementation) => { + window[objectName] = objectImplementation; + } + }; -}; + const ipcRenderer = { + sendSync: (method, ...args) => { + const response = AndroidIpcSync.sendSync(JSON.stringify({ + method, + args + })); + return JSON.parse(response); + }, + invoke: (method, ...args) => {} + }; + + return (moduleName) => { + if (moduleName === "electron") { + return { + contextBridge, + ipcRenderer + }; + } + + throw new Error(`Mock require() found unknown module: ${moduleName}`); + }; +}()); diff --git a/android/app/src/main/java/org/turbowarp/android/EditorView.kt b/android/app/src/main/java/org/turbowarp/android/EditorView.kt index 115bc4dd..d890f859 100644 --- a/android/app/src/main/java/org/turbowarp/android/EditorView.kt +++ b/android/app/src/main/java/org/turbowarp/android/EditorView.kt @@ -1,14 +1,43 @@ package org.turbowarp.android import androidx.compose.runtime.Composable +import org.json.JSONArray +import org.json.JSONObject + +fun mapToJsonObject(map: Map): JSONObject { + val jsonObject = JSONObject() + for ((key, value) in map) { + jsonObject.put(key, value) + } + return jsonObject +} @Composable fun EditorView() { TurboWarpWebView( url = "https://editor.android-assets.turbowarp.org/gui/gui.html", preloads = listOf( - "ipc-init.js", "editor.js", - ) + ), + ipcHandler = object : IpcHandler { + override fun handleSync( + method: String, + args: JSONArray + ): Any? { + if (method == "is-initially-fullscreen") { + return false + } + + if (method == "set-locale") { + val result = JSONObject() + val strings = L10N.getStrings() + result.put("strings", mapToJsonObject(strings)) + println(result) + return result + } + + return null + } + } ) } diff --git a/android/app/src/main/java/org/turbowarp/android/L10N.kt b/android/app/src/main/java/org/turbowarp/android/L10N.kt new file mode 100644 index 00000000..7ee1fee2 --- /dev/null +++ b/android/app/src/main/java/org/turbowarp/android/L10N.kt @@ -0,0 +1,43 @@ +package org.turbowarp.android + +import android.content.Context +import org.json.JSONObject + +object L10N { + private val translations = mutableMapOf>() + + private fun stringsWithDescriptionToMap(jsonObject: JSONObject): Map { + val map = mutableMapOf() + for (id in jsonObject.keys()) { + println(id) + val infoObject = jsonObject.getJSONObject(id) + map[id] = infoObject.getString("string") + } + return map + } + + private fun stringsToMap(jsonObject: JSONObject): Map { + val map = mutableMapOf() + for (id in jsonObject.keys()) { + map[id] = jsonObject.getString(id) + } + return map + } + + fun setup(context: Context) { + val englishStrings = readAssetAsString(context, "l10n/en.json") + val englishStringsObject = JSONObject(englishStrings) + translations["en"] = stringsWithDescriptionToMap(englishStringsObject) + + val translatedStrings = readAssetAsString(context, "l10n/generated-translations.json") + val translatedStringsObjects = JSONObject(translatedStrings) + for (locale in translatedStringsObjects.keys()) { + val localeStringsObject = translatedStringsObjects.getJSONObject(locale) + translations[locale] = stringsToMap(localeStringsObject) + } + } + + fun getStrings(): Map { + return translations["en"]!! + } +} \ No newline at end of file diff --git a/android/app/src/main/java/org/turbowarp/android/MainActivity.kt b/android/app/src/main/java/org/turbowarp/android/MainActivity.kt index 299ceb6c..57156589 100644 --- a/android/app/src/main/java/org/turbowarp/android/MainActivity.kt +++ b/android/app/src/main/java/org/turbowarp/android/MainActivity.kt @@ -4,12 +4,19 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.webkit.WebViewFeature import org.turbowarp.android.ui.theme.TurboWarpTheme +// TODO +private fun isDeviceSupported(): Boolean { + return WebViewFeature.isFeatureSupported(WebViewFeature.WEB_MESSAGE_LISTENER) +} + class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() + L10N.setup(applicationContext) setContent { TurboWarpTheme { EditorView() diff --git a/android/app/src/main/java/org/turbowarp/android/TurboWarpAssets.kt b/android/app/src/main/java/org/turbowarp/android/TurboWarpAssets.kt new file mode 100644 index 00000000..ece92cbe --- /dev/null +++ b/android/app/src/main/java/org/turbowarp/android/TurboWarpAssets.kt @@ -0,0 +1,9 @@ +package org.turbowarp.android + +import android.content.Context + +fun readAssetAsString(context: Context, path: String): String { + val stream = context.assets.open(path) + val reader = stream.bufferedReader() + return reader.readText() +} diff --git a/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt b/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt index 164ac355..049514d8 100644 --- a/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt +++ b/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt @@ -5,6 +5,7 @@ import android.content.Context import android.graphics.Bitmap import android.net.Uri import android.view.ViewGroup +import android.webkit.JavascriptInterface import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import android.webkit.WebView @@ -18,12 +19,9 @@ import androidx.webkit.WebViewAssetLoader import androidx.webkit.WebViewCompat import java.io.IOException import java.net.URLConnection - -private fun readAssetAsString(context: Context, path: String): String { - val stream = context.assets.open(path) - val reader = stream.bufferedReader() - return reader.readText() -} +import androidx.core.net.toUri +import org.json.JSONArray +import org.json.JSONObject private class ServeAsset( private val context: Context, @@ -88,7 +86,26 @@ private class TurboWarpWebViewClient( } } -private class WebViewIPC : WebViewCompat.WebMessageListener { +interface IpcHandler { + fun handleSync(method: String, args: JSONArray): Any? +} + +private class IpcSync(private val ipcHandler: IpcHandler) { + // Android's JavaScript interface apparently only supports the primitive types. + // So we have to pass around JSON strings. Real fun. + @JavascriptInterface + fun sendSync(jsonRequestString: String): String { + val jsonRequest = JSONObject(jsonRequestString) + val method = jsonRequest.getString("method") + val args = jsonRequest.getJSONArray("args") + + val jsonResponse = ipcHandler.handleSync(method, args) + return jsonResponse?.toString() ?: "null" + } +} + +private class IpcAsync(private val ipcHandler: IpcHandler) : WebViewCompat.WebMessageListener { + @SuppressLint("RequiresFeature") override fun onPostMessage( view: WebView, message: WebMessageCompat, @@ -96,26 +113,26 @@ private class WebViewIPC : WebViewCompat.WebMessageListener { isMainFrame: Boolean, replyProxy: JavaScriptReplyProxy ) { - + replyProxy.postMessage("e") } } private fun getOrigin(url: String): String { - val uri = Uri.parse(url) + val uri = url.toUri() val sb = StringBuilder() sb.append(uri.scheme) sb.append("://") sb.append(uri.host) - sb.append(uri.host) return sb.toString() } -@SuppressLint("SetJavaScriptEnabled") +@SuppressLint("SetJavaScriptEnabled", "RequiresFeature") @Composable fun TurboWarpWebView( url: String, modifier: Modifier = Modifier, preloads: List = emptyList(), + ipcHandler: IpcHandler? = null ) { AndroidView( modifier = modifier, @@ -135,14 +152,26 @@ fun TurboWarpWebView( settings.allowFileAccess = false settings.allowContentAccess = false - WebViewCompat.addWebMessageListener( - this, - "AndroidIPC", - setOf(getOrigin(url)), - WebViewIPC() - ) - - webViewClient = TurboWarpWebViewClient(context, preloads) + // Easier debugging + val version = BuildConfig.VERSION_NAME + settings.userAgentString += " org.turbowarp.android/$version" + + if (ipcHandler != null) { + val origin = getOrigin(url) + WebViewCompat.addWebMessageListener( + this, + "AndroidIpcAsync", + setOf(origin), + IpcAsync(ipcHandler) + ) + addJavascriptInterface(IpcSync(ipcHandler), "AndroidIpcSync") + } + + webViewClient = TurboWarpWebViewClient(context, if (ipcHandler == null) { + preloads + } else { + listOf("ipc-init.js").plus(preloads) + }) } }, update = { webView -> From 44d81f1cea6a83c9a99fc83cc9e72069c6a15754 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Sun, 9 Nov 2025 20:59:55 -0600 Subject: [PATCH 4/7] android: more fixes, extensions + libraries offline --- android/app/build.gradle.kts | 1 + android/app/src/main/AndroidManifest.xml | 6 +- .../main/java/org/turbowarp/android/Assets.kt | 17 ++ .../main/java/org/turbowarp/android/L10N.kt | 1 - .../org/turbowarp/android/TurboWarpAssets.kt | 9 -- .../org/turbowarp/android/TurboWarpWebView.kt | 152 +++++++++++++++--- android/gradle/libs.versions.toml | 2 + 7 files changed, 151 insertions(+), 37 deletions(-) create mode 100644 android/app/src/main/java/org/turbowarp/android/Assets.kt delete mode 100644 android/app/src/main/java/org/turbowarp/android/TurboWarpAssets.kt diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 1eba4b02..315ed166 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -56,6 +56,7 @@ dependencies { implementation(libs.androidx.activity) implementation(libs.androidx.constraintlayout) implementation(libs.androidx.webkit) + implementation(libs.brotlidec) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 952813ba..7cb82ef4 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -16,14 +16,12 @@ + android:theme="@style/Theme.TurboWarp" + android:configChanges="orientation|screenSize"> - - \ No newline at end of file diff --git a/android/app/src/main/java/org/turbowarp/android/Assets.kt b/android/app/src/main/java/org/turbowarp/android/Assets.kt new file mode 100644 index 00000000..fcefdbd4 --- /dev/null +++ b/android/app/src/main/java/org/turbowarp/android/Assets.kt @@ -0,0 +1,17 @@ +package org.turbowarp.android + +import android.content.Context +import org.brotli.dec.BrotliInputStream +import java.io.InputStream + +fun readAssetAsString(context: Context, path: String): String { + val stream = context.assets.open(path) + val reader = stream.bufferedReader() + return reader.readText() +} + +fun readBrotliAssetAsStream(context: Context, path: String): InputStream { + val compressedDataStream = context.assets.open(path) + val decompressedDataStream = BrotliInputStream(compressedDataStream) + return decompressedDataStream +} \ No newline at end of file diff --git a/android/app/src/main/java/org/turbowarp/android/L10N.kt b/android/app/src/main/java/org/turbowarp/android/L10N.kt index 7ee1fee2..3adfe27e 100644 --- a/android/app/src/main/java/org/turbowarp/android/L10N.kt +++ b/android/app/src/main/java/org/turbowarp/android/L10N.kt @@ -9,7 +9,6 @@ object L10N { private fun stringsWithDescriptionToMap(jsonObject: JSONObject): Map { val map = mutableMapOf() for (id in jsonObject.keys()) { - println(id) val infoObject = jsonObject.getJSONObject(id) map[id] = infoObject.getString("string") } diff --git a/android/app/src/main/java/org/turbowarp/android/TurboWarpAssets.kt b/android/app/src/main/java/org/turbowarp/android/TurboWarpAssets.kt deleted file mode 100644 index ece92cbe..00000000 --- a/android/app/src/main/java/org/turbowarp/android/TurboWarpAssets.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.turbowarp.android - -import android.content.Context - -fun readAssetAsString(context: Context, path: String): String { - val stream = context.assets.open(path) - val reader = stream.bufferedReader() - return reader.readText() -} diff --git a/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt b/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt index 049514d8..2a570acd 100644 --- a/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt +++ b/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt @@ -2,6 +2,7 @@ package org.turbowarp.android import android.annotation.SuppressLint import android.content.Context +import android.content.Intent import android.graphics.Bitmap import android.net.Uri import android.view.ViewGroup @@ -22,6 +23,36 @@ import java.net.URLConnection import androidx.core.net.toUri import org.json.JSONArray import org.json.JSONObject +import java.io.InputStream + +private fun addIndexIfNeeded(path: String): String { + return if (path.endsWith("/")) { + "$path/index.html" + } else { + path + } +} + +private fun makeFetchableResponse(data: InputStream, path: String): WebResourceResponse { + // TODO: use our own mime types instead of the system's + val mimeType = URLConnection.guessContentTypeFromName(path) + + return WebResourceResponse( + mimeType, + null, + 200, + "OK", + mapOf( + "Access-Control-Allow-Origin" to "*" + ), + data, + ) +} + +private fun makeErrorResponse(): WebResourceResponse { + // TODO + return WebResourceResponse(null, null, null) +} private class ServeAsset( private val context: Context, @@ -29,13 +60,59 @@ private class ServeAsset( ) : WebViewAssetLoader.PathHandler { override fun handle(path: String): WebResourceResponse? { return try { - val assetPath = "$subfolder/$path" - val inputStream = context.assets.open(assetPath) - val mimeType = URLConnection.guessContentTypeFromName(assetPath) - WebResourceResponse(mimeType, null, inputStream) + // TODO: probably vulnerable to path traversal + val pathWithIndex = addIndexIfNeeded(path) + val assetPath = "$subfolder/$pathWithIndex" + + val stream = context.assets.open(assetPath) + makeFetchableResponse(stream, pathWithIndex) + } catch (_: IOException) { + makeErrorResponse() + } + } +} + +private class ServeBrotliAsset( + private val context: Context, + private val subfolder: String +) : WebViewAssetLoader.PathHandler { + override fun handle(path: String): WebResourceResponse? { + return try { + // TODO: probably vulnerable to path traversal + val pathWithIndex = addIndexIfNeeded(path) + val compressedAssetPath = "$subfolder/$pathWithIndex.br" + + val stream = readBrotliAssetAsStream(context, compressedAssetPath) + makeFetchableResponse(stream, pathWithIndex) } catch (_: IOException) { - // TODO: better error page? - WebResourceResponse(null, null, null) + // TODO: does this fall-through to remote or fallthrough? + null + } + } +} + +private class ServeLibraryAsset( + private val context: Context, + private val subfolder: String +) : WebViewAssetLoader.PathHandler { + private fun findMd5ext(path: String): String? { + val md5ext = Regex("[0-9a-f]{32}\\.\\w{3}", RegexOption.IGNORE_CASE).find(path) + return md5ext?.value + } + + override fun handle(path: String): WebResourceResponse? { + return try { + val md5ext = findMd5ext(path) + + if (md5ext == null) { + makeErrorResponse() + } else { + val compressedAssetPath = "$subfolder/$md5ext.br" + val stream = readBrotliAssetAsStream(context, compressedAssetPath) + makeFetchableResponse(stream, md5ext) + } + } catch (_: IOException) { + makeErrorResponse() } } } @@ -43,6 +120,7 @@ private class ServeAsset( private class TurboWarpWebViewClient( private val context: Context, private val preloads: List, + private val initialUrl: String ) : WebViewClient() { private val assetLoaders = mapOf( "editor.android-assets.turbowarp.org" to WebViewAssetLoader.Builder() @@ -50,31 +128,42 @@ private class TurboWarpWebViewClient( .addPathHandler("/", ServeAsset(context, "dist-renderer-webpack/editor")) .build(), - "packager.android-assets.turbowarp.org" to WebViewAssetLoader.Builder() - .setDomain("packager.android-assets.turbowarp.org") - .addPathHandler("/", ServeAsset(context, "packager")) + "extensions.turbowarp.org" to WebViewAssetLoader.Builder() + .setDomain("extensions.turbowarp.org") + .addPathHandler("/", ServeBrotliAsset(context, "dist-extensions")) .build(), - "about.android-assets.turbowarp.org" to WebViewAssetLoader.Builder() - .setDomain("about.android-assets.turbowarp.org") - .addPathHandler("/", ServeAsset(context, "about")) - .build() + "assets.scratch.mit.edu" to WebViewAssetLoader.Builder() + .setDomain("assets.scratch.mit.edu") + .addPathHandler("/", ServeLibraryAsset(context, "dist-library-files")) + .build(), + + "cdn.assets.scratch.mit.edu" to WebViewAssetLoader.Builder() + .setDomain("cdn.assets.scratch.mit.edu") + .addPathHandler("/", ServeLibraryAsset(context, "dist-library-files")) + .build(), + + "packager.turbowarp.org" to WebViewAssetLoader.Builder() + .setDomain("packager.turbowarp.org") + .addPathHandler("/", ServeAsset(context, "packager")) + .build(), ) override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { super.onPageStarted(view, url, favicon) + // Execute preloads in IIFE so that we only expose the variables we want to val sb = StringBuilder() - sb.append("(function() { 'use strict';\n"); + sb.append("(function() { 'use strict';\n") for (preloadName in preloads) { // We assume that the preloads variable is trusted, don't need to worry about path // traversal or anything like that. val preloadScript = readAssetAsString(context, "preload/$preloadName") sb.append(preloadScript) } - sb.append("\n}());"); + sb.append("\n}());") - view?.evaluateJavascript(sb.toString(), null); + view?.evaluateJavascript(sb.toString(), null) } override fun shouldInterceptRequest( @@ -84,6 +173,18 @@ private class TurboWarpWebViewClient( val loader = request.url.host?.let { assetLoaders[it] } return loader?.shouldInterceptRequest(request.url) } + + override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { + // Open links in browser app + // TODO: can we make this feel a bit less weird? like that custom tabs thing? + if (request?.url.toString() != initialUrl) { + val intent = Intent(Intent.ACTION_VIEW, request?.url) + view?.context?.startActivity(intent) + return true + } + + return super.shouldOverrideUrlLoading(view, request) + } } interface IpcHandler { @@ -152,9 +253,10 @@ fun TurboWarpWebView( settings.allowFileAccess = false settings.allowContentAccess = false - // Easier debugging + // To help troubleshooting val version = BuildConfig.VERSION_NAME - settings.userAgentString += " org.turbowarp.android/$version" + val appId = BuildConfig.APPLICATION_ID + settings.userAgentString += " $appId/$version" if (ipcHandler != null) { val origin = getOrigin(url) @@ -167,11 +269,15 @@ fun TurboWarpWebView( addJavascriptInterface(IpcSync(ipcHandler), "AndroidIpcSync") } - webViewClient = TurboWarpWebViewClient(context, if (ipcHandler == null) { - preloads - } else { - listOf("ipc-init.js").plus(preloads) - }) + webViewClient = TurboWarpWebViewClient( + context = context, + initialUrl = url, + preloads = if (ipcHandler == null) { + preloads + } else { + listOf("ipc-init.js").plus(preloads) + } + ) } }, update = { webView -> diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml index 8acf1b4f..75b7ef7c 100644 --- a/android/gradle/libs.versions.toml +++ b/android/gradle/libs.versions.toml @@ -1,5 +1,6 @@ [versions] agp = "8.13.0" +brotlidec = "0.1.2" kotlin = "2.0.21" coreKtx = "1.10.1" junit = "4.13.2" @@ -17,6 +18,7 @@ webkit = "1.14.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } +brotlidec = { module = "org.brotli:dec", version.ref = "brotlidec" } junit = { group = "junit", name = "junit", version.ref = "junit" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } From 53414d63847d1ae679fdfec29637ae3fb6d54258 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Sun, 9 Nov 2025 21:04:50 -0600 Subject: [PATCH 5/7] android: fix gitignore blocking some asset symlinks --- .gitignore | 8 ++++---- android/app/src/main/assets/dist-extensions | 1 + android/app/src/main/assets/dist-library-files | 1 + android/app/src/main/assets/dist-renderer-webpack | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) create mode 120000 android/app/src/main/assets/dist-extensions create mode 120000 android/app/src/main/assets/dist-library-files create mode 120000 android/app/src/main/assets/dist-renderer-webpack diff --git a/.gitignore b/.gitignore index 88edbf9f..901d5221 100644 --- a/.gitignore +++ b/.gitignore @@ -5,10 +5,10 @@ node_modules/ .vscode # Built files -dist -dist-renderer-webpack -dist-library-files -dist-extensions +/dist +/dist-renderer-webpack +/dist-library-files +/dist-extensions src-renderer/packager/standalone.html # Debian release scripts create files that shouldn't be committed diff --git a/android/app/src/main/assets/dist-extensions b/android/app/src/main/assets/dist-extensions new file mode 120000 index 00000000..40ec5ca3 --- /dev/null +++ b/android/app/src/main/assets/dist-extensions @@ -0,0 +1 @@ +../../../../../dist-extensions/ \ No newline at end of file diff --git a/android/app/src/main/assets/dist-library-files b/android/app/src/main/assets/dist-library-files new file mode 120000 index 00000000..aebd9165 --- /dev/null +++ b/android/app/src/main/assets/dist-library-files @@ -0,0 +1 @@ +../../../../../dist-library-files/ \ No newline at end of file diff --git a/android/app/src/main/assets/dist-renderer-webpack b/android/app/src/main/assets/dist-renderer-webpack new file mode 120000 index 00000000..dd46b530 --- /dev/null +++ b/android/app/src/main/assets/dist-renderer-webpack @@ -0,0 +1 @@ +../../../../../dist-renderer-webpack/ \ No newline at end of file From 8a738e7c295839282e1fc563e88f67df63bbb753 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Mon, 10 Nov 2025 18:58:47 -0600 Subject: [PATCH 6/7] android: add icon, add about, add addon settings, add privacy --- android/app/build.gradle.kts | 1 + android/app/src/main/assets/preload/editor.js | 138 +++++++------- .../app/src/main/assets/preload/ipc-init.js | 36 +++- .../app/src/main/ic_launcher-playstore.png | Bin 0 -> 20774 bytes .../java/org/turbowarp/android/AboutView.kt | 40 +++++ .../java/org/turbowarp/android/AddonsView.kt | 10 ++ .../java/org/turbowarp/android/EditorView.kt | 50 +++++- .../org/turbowarp/android/MainActivity.kt | 8 +- .../java/org/turbowarp/android/PrivacyView.kt | 18 ++ .../org/turbowarp/android/TurboWarpWebView.kt | 2 +- .../res/drawable/ic_launcher_background.xml | 170 ------------------ .../res/drawable/ic_launcher_foreground.xml | 40 ++--- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +- .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 3074 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 3074 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 2050 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 2050 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 4358 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 4358 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 6570 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 6570 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 9292 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 9292 bytes .../app/src/main/res/values-night/styles.xml | 4 - .../app/src/main/res/values/attrs_my_view.xml | 6 - .../res/values/ic_launcher_background.xml | 4 + android/app/src/main/res/values/strings.xml | 1 - android/app/src/main/res/values/styles.xml | 4 - android/app/src/main/res/values/themes.xml | 1 - android/gradle/libs.versions.toml | 2 + art/android-foreground.svg | 46 +++++ 32 files changed, 297 insertions(+), 294 deletions(-) create mode 100644 android/app/src/main/ic_launcher-playstore.png create mode 100644 android/app/src/main/java/org/turbowarp/android/AboutView.kt create mode 100644 android/app/src/main/java/org/turbowarp/android/AddonsView.kt create mode 100644 android/app/src/main/java/org/turbowarp/android/PrivacyView.kt delete mode 100644 android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 art/android-foreground.svg diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 315ed166..3ee131ae 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -57,6 +57,7 @@ dependencies { implementation(libs.androidx.constraintlayout) implementation(libs.androidx.webkit) implementation(libs.brotlidec) + implementation(libs.androidx.navigation.compose) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/android/app/src/main/assets/preload/editor.js b/android/app/src/main/assets/preload/editor.js index c77cb6c0..07d4c3de 100644 --- a/android/app/src/main/assets/preload/editor.js +++ b/android/app/src/main/assets/preload/editor.js @@ -2,88 +2,86 @@ const {contextBridge, ipcRenderer} = require('electron'); contextBridge.exposeInMainWorld('EditorPreload', { isInitiallyFullscreen: () => ipcRenderer.sendSync('is-initially-fullscreen'), - getInitialFile: () => ipcRenderer.invoke('get-initial-file'), + getInitialFile: async () => null, getFile: (id) => ipcRenderer.invoke('get-file', id), openedFile: (id) => ipcRenderer.invoke('opened-file', id), closedFile: () => ipcRenderer.invoke('closed-file'), showSaveFilePicker: (suggestedName) => ipcRenderer.invoke('show-save-file-picker', suggestedName), showOpenFilePicker: () => ipcRenderer.invoke('show-open-file-picker'), setLocale: (locale) => ipcRenderer.sendSync('set-locale', locale), - setChanged: (changed) => ipcRenderer.invoke('set-changed', changed), - openNewWindow: () => ipcRenderer.invoke('open-new-window'), - openAddonSettings: (search) => ipcRenderer.invoke('open-addon-settings', search), - openPackager: () => ipcRenderer.invoke('open-packager'), - openDesktopSettings: () => ipcRenderer.invoke('open-desktop-settings'), - openPrivacy: () => ipcRenderer.invoke('open-privacy'), - openAbout: () => ipcRenderer.invoke('open-about'), - getPreferredMediaDevices: () => ipcRenderer.invoke('get-preferred-media-devices'), - getAdvancedCustomizations: () => ipcRenderer.invoke('get-advanced-customizations'), - setExportForPackager: (callback) => { - exportForPackager = callback; - }, - setIsFullScreen: (isFullScreen) => ipcRenderer.invoke('set-is-full-screen', isFullScreen) + setChanged: (changed) => {}, + // openNewWindow: () => ipcRenderer.invoke('open-new-window'), + openAddonSettings: (search) => ipcRenderer.sendSync('open-addon-settings', search), + //openPackager: () => ipcRenderer.invoke('open-packager'), + //openDesktopSettings: () => ipcRenderer.invoke('open-desktop-settings'), + openPrivacy: () => ipcRenderer.sendSync('open-privacy'), + openAbout: () => ipcRenderer.sendSync('open-about'), + //getPreferredMediaDevices: () => ipcRenderer.invoke('get-preferred-media-devices'), + getAdvancedCustomizations: async () => ({}), + setExportForPackager: (callback) => {}, + setIsFullScreen: (isFullScreen) => {} }); -let exportForPackager = () => Promise.reject(new Error('exportForPackager missing')); +//let exportForPackager = () => Promise.reject(new Error('exportForPackager missing')); -ipcRenderer.on('export-project-to-port', (e) => { - const port = e.ports[0]; - exportForPackager() - .then(({data, name}) => { - port.postMessage({ data, name }); - }) - .catch((error) => { - console.error(error); - port.postMessage({ error: true }); - }); -}); +//ipcRenderer.on('export-project-to-port', (e) => { +// const port = e.ports[0]; +// exportForPackager() +// .then(({data, name}) => { +// port.postMessage({ data, name }); +// }) +// .catch((error) => { +// console.error(error); +// port.postMessage({ error: true }); +// }); +//}); -window.addEventListener('message', (e) => { - if (e.source === window) { - const data = e.data; - if (data && typeof data.ipcStartWriteStream === 'string') { - ipcRenderer.postMessage('start-write-stream', data.ipcStartWriteStream, e.ports); - } - } -}); +//window.addEventListener('message', (e) => { +// if (e.source === window) { +// const data = e.data; +// if (data && typeof data.ipcStartWriteStream === 'string') { +// ipcRenderer.postMessage('start-write-stream', data.ipcStartWriteStream, e.ports); +// } +// } +//}); -ipcRenderer.on('enumerate-media-devices', (e) => { - navigator.mediaDevices.enumerateDevices() - .then((devices) => { - e.sender.send('enumerated-media-devices', { - devices: devices.map((device) => ({ - deviceId: device.deviceId, - kind: device.kind, - label: device.label - })) - }); - }) - .catch((error) => { - console.error(error); - e.sender.send('enumerated-media-devices', { - error: `${error}` - }); - }); -}); +//ipcRenderer.on('enumerate-media-devices', (e) => { +// navigator.mediaDevices.enumerateDevices() +// .then((devices) => { +// e.sender.send('enumerated-media-devices', { +// devices: devices.map((device) => ({ +// deviceId: device.deviceId, +// kind: device.kind, +// label: device.label +// })) +// }); +// }) +// .catch((error) => { +// console.error(error); +// e.sender.send('enumerated-media-devices', { +// error: `${error}` +// }); +// }); +//}); -contextBridge.exposeInMainWorld('PromptsPreload', { - alert: (message) => ipcRenderer.sendSync('alert', message), - confirm: (message) => ipcRenderer.sendSync('confirm', message), -}); +//contextBridge.exposeInMainWorld('PromptsPreload', { +// alert: (message) => ipcRenderer.sendSync('alert', message), +// confirm: (message) => ipcRenderer.sendSync('confirm', message), +//}); // In some Linux environments, people may try to drag & drop files that we don't have access to. // Remove when https://github.com/electron/electron/issues/30650 is fixed. -if (navigator.userAgent.includes('Linux')) { - document.addEventListener('drop', (e) => { - if (e.isTrusted) { - for (const file of e.dataTransfer.files) { - // Using webUtils is safe as we don't have a legacy build for Linux - const {webUtils} = require('electron'); - const path = webUtils.getPathForFile(file); - ipcRenderer.invoke('check-drag-and-drop-path', path); - } - } - }, { - capture: true - }); -} +//if (navigator.userAgent.includes('Linux')) { +// document.addEventListener('drop', (e) => { +// if (e.isTrusted) { +// for (const file of e.dataTransfer.files) { +// // Using webUtils is safe as we don't have a legacy build for Linux +// const {webUtils} = require('electron'); +// const path = webUtils.getPathForFile(file); +// ipcRenderer.invoke('check-drag-and-drop-path', path); +// } +// } +// }, { +// capture: true +// }); +//} diff --git a/android/app/src/main/assets/preload/ipc-init.js b/android/app/src/main/assets/preload/ipc-init.js index be52dec8..e69d0929 100644 --- a/android/app/src/main/assets/preload/ipc-init.js +++ b/android/app/src/main/assets/preload/ipc-init.js @@ -1,4 +1,23 @@ const require = (function() { + let globalIpcCounter = 0; + const ipcInFlight = {}; + + AndroidIpcAsync.onmessage = (e) => { + const data = e.data; + const ipcObject = ipcInFlight[data.messageId]; + if (!ipcObject) { + throw new Error(`Received async IPC with unknown ID ${data.messageId}`); + } + + if (data.success) { + ipcObject.resolve(data.result); + } else { + ipcObject.reject(data.result); + } + + delete ipcObject[data.messageId]; + }; + const contextBridge = { exposeInMainWorld: (objectName, objectImplementation) => { window[objectName] = objectImplementation; @@ -13,7 +32,22 @@ const require = (function() { })); return JSON.parse(response); }, - invoke: (method, ...args) => {} + + invoke: (method, ...args) => new Promise((resolve, reject) => { + const messageId = globalIpcCounter++; + ipcInFlight[messageId] = { + resolve, + reject + }; + + console.log('Sending', method, args); + + AndroidIpcAsync.postMessage({ + messageId, + method, + arguments: args + }); + }), }; return (moduleName) => { diff --git a/android/app/src/main/ic_launcher-playstore.png b/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..f64a779354b5de945a80ba57c4c827f6203356b4 GIT binary patch literal 20774 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�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 E1MYu%-~a#s literal 0 HcmV?d00001 diff --git a/android/app/src/main/java/org/turbowarp/android/AboutView.kt b/android/app/src/main/java/org/turbowarp/android/AboutView.kt new file mode 100644 index 00000000..68eb5156 --- /dev/null +++ b/android/app/src/main/java/org/turbowarp/android/AboutView.kt @@ -0,0 +1,40 @@ +package org.turbowarp.android + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.sp + +@Composable +fun AboutView() { + Surface( + modifier = Modifier.fillMaxSize(), + color = Color(0xffff4c4c) + ) { + Column ( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = "TurboWarp for Android", + fontSize = 30.sp, + color = Color.White, + textAlign = TextAlign.Center + ) + Text( + text = "${BuildConfig.APPLICATION_ID}/${BuildConfig.VERSION_NAME}", + fontSize = 20.sp, + color = Color.White, + textAlign = TextAlign.Center + ) + } + } +} diff --git a/android/app/src/main/java/org/turbowarp/android/AddonsView.kt b/android/app/src/main/java/org/turbowarp/android/AddonsView.kt new file mode 100644 index 00000000..7b0be645 --- /dev/null +++ b/android/app/src/main/java/org/turbowarp/android/AddonsView.kt @@ -0,0 +1,10 @@ +package org.turbowarp.android + +import androidx.compose.runtime.Composable + +@Composable +fun AddonsView() { + TurboWarpWebView( + url = "https://editor.android-assets.turbowarp.org/addons/addons.html", + ) +} diff --git a/android/app/src/main/java/org/turbowarp/android/EditorView.kt b/android/app/src/main/java/org/turbowarp/android/EditorView.kt index d890f859..ae8ca37b 100644 --- a/android/app/src/main/java/org/turbowarp/android/EditorView.kt +++ b/android/app/src/main/java/org/turbowarp/android/EditorView.kt @@ -1,6 +1,12 @@ package org.turbowarp.android +import android.os.Handler +import android.os.Looper +import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController import org.json.JSONArray import org.json.JSONObject @@ -14,7 +20,9 @@ fun mapToJsonObject(map: Map): JSONObject { @Composable fun EditorView() { - TurboWarpWebView( + val navController = rememberNavController() + + val editor = TurboWarpWebView( url = "https://editor.android-assets.turbowarp.org/gui/gui.html", preloads = listOf( "editor.js", @@ -32,12 +40,50 @@ fun EditorView() { val result = JSONObject() val strings = L10N.getStrings() result.put("strings", mapToJsonObject(strings)) - println(result) return result } + if (method == "open-about") { + Handler(Looper.getMainLooper()).post { + navController.navigate("about") + } + return null + } + + if (method == "open-addon-settings") { + Handler(Looper.getMainLooper()).post { + navController.navigate("addons") + } + return null + } + + if (method == "open-privacy") { + Handler(Looper.getMainLooper()).post { + navController.navigate("privacy") + } + return null + } + return null } } ) + + Box { + editor + NavHost(navController = navController, startDestination = "none") { + composable("none") { + // empty + } + composable("about") { + AboutView() + } + composable("addons") { + AddonsView() + } + composable("privacy") { + PrivacyView() + } + } + } } diff --git a/android/app/src/main/java/org/turbowarp/android/MainActivity.kt b/android/app/src/main/java/org/turbowarp/android/MainActivity.kt index 57156589..9192952b 100644 --- a/android/app/src/main/java/org/turbowarp/android/MainActivity.kt +++ b/android/app/src/main/java/org/turbowarp/android/MainActivity.kt @@ -4,6 +4,10 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.ui.Modifier +import androidx.navigation.compose.rememberNavController import androidx.webkit.WebViewFeature import org.turbowarp.android.ui.theme.TurboWarpTheme @@ -19,7 +23,9 @@ class MainActivity : ComponentActivity() { L10N.setup(applicationContext) setContent { TurboWarpTheme { - EditorView() + Box(modifier = Modifier.safeDrawingPadding()) { + EditorView() + } } } } diff --git a/android/app/src/main/java/org/turbowarp/android/PrivacyView.kt b/android/app/src/main/java/org/turbowarp/android/PrivacyView.kt new file mode 100644 index 00000000..c5965f34 --- /dev/null +++ b/android/app/src/main/java/org/turbowarp/android/PrivacyView.kt @@ -0,0 +1,18 @@ +package org.turbowarp.android + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color + +@Composable +fun PrivacyView() { + Surface( + modifier = Modifier.fillMaxSize(), + color = Color.White + ) { + Text("Testing") + } +} \ No newline at end of file diff --git a/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt b/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt index 2a570acd..a9957885 100644 --- a/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt +++ b/android/app/src/main/java/org/turbowarp/android/TurboWarpWebView.kt @@ -85,7 +85,7 @@ private class ServeBrotliAsset( val stream = readBrotliAssetAsStream(context, compressedAssetPath) makeFetchableResponse(stream, pathWithIndex) } catch (_: IOException) { - // TODO: does this fall-through to remote or fallthrough? + // TODO: does this fall-through to remote or error? null } } diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9c..00000000 --- a/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml index 2b068d11..09d5bce4 100644 --- a/android/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,30 +1,16 @@ - - - - - - - - - - \ No newline at end of file + android:viewportWidth="1024" + android:viewportHeight="1024"> + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 6f3b755b..7353dbd1 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,5 @@ - - - + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 6f3b755b..7353dbd1 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,6 +1,5 @@ - - - + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp index c209e78ecd372343283f4157dcfd918ec5165bb3..8aaa9ea3e422d9e25cc6bee3e87d27f11d832c30 100644 GIT binary patch literal 3074 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 Kmw_-CKmY()leWbG diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp index b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9..8aaa9ea3e422d9e25cc6bee3e87d27f11d832c30 100644 GIT binary patch literal 3074 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 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp index 4f0f1d64e58ba64d180ce43ee13bf9a17835fbca..93e610323ac7fc1e921292ae8e8db1ff393762fc 100644 GIT binary patch literal 2050 zcmV+d2>tg`Nk&Hc2LJ$9MM6+kP&iEO2LJ#sFTe{BRfmGK4Vcxx?L7$*F#+-bA4@0x zKSy%)m&?8P-h1!Y@9cD6xO~KYZ)W!x{HjI{$0C>#0s*s`Qh`voB$OSC19Yiyc!i>% zT%iC?u1q+@V8o`YCRZ!~QY09cDOaRY^hY4ez-EVKsuqHt2|a>cK99x=U)UWzMiV^} zFLT*tkBK)Rj=?hpx3+E7$}Zsx1z5-+CL*N*Cvq}(zc2dk?ygVIITww71N20|wQbwj zGk)8)UBym1+qSLF<^$NyE7SMbR{sP z8gdlg(8b0gRspm^6BIzMxtx@t1Ryv7Kp@JtU7Ky&INP>u+qOMl{$LnL+s40;UBJ1# zk4ylnrhi!3M6CHk1#k@fz@UqFDtKy!L}l3|7JqmhB0Ki&0aU7}Dz;P&t1*9yM`z^{!7V5F`T;?T@O zAW8o&6K1~mkAX5Z2mt%jPiUiN$^U|XV|E>TF|%Ofhd@wO0Emx9DSsSG`r{g&j`@+0 zMj)sn0ECQb_7bjX;xP+v0tj41K>kct`@^`o`7;Wp)VkDeRhxBX-`Ei5Ctq?1Fa$0P zV9WUGFh3MdsCi{lqwT|X2-%{5dE2O6z4mn4$L1`C8-cC|J4Pm|!7&?u7?w5JhH+Am z+@Sq_n0c7Sw>JTV=C?hk6iCCLKU+b-8aG2Z_>iveBMyVc2TtXZbRERiaM!??uR^#O z?{v1~Bxdhtak$!P95;aIGK{usAWYldU!ffczmo_MWMmIG&`5HB+Gkw1S!>N*=d{>X z`GFUx_+;Z!(xF;_$JWG5fFr67R%7#ZSBKQZo%#$WI0cMZ$gPof&WfOt?P$lV=V`k_vEvP7)TUWdY z*gFQD%(n{QJc^S9U|KC{U5Hp}P%>Y)L=6ahSd$Vh1meoTJl*mhJ*T7(8U&>5=5a2S z2MC-`<`4@FT~8OQ;RmqHX|8v|!wSx1nR{v-z_*vf87waYg_2^9mV;59tm=Y6wz1F- z&@S1>PRWXEvX6|!={102zxK5{g=ZDOd=K{4af%z!&BVF>8375T6w&frPJ;(Xy(bWe z9o7pd{^R+qD)*>*r_v*U`4!U?a& zd&tR%U7{02-gD%)RDOkkQhqy?t7Rcj;`G=fO8wUcS3xA<86t$wwtht~LI(Y`-Y3TZ$f76yAP_}6KH z)PDpi8&vo`Rgw}j_$XI_wOA!H3 z1nkC8s~~VIG5MTw$NI1={b5#|lK(O#t)uIoy1r8Y5P`tUcdhK1Xt`yDlsacztM@l4 zF+1_4tT-vlhgtA1r>b^>5amro1yVC)W7%P%ZGP(~Of3CR4j(V}5axX853SMng1xlH znkovND*|=n`@k1JhMD*&_5-U$>sKoG3Ukz~7QseIb9YVI~5Z zCB9j@Y|LT*XKxH|bpL3a5H$(1yvLjU=DnuSy!XxQJO@XRH$R8lpg~YG8tejiC*KvXN3qxbJHaq?e16FK&4~)%AESE{wj`-i|(Q^r6~_meJj_x3W@Y>ws=~ z^~6n5_gZ=&RkF_B$mxFgIjT2H6q-OI=+@l!W}41k4#T+a7>6PEzFl+ON6_ExH>l~0 z27x=m=dtpvb$kA>Fnk)g$T|$eQ1iv3h0)XY!r`5FA2nW}*5(BPN8k`NQ`TbEoOf)F zY@|xY8@b_SaeR0C`+UolE*a15|DT{8eEEV5IJz)WO#*rF@u?AWUSn6nCas45cJj+p gj|ZB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 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

FJ$wK}0tWNB{uH;AM~i diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp index 948a3070fe34c611c42c0d3ad3013a0dce358be0..d1dddc723278f043596685654bf8ca4a466e4798 100644 GIT binary patch literal 4358 zcmV+h5&7;?Nk&Hg5C8yIMM6+kP&iET5C8x#U%(d-RfmGMZ5Wq7?Og^DF#*JR$|5at z6R4Dh3rYOik+$8HB;`1*0(KLR7SM4Sb?&!22-kJS@wCS6 zHqok0w5v54fva)ZfnLD5W@8d8A|sLw)CTZ+Aswt?%(4#3)nWnNCR({{;YOreCR(c% z%tfmOfQzj)Wuq+2b8TD=7G9gk(K8zWQwv*bv4xDti0jl&2CpRBwr$$ZjBVStQF!;6NS;8|*|uqJbAsu`RGbqSYK2;+RcTc^Dz!?Z&{61|K!z9BxWkL*0CEyBo+Eg?YOq} zhtYorZrer@z4yJHCez&~;4Tl5|5`h+XlIv}Xewp1_Q*!o`#zIv6vQm)(TeLsEw8UOXP$Vq3?@kMdeiwIrH(`55H`4Z)BCN`95OsfZJ{b55c zUih{fAZBd6cY-LJ64^YwF!eBze~xM;hK1+kxo{4>3Svgr)h0yQoKCrtiRa|GF3LZL zi>oh8GZ35fTg;|$5kXLXP8s44Cf7~oA2>VPdYI1YwKqh{v0q^PIb2tT7x(sE#I#=9 zkZDhNbwjSRHvEGSvay#y3p2WSnu>=^$b#f?&~CVp^+#R{T?cEzKT`U^Oq0h&rYU6o zXMIkDO)=+->0+5vSS;6q{xu>(dTO93#Y~L8NJ&5`ndvvy>VL`W-G>fq-YncYJ^QcV zQ6i+IcrD_XERAVO-=n!>@!QpR*VN|o{u)EGYYRW-7S5V^gQ7u zZ0HeoXD*qCIZsnwL%t0WfNiFN}*Y<-$6NW@I6DC(N-`h#$0S?b3Y&Wg3A0esml@fs)&)_0c1f@Ey>upgD z=j0Z!{xtV1=vPt7p$!8+<0?^u62a+uuU8+m0o%4@@l0zA=iA{O=>0Hb>OGQ+{6{uy zxZFNodtk@;S&HG^*%2(RfU86WDI2J7ye81LZAg@iX^d~EX2oL{BLxo#uCnbkzS7aQ zGl#U&Ik@eY?@Y^|R>ZbWFM2=sC;EhQe%GCsjfOzWAzpw<3VhkQm;r2|UJ_9%7b&h{ z-uG)P`1l<0p!UV?WH_X%yT-cwXrONLPglCEa!g0XlC^_O!{xf`_(8UAGJH~Xtr=9W zu_KkCM1?feP!SCJ1a)4(UoIp_a$u)Gr0!7FaU1SE&Pb4 zK;O{l$C!dVNqYfLHm0u2o`ZbUJj{{^WwoTjlRm21&Z5`Cm#I)_)=OQ5zy+BO@F1V{ zOc-bYB_QaeqZ3YAd^0J2qnK70%0Dqk_zF z7GfR-dsAegVL=I1;h7q3+cqTaag--V5TwhSn9Yz=eFs{2D53}_Qu zZc{NAp)NB3jIWYZR-NI^zapU7wz~GFR5CS)4YHXWC65IHiPSp zqE$vnhc9{8NULgcjuA4_qaxo&18q@!gt3Gp8kw6Hc_7Mj2y-5)>l+LzuJ8n}D`k_d zTxFTDd>Jb$x;cy~W^if=b2H(%YG#{7Y5vz)iic!f<_4uA%-`%8*6(aRSxG}}0^_Dg zHfjX9VCy+%BjJ=%`sS=M=A-J-07j@eFWTF#$6G&&}0~Kk}K(rL3_1^B} z69R^9MqP3qezO^mJ9kGlUi>^Ok0CG30bcKV3~og;-Txn|#G1`|$6a0QuFG?quF|*bb20~4mVr^O{ zRcL7T4EgM8C@8Z!Qqc!N?$yue?s8%vJ>cj%WnJg7Ak~wk8vbVgLf^dKH_V|D^k+N)5HP0r#Ag6y4VkY1KRh z!jNnwg-l?NLFOr5f-7(HklkreUIJ{Wu2{RZE9S}Y%U9OuyF(h1bAU+0A+5v71&ST) zIs)CCV7*stcj)tX0?W|k`vOU@ zx?1rjHQyBbn^~`Nq*h=0^z?r+Sp zT=SM!09|#I$Q3GF?+J*a11wZA@DYd`$n`37*W#%t((D&85g8sPIkjBo~BdIzQ8Jq$(?ajB%b0P5JMb}tbSf?e>t&Uxn4VVxn{D6Ky zIaPP{IJ7$66J+|5K?x;e4^BHr3*SO5J$&lCZN9;oR#5O41LJhFx|Uc!0-f*qe4yyd zw$FVrWa_qB*r)!hd|+9M)|y6&2h^>DQ<~h2F1V(h7VkQ(IqU@*1)68 zwYqMyudkGVu03xjyT<6oUNgTzb8ePc(O=yyphj zwZa!&lrZ~M!T*MItPILvkhI>$inv3;)PR*maSwv6HPo=cyG{R_^^(xSXe#twDJ3wg z4!`*jC5i)78^d~Kr#EmS&;#?PrQ@HzcC!LT#hUjVmq68buSZ>}%2^fk-_?-?>b>*k zi>ZM4s!mO;rq6Dl*UfQ^Z((#9{Z2>-3>SDa-#I!7> z{bk2F6#)$)%Jtr>Brq=>IysKP9?;`Trlk^p_$AuXT+G#nKK}(?&tcxsz_5<<(?;bG zghjS<$TAgyb-DZbTRTT{kQy_6^?#;(6YKMJ%dB*Id_K=hP7HjT==^=j(3_UOk*!<{ zVKQc2EBqgULsjsnB!dz)n#WP2TlZdO`%B>Xzn>cjRkGhs$#KX6=c;H@*y8DLEqA4o z1#ZW=LK4APh294g1jbz!xK)Lc-`Z)$i$v$%%Ux+*=6gQw90dzwu-qsD69ShC&#!ST z;lu+c!G2$A`AgtFaa1nsu^0if*B*kvl)$Of`m&)3wrU*AS(P=^F=F@)f%E=XsYV%`5zMr2k@ttaqso7_xtotGp0=oeZ7rUcXdk-(_ zyt?BRf`8fIKFrCZ{pF6q=)P%`|n_m;qO zHj>rii0ffV0$z`;1_Txz3%uM|9WC)sL0mGS%Ox^8aY@!z9V%Vm>E@2+3onzjP$wA# z>|Ps*ZmY})YIbN=bS4}UasiA z$%MeFW7Y$aLpv|j1Pga3$q?+4X2KlpXnxgkMw8M$S8Z6q3--`xdH{WpaSc(Tzo^tjre`AUCXJ#LMV4o5JB zgfl}@aaVs+?aQ}S2QqJRj88(q{cDf4`rQ|qwiDRDrwcshI+alT zXx;E1XIv96D%}67BiWu*g)h@sTWGB-cYOYKzHH;!-J$F%*T0g9=fi)VDSo{6K_`FD zl=ewi{Oe>urt|IySTnc0;~S^7OzG$X=Pq!2dha!Xv+j+U>sZ3P=f<7pn_Kl+9q{zF z2X{|8L~?9(F-?D`dV{)OUpUWdCr#h=C4g^yzob_v&_i~ zhAJBgS_I7L%dFOSrL@lqd9RJcN5g8{o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp index 1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f..d1dddc723278f043596685654bf8ca4a466e4798 100644 GIT binary patch literal 4358 zcmV+h5&7;?Nk&Hg5C8yIMM6+kP&iET5C8x#U%(d-RfmGMZ5Wq7?Og^DF#*JR$|5at z6R4Dh3rYOik+$8HB;`1*0(KLR7SM4Sb?&!22-kJS@wCS6 zHqok0w5v54fva)ZfnLD5W@8d8A|sLw)CTZ+Aswt?%(4#3)nWnNCR({{;YOreCR(c% z%tfmOfQzj)Wuq+2b8TD=7G9gk(K8zWQwv*bv4xDti0jl&2CpRBwr$$ZjBVStQF!;6NS;8|*|uqJbAsu`RGbqSYK2;+RcTc^Dz!?Z&{61|K!z9BxWkL*0CEyBo+Eg?YOq} zhtYorZrer@z4yJHCez&~;4Tl5|5`h+XlIv}Xewp1_Q*!o`#zIv6vQm)(TeLsEw8UOXP$Vq3?@kMdeiwIrH(`55H`4Z)BCN`95OsfZJ{b55c zUih{fAZBd6cY-LJ64^YwF!eBze~xM;hK1+kxo{4>3Svgr)h0yQoKCrtiRa|GF3LZL zi>oh8GZ35fTg;|$5kXLXP8s44Cf7~oA2>VPdYI1YwKqh{v0q^PIb2tT7x(sE#I#=9 zkZDhNbwjSRHvEGSvay#y3p2WSnu>=^$b#f?&~CVp^+#R{T?cEzKT`U^Oq0h&rYU6o zXMIkDO)=+->0+5vSS;6q{xu>(dTO93#Y~L8NJ&5`ndvvy>VL`W-G>fq-YncYJ^QcV zQ6i+IcrD_XERAVO-=n!>@!QpR*VN|o{u)EGYYRW-7S5V^gQ7u zZ0HeoXD*qCIZsnwL%t0WfNiFN}*Y<-$6NW@I6DC(N-`h#$0S?b3Y&Wg3A0esml@fs)&)_0c1f@Ey>upgD z=j0Z!{xtV1=vPt7p$!8+<0?^u62a+uuU8+m0o%4@@l0zA=iA{O=>0Hb>OGQ+{6{uy zxZFNodtk@;S&HG^*%2(RfU86WDI2J7ye81LZAg@iX^d~EX2oL{BLxo#uCnbkzS7aQ zGl#U&Ik@eY?@Y^|R>ZbWFM2=sC;EhQe%GCsjfOzWAzpw<3VhkQm;r2|UJ_9%7b&h{ z-uG)P`1l<0p!UV?WH_X%yT-cwXrONLPglCEa!g0XlC^_O!{xf`_(8UAGJH~Xtr=9W zu_KkCM1?feP!SCJ1a)4(UoIp_a$u)Gr0!7FaU1SE&Pb4 zK;O{l$C!dVNqYfLHm0u2o`ZbUJj{{^WwoTjlRm21&Z5`Cm#I)_)=OQ5zy+BO@F1V{ zOc-bYB_QaeqZ3YAd^0J2qnK70%0Dqk_zF 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 literal 2884 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 literal 5914 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNAh$p 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml index ce8393de..6b30d8d9 100644 --- a/android/app/src/main/res/values-night/styles.xml +++ b/android/app/src/main/res/values-night/styles.xml @@ -1,7 +1,3 @@ - \ No newline at end of file diff --git a/android/app/src/main/res/values/attrs_my_view.xml b/android/app/src/main/res/values/attrs_my_view.xml index 0c48d8d9..e5f8fdc2 100644 --- a/android/app/src/main/res/values/attrs_my_view.xml +++ b/android/app/src/main/res/values/attrs_my_view.xml @@ -1,8 +1,2 @@ - - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 00000000..60904177 --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FF4C4C + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index c5da3c09..ad3799d1 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,4 +1,3 @@ TurboWarp - MainActivity2 \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 0ca81d89..6b30d8d9 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,7 +1,3 @@ - \ No newline at end of file diff --git a/android/app/src/main/res/values/themes.xml b/android/app/src/main/res/values/themes.xml index 57ba7ec8..3bffc1cc 100644 --- a/android/app/src/main/res/values/themes.xml +++ b/android/app/src/main/res/values/themes.xml @@ -1,5 +1,4 @@ -