├── .gitignore ├── .gitmodules ├── .vscode ├── launch.json └── settings.json ├── LICENSE ├── README.md ├── Usages.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ ├── JsEngineSonicBridge.js │ ├── sonic.js │ ├── sonic.kbc1 │ ├── test.js │ └── test.kbc1 │ ├── java │ └── com │ │ └── shiqi │ │ └── testquickjs │ │ ├── HippyJsEngine.kt │ │ ├── MainActivity.kt │ │ ├── QuickJsEngine.kt │ │ └── ui │ │ └── theme │ │ ├── Color.kt │ │ ├── Theme.kt │ │ └── Type.kt │ └── res │ ├── drawable │ ├── ic_launcher_background.xml │ └── ic_launcher_foreground.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ └── ic_launcher_round.webp │ └── values │ ├── colors.xml │ ├── strings.xml │ └── themes.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── quickjs-android ├── .gitignore ├── CMakeLists.txt ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── c │ ├── java-helper.c │ ├── java-helper.h │ ├── java-method.c │ ├── java-method.h │ ├── java-object.c │ ├── java-object.h │ └── quickjs-jni.c │ └── java │ └── com │ └── shiqi │ └── quickjs │ ├── ArrayTypeAdapter.java │ ├── InterfaceTypeAdapter.java │ ├── JNIHelper.java │ ├── JSArray.java │ ├── JSArrayBuffer.java │ ├── JSBoolean.java │ ├── JSContext.java │ ├── JSDataException.java │ ├── JSEvaluationException.java │ ├── JSException.java │ ├── JSFloat64.java │ ├── JSFunction.java │ ├── JSFunctionCallback.java │ ├── JSInt.java │ ├── JSInternal.java │ ├── JSNull.java │ ├── JSNumber.java │ ├── JSObject.java │ ├── JSRuntime.java │ ├── JSString.java │ ├── JSSymbol.java │ ├── JSUndefined.java │ ├── JSValue.java │ ├── JSValueAdapter.java │ ├── JavaMethod.java │ ├── JavaType.java │ ├── JavaTypes.java │ ├── NativeCleaner.java │ ├── PromiseExecutor.java │ ├── QuickJS.java │ ├── StandardTypeAdapters.java │ └── TypeAdapter.java ├── quickjs ├── .gitattributes ├── .gitignore ├── CMakeLists.txt ├── Changelog ├── README.md ├── TODO ├── VERSION ├── doc │ ├── jsbignum.texi │ └── quickjs.texi ├── examples │ ├── fib.c │ ├── fib_module.js │ ├── hello.js │ ├── hello_module.js │ ├── pi_bigdecimal.js │ ├── pi_bigfloat.js │ ├── pi_bigint.js │ ├── point.c │ ├── test_fib.js │ └── test_point.js ├── include │ └── quickjs │ │ ├── cutils.h │ │ ├── libbf.h │ │ ├── libregexp-opcode.h │ │ ├── libregexp.h │ │ ├── libunicode-table.h │ │ ├── libunicode.h │ │ ├── list.h │ │ ├── quickjs-atom.h │ │ ├── quickjs-opcode.h │ │ └── quickjs.h ├── qjs.c ├── qjsc.c ├── qjscalc.c ├── qjscalc.js ├── quickjs-libc.c ├── quickjs-libc.h ├── release.sh ├── repl.c ├── repl.js ├── run-test262.c ├── scripts │ ├── build.sh │ ├── ci.sh │ └── test.sh ├── src │ ├── CMakeLists.txt │ ├── core │ │ ├── base.h │ │ ├── builtins │ │ │ ├── js-array.c │ │ │ ├── js-array.h │ │ │ ├── js-async-function.c │ │ │ ├── js-async-function.h │ │ │ ├── js-async-generator.c │ │ │ ├── js-async-generator.h │ │ │ ├── js-atomics.c │ │ │ ├── js-atomics.h │ │ │ ├── js-big-num.c │ │ │ ├── js-big-num.h │ │ │ ├── js-boolean.c │ │ │ ├── js-boolean.h │ │ │ ├── js-closures.c │ │ │ ├── js-closures.h │ │ │ ├── js-date.c │ │ │ ├── js-date.h │ │ │ ├── js-function.c │ │ │ ├── js-function.h │ │ │ ├── js-generator.c │ │ │ ├── js-generator.h │ │ │ ├── js-json.c │ │ │ ├── js-json.h │ │ │ ├── js-map.c │ │ │ ├── js-map.h │ │ │ ├── js-math.c │ │ │ ├── js-math.h │ │ │ ├── js-number.c │ │ │ ├── js-number.h │ │ │ ├── js-object.c │ │ │ ├── js-object.h │ │ │ ├── js-operator.c │ │ │ ├── js-operator.h │ │ │ ├── js-promise.c │ │ │ ├── js-promise.h │ │ │ ├── js-proxy.c │ │ │ ├── js-proxy.h │ │ │ ├── js-reflect.c │ │ │ ├── js-reflect.h │ │ │ ├── js-regexp.c │ │ │ ├── js-regexp.h │ │ │ ├── js-string.c │ │ │ ├── js-string.h │ │ │ ├── js-symbol.c │ │ │ ├── js-symbol.h │ │ │ ├── js-typed-array.c │ │ │ └── js-typed-array.h │ │ ├── bytecode.c │ │ ├── bytecode.h │ │ ├── convertion.c │ │ ├── convertion.h │ │ ├── exception.c │ │ ├── exception.h │ │ ├── function.c │ │ ├── function.h │ │ ├── gc.c │ │ ├── gc.h │ │ ├── ic.c │ │ ├── ic.h │ │ ├── malloc.c │ │ ├── malloc.h │ │ ├── memory.c │ │ ├── memory.h │ │ ├── misc │ │ │ ├── debug.c │ │ │ └── debug.h │ │ ├── module.c │ │ ├── module.h │ │ ├── object.c │ │ ├── object.h │ │ ├── parser.c │ │ ├── parser.h │ │ ├── runtime.c │ │ ├── runtime.h │ │ ├── shape.c │ │ ├── shape.h │ │ ├── string.c │ │ ├── string.h │ │ └── types.h │ ├── cutils.c │ ├── libbf.c │ ├── libregexp.c │ └── libunicode.c ├── test262.conf ├── test262o.conf ├── tests │ ├── bjson.c │ ├── microbench.js │ ├── test262.patch │ ├── test_bignum.js │ ├── test_bjson.js │ ├── test_builtin.js │ ├── test_closure.js │ ├── test_ic_atom_free.js │ ├── test_language.js │ ├── test_line_column_num.js │ ├── test_loop.js │ ├── test_op_overloading.js │ ├── test_promise_gc_crash.js │ ├── test_qjscalc.js │ ├── test_std.js │ ├── test_worker.js │ └── test_worker_module.js ├── unicode_download.sh ├── unicode_gen.c └── unicode_gen_def.h └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | /.idea/ -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "mimalloc"] 2 | path = quickjs/vendor/mimalloc 3 | url = https://github.com/microsoft/mimalloc.git 4 | branch = v2.1.2 -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "lldb", 9 | "request": "launch", 10 | "name": "Debug", 11 | "program": "${workspaceFolder}/quickjs/bin/qjs", 12 | "args": [], 13 | "cwd": "${workspaceFolder}" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cmake.sourceDirectory": "${workspaceFolder}/quickjs", 3 | "cmake.cmakePath": "/usr/local/bin/cmake", 4 | "files.associations": { 5 | "js-array.h": "c" 6 | } 7 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | QuickJS Javascript Engine 2 | 3 | Copyright (c) 2017-2021 Fabrice Bellard 4 | Copyright (c) 2017-2021 Charlie Gordon 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # QuickJS Android 2 | 3 | > Self-maintained QuickJS Android Bindings. 4 | 5 | ## Usage 6 | 7 | 1. Download the latest `.aar` archive from [release](https://github.com/shiqimei/quickjs-android/releases) page; 8 | 2. In Android Studio: `File > New > New Module > Import .JAR/.AAR Package`, locate `.aar`, click `Finish`. 9 | 10 | ```Java 11 | QuickJS quickJS = new QuickJS.Builder().build(); 12 | try (JSRuntime runtime = quickJS.createJSRuntime()) { 13 | try (JSContext context = runtime.createJSContext()) { 14 | String script1 = "" + 15 | "function fibonacci(n) {" + 16 | " if (n == 0 || n == 1) return n;" + 17 | " return fibonacci(n - 1) + fibonacci(n - 2);" + 18 | "}"; 19 | // Evaluate a script without return value 20 | context.evaluate(script1, "fibonacci.js"); 21 | 22 | String script2 = "fibonacci(10);"; 23 | // Evaluate a script with return value 24 | int result = context.evaluate(script2, "fibonacci.js", int.class); 25 | assertEquals(55, result); 26 | } 27 | } 28 | ``` 29 | 30 | See [Usages.md](./Usages.md) for advanced usages. 31 | 32 | ## Develop 33 | 34 | ```bash 35 | git clone --recurse-submodules https://github.com/shiqimei/quickjs-android.git 36 | ``` 37 | 38 | Open the folder `quickjs-android` in Android Studio. 39 | 40 | ## Benchmark 41 | 42 | This is a non-serious benchmark. The purpose is to compare the performance of QuickJS and V8 on Android. 43 | 44 | | Engine | v8 | QuickJS (Script Mode) | QuickJS (Bytecode Mode) | 45 | | :----: | :--: | :-------------------: | :---------------------: | 46 | | init | 30ms | 18ms | 18ms | 47 | | eval | 29ms | 282ms | 48ms | 48 | | total | 59ms | 300ms | 56ms | 49 | 50 | - Device: Huawei P30 Pro (Kirin 980), Android 10. 51 | - Test JavaScript File: `asset:/sonic.js` (189 KB). 52 | 53 | ### Conclusion 54 | 55 | 1. Even when operating in bytecode mode, QuickJS's evaluation time is notably higher than V8's, and this disparity intensifies as the JavaScript file size increases. 56 | 2. QuickJS's initialization time is slightly lower than V8's, and this advantage is constant despite of file sizes. 57 | 58 | ## Acknowledgement 59 | 60 | 1. [bellard/quickjs](https://github.com/bellard/quickjs) QuickJS official repository. 61 | 2. [seven332/quickjs-android](https://github.com/seven332/quickjs-android) QuickJS Android Wrapper. 62 | 3. [openwebf/quickjs](https://github.com/openwebf/quickjs) Optimized quickjs mantained by OpenWebF team. 63 | 4. [taoweiji/quickjs-android](https://github.com/taoweiji/quickjs-android) Android Bindings for QuickJS, A fine little javascript engine. 64 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | id 'org.jetbrains.kotlin.android' 4 | } 5 | 6 | android { 7 | namespace 'com.shiqi.testquickjs' 8 | compileSdk 33 9 | 10 | defaultConfig { 11 | applicationId "com.shiqi.testquickjs" 12 | minSdk 24 13 | targetSdk 33 14 | versionCode 1 15 | versionName "1.0" 16 | 17 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 18 | vectorDrawables { 19 | useSupportLibrary true 20 | } 21 | } 22 | 23 | buildTypes { 24 | release { 25 | minifyEnabled false 26 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 27 | } 28 | } 29 | compileOptions { 30 | sourceCompatibility JavaVersion.VERSION_1_8 31 | targetCompatibility JavaVersion.VERSION_1_8 32 | } 33 | kotlinOptions { 34 | jvmTarget = '1.8' 35 | } 36 | buildFeatures { 37 | compose true 38 | } 39 | composeOptions { 40 | kotlinCompilerExtensionVersion '1.4.5' 41 | } 42 | packagingOptions { 43 | resources { 44 | excludes += '/META-INF/{AL2.0,LGPL2.1}' 45 | } 46 | } 47 | } 48 | 49 | dependencies { 50 | 51 | implementation project(':quickjs-android') 52 | implementation("com.tencent.hippy:hippy-common:2.12.1") 53 | 54 | implementation 'androidx.core:core-ktx:1.9.0' 55 | implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' 56 | implementation 'androidx.activity:activity-compose:1.5.1' 57 | implementation platform('androidx.compose:compose-bom:2022.10.00') 58 | implementation 'androidx.compose.ui:ui' 59 | implementation 'androidx.compose.ui:ui-graphics' 60 | implementation 'androidx.compose.ui:ui-tooling-preview' 61 | implementation 'androidx.compose.material3:material3' 62 | testImplementation 'junit:junit:4.13.2' 63 | androidTestImplementation 'androidx.test.ext:junit:1.1.5' 64 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' 65 | androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00') 66 | androidTestImplementation 'androidx.compose.ui:ui-test-junit4' 67 | debugImplementation 'androidx.compose.ui:ui-tooling' 68 | debugImplementation 'androidx.compose.ui:ui-test-manifest' 69 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/assets/JsEngineSonicBridge.js: -------------------------------------------------------------------------------- 1 | var sonicNativeBridgeCore=function(){"use strict";function c(e,r){for(var t=0;t Unit 46 | ) { 47 | val colorScheme = when { 48 | dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { 49 | val context = LocalContext.current 50 | if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) 51 | } 52 | 53 | darkTheme -> DarkColorScheme 54 | else -> LightColorScheme 55 | } 56 | val view = LocalView.current 57 | if (!view.isInEditMode) { 58 | SideEffect { 59 | val window = (view.context as Activity).window 60 | window.statusBarColor = colorScheme.primary.toArgb() 61 | WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme 62 | } 63 | } 64 | 65 | MaterialTheme( 66 | colorScheme = colorScheme, 67 | typography = Typography, 68 | content = content 69 | ) 70 | } -------------------------------------------------------------------------------- /app/src/main/java/com/shiqi/testquickjs/ui/theme/Type.kt: -------------------------------------------------------------------------------- 1 | package com.shiqi.testquickjs.ui.theme 2 | 3 | import androidx.compose.material3.Typography 4 | import androidx.compose.ui.text.TextStyle 5 | import androidx.compose.ui.text.font.FontFamily 6 | import androidx.compose.ui.text.font.FontWeight 7 | import androidx.compose.ui.unit.sp 8 | 9 | // Set of Material typography styles to start with 10 | val Typography = Typography( 11 | bodyLarge = TextStyle( 12 | fontFamily = FontFamily.Default, 13 | fontWeight = FontWeight.Normal, 14 | fontSize = 16.sp, 15 | lineHeight = 24.sp, 16 | letterSpacing = 0.5.sp 17 | ) 18 | /* Other default text styles to override 19 | titleLarge = TextStyle( 20 | fontFamily = FontFamily.Default, 21 | fontWeight = FontWeight.Normal, 22 | fontSize = 22.sp, 23 | lineHeight = 28.sp, 24 | letterSpacing = 0.sp 25 | ), 26 | labelSmall = TextStyle( 27 | fontFamily = FontFamily.Default, 28 | fontWeight = FontWeight.Medium, 29 | fontSize = 11.sp, 30 | lineHeight = 16.sp, 31 | letterSpacing = 0.5.sp 32 | ) 33 | */ 34 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenQuickJS/quickjs-android/0319d76cd984fe6d591760e7e30a3bb003a0d768/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenQuickJS/quickjs-android/0319d76cd984fe6d591760e7e30a3bb003a0d768/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenQuickJS/quickjs-android/0319d76cd984fe6d591760e7e30a3bb003a0d768/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenQuickJS/quickjs-android/0319d76cd984fe6d591760e7e30a3bb003a0d768/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenQuickJS/quickjs-android/0319d76cd984fe6d591760e7e30a3bb003a0d768/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenQuickJS/quickjs-android/0319d76cd984fe6d591760e7e30a3bb003a0d768/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenQuickJS/quickjs-android/0319d76cd984fe6d591760e7e30a3bb003a0d768/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenQuickJS/quickjs-android/0319d76cd984fe6d591760e7e30a3bb003a0d768/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenQuickJS/quickjs-android/0319d76cd984fe6d591760e7e30a3bb003a0d768/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenQuickJS/quickjs-android/0319d76cd984fe6d591760e7e30a3bb003a0d768/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | app 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |