diff options
author | RaindropsSys <raindrops@equestria.dev> | 2023-10-27 22:29:56 +0200 |
---|---|---|
committer | RaindropsSys <raindrops@equestria.dev> | 2023-10-27 22:29:56 +0200 |
commit | 4d4308c46d4f7801c657cc79d2243e1a81831334 (patch) | |
tree | a2e392e0af92b9a3ca3d1b5afb841640276e2294 /android | |
parent | 9f9d66afebc59c6c265c4424f7b8fb36d8876541 (diff) | |
download | mist-4d4308c46d4f7801c657cc79d2243e1a81831334.tar.gz mist-4d4308c46d4f7801c657cc79d2243e1a81831334.tar.bz2 mist-4d4308c46d4f7801c657cc79d2243e1a81831334.zip |
Updated 32 files, added 279 files, deleted 3 files and renamed 14 files (automated)
Diffstat (limited to 'android')
64 files changed, 1677 insertions, 0 deletions
diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..aa724b7 --- /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/.idea/.gitignore b/android/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/android/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/android/.idea/.name b/android/.idea/.name new file mode 100644 index 0000000..e95fedb --- /dev/null +++ b/android/.idea/.name @@ -0,0 +1 @@ +Mist
\ No newline at end of file diff --git a/android/.idea/compiler.xml b/android/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/android/.idea/compiler.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="CompilerConfiguration"> + <bytecodeTargetLevel target="17" /> + </component> +</project>
\ No newline at end of file diff --git a/android/.idea/deploymentTargetDropDown.xml b/android/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..0c0c338 --- /dev/null +++ b/android/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="deploymentTargetDropDown"> + <value> + <entry key="app"> + <State /> + </entry> + </value> + </component> +</project>
\ No newline at end of file diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml new file mode 100644 index 0000000..0897082 --- /dev/null +++ b/android/.idea/gradle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="GradleMigrationSettings" migrationVersion="1" /> + <component name="GradleSettings"> + <option name="linkedExternalProjectsSettings"> + <GradleProjectSettings> + <option name="externalProjectPath" value="$PROJECT_DIR$" /> + <option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" /> + <option name="modules"> + <set> + <option value="$PROJECT_DIR$" /> + <option value="$PROJECT_DIR$/app" /> + </set> + </option> + <option name="resolveExternalAnnotations" value="false" /> + </GradleProjectSettings> + </option> + </component> +</project>
\ No newline at end of file diff --git a/android/.idea/inspectionProfiles/Project_Default.xml b/android/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..44ca2d9 --- /dev/null +++ b/android/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,41 @@ +<component name="InspectionProjectProfileManager"> + <profile version="1.0"> + <option name="myName" value="Project Default" /> + <inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewApiLevelMustBeValid" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + </profile> +</component>
\ No newline at end of file diff --git a/android/.idea/kotlinc.xml b/android/.idea/kotlinc.xml new file mode 100644 index 0000000..fdf8d99 --- /dev/null +++ b/android/.idea/kotlinc.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="KotlinJpsPluginSettings"> + <option name="version" value="1.9.0" /> + </component> +</project>
\ No newline at end of file diff --git a/android/.idea/migrations.xml b/android/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/android/.idea/migrations.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectMigrations"> + <option name="MigrateToGradleLocalJavaHome"> + <set> + <option value="$PROJECT_DIR$" /> + </set> + </option> + </component> +</project>
\ No newline at end of file diff --git a/android/.idea/misc.xml b/android/.idea/misc.xml new file mode 100644 index 0000000..0ad17cb --- /dev/null +++ b/android/.idea/misc.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ExternalStorageConfigurationManager" enabled="true" /> + <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> + <output url="file://$PROJECT_DIR$/build/classes" /> + </component> + <component name="ProjectType"> + <option name="id" value="Android" /> + </component> +</project>
\ No newline at end of file diff --git a/android/.idea/vcs.xml b/android/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/android/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="$PROJECT_DIR$/.." vcs="Git" /> + </component> +</project>
\ No newline at end of file diff --git a/android/app/.gitignore b/android/app/.gitignore new file mode 100644 index 0000000..42afabf --- /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 0000000..8975408 --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,77 @@ +@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed +plugins { + alias(libs.plugins.androidApplication) + alias(libs.plugins.kotlinAndroid) +} + +android { + namespace = "dev.equestria.mist" + compileSdk = 34 + + defaultConfig { + applicationId = "dev.equestria.mist" + minSdk = 30 + targetSdk = 34 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildFeatures { + buildConfig = true + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.1" + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + implementation(libs.volley) + implementation(libs.core.ktx) + implementation(libs.lifecycle.runtime.ktx) + implementation(libs.activity.compose) + implementation(platform(libs.compose.bom)) + implementation(libs.ui) + implementation(libs.ui.graphics) + implementation(libs.ui.tooling.preview) + implementation(libs.material3) + implementation(libs.material) + implementation(libs.androidx.media3.session) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.test.ext.junit) + androidTestImplementation(libs.espresso.core) + androidTestImplementation(platform(libs.compose.bom)) + androidTestImplementation(libs.ui.test.junit4) + debugImplementation(libs.ui.tooling) + debugImplementation(libs.ui.test.manifest) + implementation(libs.androidx.media) +}
\ 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 0000000..481bb43 --- /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/release/app-release.apk b/android/app/release/app-release.apk Binary files differnew file mode 100644 index 0000000..779688c --- /dev/null +++ b/android/app/release/app-release.apk diff --git a/android/app/release/app-release.apk.zip b/android/app/release/app-release.apk.zip Binary files differnew file mode 100644 index 0000000..d6ecb7d --- /dev/null +++ b/android/app/release/app-release.apk.zip diff --git a/android/app/release/output-metadata.json b/android/app/release/output-metadata.json new file mode 100644 index 0000000..0debc4d --- /dev/null +++ b/android/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "dev.equestria.mist", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +}
\ 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 0000000..5323578 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools"> + + <uses-permission android:name="android.permission.INTERNET"/> + <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> + <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"/> + <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> + + <application + android:allowBackup="true" + android:dataExtractionRules="@xml/data_extraction_rules" + android:fullBackupContent="@xml/backup_rules" + android:icon="@mipmap/ic_launcher" + android:label="Equestria.dev Mist" + android:roundIcon="@mipmap/ic_launcher_round" + android:supportsRtl="true" + android:theme="@style/Theme.Mist" + tools:targetApi="33"> + <activity + android:name=".MainActivity" + android:exported="true" + android:label="@string/app_name" + android:windowSoftInputMode="adjustResize" + android:theme="@style/Theme.Mist"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + <service + android:name=".MediaPlaybackService" + android:foregroundServiceType="mediaPlayback" + android:exported="false" + android:stopWithTask="false"> + </service> + </application> + +</manifest>
\ No newline at end of file diff --git a/android/app/src/main/ic_launcher-playstore.png b/android/app/src/main/ic_launcher-playstore.png Binary files differnew file mode 100644 index 0000000..b323030 --- /dev/null +++ b/android/app/src/main/ic_launcher-playstore.png diff --git a/android/app/src/main/java/dev/equestria/mist/JavaScriptExtensions.kt b/android/app/src/main/java/dev/equestria/mist/JavaScriptExtensions.kt new file mode 100644 index 0000000..8cb1c90 --- /dev/null +++ b/android/app/src/main/java/dev/equestria/mist/JavaScriptExtensions.kt @@ -0,0 +1,184 @@ +package dev.equestria.mist + +import android.Manifest +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.BitmapFactory +import android.support.v4.media.MediaMetadataCompat +import android.support.v4.media.session.MediaSessionCompat +import android.support.v4.media.session.PlaybackStateCompat +import android.util.Log +import android.view.View +import android.view.Window +import android.webkit.JavascriptInterface +import androidx.activity.ComponentActivity +import androidx.core.app.ActivityCompat +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import androidx.core.view.WindowCompat +import androidx.media.app.NotificationCompat.MediaStyle +import java.io.IOException +import java.net.URL +import android.graphics.Bitmap +import android.webkit.WebView + + +fun convertPixelsToDp(context: Context, pixels: Float): Float { + val screenPixelDensity = context.resources.displayMetrics.density + val dpValue = pixels / screenPixelDensity + return dpValue +} + +@SuppressLint("InternalInsetResource", "DiscouragedApi") +fun getStatusBarHeight(activity: ComponentActivity): Float { + val resourceId = activity.resources.getIdentifier("status_bar_height", "dimen", "android") + return if (resourceId > 0) { + val statusBarHeight = activity.resources.getDimensionPixelSize(resourceId) + convertPixelsToDp(activity.applicationContext, statusBarHeight.toFloat()) + } else { + 0f + } +} + +@SuppressLint("InternalInsetResource", "DiscouragedApi") +fun getNavigationBarHeight(activity: ComponentActivity): Float { + val resourceId = activity.resources.getIdentifier("navigation_bar_height", "dimen", "android") + return if (resourceId > 0) { + val statusBarHeight = activity.resources.getDimensionPixelSize(resourceId) + convertPixelsToDp(activity.applicationContext, statusBarHeight.toFloat()) + } else { + 0f + } +} + +class JavaScriptExtensions(originalActivity: MainActivity, private val window: Window, private val view: WebView, private val intent: Intent) { + private val activity: MainActivity = originalActivity + private var initialStatusBar: Boolean = WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars + private val session: MediaSessionCompat = MediaSessionCompat(activity.applicationContext, "Player") + private val notificationBuilder: NotificationCompat.Builder = NotificationCompat.Builder(activity.applicationContext, "main") + .setSmallIcon(R.drawable.ic_stat_player) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setContentTitle("Mist") + private var mAlbumArt: Bitmap? = null + + @JavascriptInterface + fun removeNotification() { + with (NotificationManagerCompat.from(activity.applicationContext)) { + cancel(1) + } + } + + @JavascriptInterface + fun removeService() { + activity.stopService(intent) + } + + @JavascriptInterface + fun updateNotificationAlbumArt(albumArt: String) { + activity.startForegroundService(intent) + + try { + val url = URL(albumArt) + val image = BitmapFactory.decodeStream(url.openConnection().getInputStream()) + mAlbumArt = image + } catch (e: IOException) { + Log.e("NotificationAlbumArt", "Failed to fetch album art", e) + } + } + + @JavascriptInterface + fun setNotificationData(title: String, artist: String, album: String, position: Long, duration: Long, playing: Boolean, buffering: Boolean, shuffle: Boolean, repeat: Boolean) { + val playbackStateBuilder = PlaybackStateCompat.Builder() + val style = MediaStyle() + + val state = if (buffering) { + PlaybackStateCompat.STATE_BUFFERING + } else if (playing) { + PlaybackStateCompat.STATE_PLAYING + } else { + PlaybackStateCompat.STATE_PAUSED + } + val playbackSpeed = 1f + playbackStateBuilder.setState(state, position, playbackSpeed) + + playbackStateBuilder.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE + or PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS + or PlaybackStateCompat.ACTION_SKIP_TO_NEXT + or PlaybackStateCompat.ACTION_SEEK_TO + or PlaybackStateCompat.ACTION_STOP + ) + + val builder = MediaMetadataCompat.Builder() + + builder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, title) + builder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist) + builder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, album) + builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, mAlbumArt) + builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, mAlbumArt) + builder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration) + + val callback = object: MediaSessionCompat.Callback() { + override fun onPlay() { + view.post { view.evaluateJavascript("window.playPause();", null) } + } + + override fun onPause() { + view.post { view.evaluateJavascript("window.playPause();", null) } + } + + override fun onStop() { + view.post { view.evaluateJavascript("window.stop();", null) } + } + + override fun onSkipToPrevious() { + view.post { view.evaluateJavascript("window.previous();", null) } + } + + override fun onSkipToNext() { + view.post { view.evaluateJavascript("window.next();", null) } + } + + override fun onSeekTo(pos: Long) { + view.post { view.evaluateJavascript("window.document.getElementById(\"player\").contentDocument.getElementById(\"player-audio\").currentTime = $pos / 1000;", null) } + } + } + + session.setCallback(callback) + session.setMetadata(builder.build()) + session.setPlaybackState(playbackStateBuilder.build()) + style.setMediaSession(session.sessionToken) + notificationBuilder.setStyle(style) + + val notification = notificationBuilder.build() + + with (NotificationManagerCompat.from(activity.applicationContext)) { + if (ActivityCompat.checkSelfPermission( + activity.applicationContext, + Manifest.permission.POST_NOTIFICATIONS + ) != PackageManager.PERMISSION_GRANTED + ) { + return + } + notify(1, notification) + } + } + + @JavascriptInterface + fun getNavigationBarHeight(): Float { + return getNavigationBarHeight(activity) + } + + @JavascriptInterface + fun getStatusBarHeight(): Float { + return getStatusBarHeight(activity) + } + + @JavascriptInterface + fun setStatusBarTheme(dark: Boolean) { + if (!initialStatusBar) return + WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = dark + } +} + diff --git a/android/app/src/main/java/dev/equestria/mist/MainActivity.kt b/android/app/src/main/java/dev/equestria/mist/MainActivity.kt new file mode 100644 index 0000000..939feaa --- /dev/null +++ b/android/app/src/main/java/dev/equestria/mist/MainActivity.kt @@ -0,0 +1,203 @@ +package dev.equestria.mist + +import android.Manifest +import android.annotation.SuppressLint +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.media.MediaMetadata +import android.os.Build +import android.os.Bundle +import android.support.v4.media.MediaMetadataCompat +import android.support.v4.media.session.MediaSessionCompat +import android.support.v4.media.session.PlaybackStateCompat +import android.util.Log +import android.view.ViewGroup +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.AlertDialogDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.core.app.ActivityCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.WindowInsetsControllerCompat +import androidx.media.app.NotificationCompat as MediaNotificationCompat +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import androidx.core.content.ContextCompat +import com.android.volley.Request +import com.android.volley.toolbox.JsonObjectRequest +import com.android.volley.toolbox.Volley +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import dev.equestria.mist.ui.theme.MistTheme + +class MainActivity : ComponentActivity() { + private lateinit var intent: Intent + + @OptIn(ExperimentalMaterial3Api::class) + fun showError() { + setContent { + AlertDialog( + onDismissRequest = { + finish() + } + ) { + Surface( + modifier = Modifier + .wrapContentWidth() + .wrapContentHeight(), + shape = MaterialTheme.shapes.large, + tonalElevation = AlertDialogDefaults.TonalElevation + ) { + Column(modifier = Modifier.padding(16.dp)) { + Text( + text = "Unable to connect to Mist at this moment. Please try again later.", + ) + Spacer(modifier = Modifier.height(24.dp)) + TextButton( + onClick = { + finish() + }, + modifier = Modifier.align(Alignment.End) + ) { + Text("Quit") + } + } + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + intent = Intent(this, MediaPlaybackService::class.java) + + super.onCreate(savedInstanceState) + WindowCompat.setDecorFitsSystemWindows(window, false) + + if (ActivityCompat.checkSelfPermission( + applicationContext, + Manifest.permission.POST_NOTIFICATIONS + ) != PackageManager.PERMISSION_GRANTED + ) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + ActivityCompat.requestPermissions( + this, arrayOf(Manifest.permission.POST_NOTIFICATIONS), 1 + ) + } + } + + val channel = NotificationChannel("main", "Playback", NotificationManager.IMPORTANCE_DEFAULT).apply {} + val notificationManager: NotificationManager = + getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.createNotificationChannel(channel) + + setContent { + Box() { + MistTheme {} + } + } + + val volleyQueue = Volley.newRequestQueue(baseContext) + + val jsonObjectRequest = JsonObjectRequest( + Request.Method.GET, "https://mist.equestria.horse/connectivitycheck.txt", null, + + { response -> + Log.i("HTTPRequest", response.toString()) + + if (response.getString("status") == "OK") { + setContent { + Box() { + MistTheme { + WebViewContainer(this@MainActivity, intent) + } + } + } + + WebView.setWebContentsDebuggingEnabled(true) + } else { + setContent { + Box() { + MistTheme {} + } + } + showError() + } + }, + + { error -> + setContent { + Box() { + MistTheme {} + } + } + showError() + Log.e("HTTPRequest", "Request error: ${error.localizedMessage}") + }) + + volleyQueue.add(jsonObjectRequest) + + Log.d("StatusBarHeight", getStatusBarHeight(this).toString()) + Log.d("NavigationBarHeight", getNavigationBarHeight(this).toString()) + } +} + +@SuppressLint("SetJavaScriptEnabled") +@Composable +fun WebViewContainer(activity: MainActivity, intent: Intent) { + val mUrl = "https://mist.equestria.horse/app/" + + AndroidView(factory = { + WebView(it).apply { + layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + + clearCache(true) + clearHistory() + webViewClient = WebViewClient() + + settings.domStorageEnabled = true + settings.javaScriptEnabled = true + settings.safeBrowsingEnabled = false + settings.mediaPlaybackRequiresUserGesture = false + settings.userAgentString += " MistAndroid/" + BuildConfig.VERSION_NAME + settings.cacheMode = WebSettings.LOAD_NO_CACHE + + addJavascriptInterface(JavaScriptExtensions(activity, activity.window, this, intent), "MistAndroid") + loadUrl(mUrl) + } + }) +}
\ No newline at end of file diff --git a/android/app/src/main/java/dev/equestria/mist/MediaPlaybackService.kt b/android/app/src/main/java/dev/equestria/mist/MediaPlaybackService.kt new file mode 100644 index 0000000..15472b1 --- /dev/null +++ b/android/app/src/main/java/dev/equestria/mist/MediaPlaybackService.kt @@ -0,0 +1,59 @@ +package dev.equestria.mist + +import android.Manifest +import android.app.ForegroundServiceStartNotAllowedException +import android.app.Notification +import android.app.Service +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build +import android.os.IBinder +import android.support.v4.media.MediaMetadataCompat +import android.support.v4.media.session.MediaSessionCompat +import android.support.v4.media.session.PlaybackStateCompat +import androidx.core.app.ActivityCompat +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import androidx.core.app.ServiceCompat + +class MediaPlaybackService: Service() { + private lateinit var mNotification: Notification + + fun setNotification(notification: Notification) { + mNotification = notification + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + val session = MediaSessionCompat(applicationContext, "Player") + val playbackStateBuilder = PlaybackStateCompat.Builder() + val style = androidx.media.app.NotificationCompat.MediaStyle() + + val notificationBuilder = NotificationCompat.Builder(applicationContext, "main") + .setSmallIcon(R.drawable.ic_stat_player) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setContentTitle("Mist") + + playbackStateBuilder.setState(PlaybackStateCompat.STATE_STOPPED, 0L, 1f) + + session.setPlaybackState(playbackStateBuilder.build()) + style.setMediaSession(session.sessionToken) + notificationBuilder.setStyle(style) + + val notification = notificationBuilder.build() + startForeground(1, notification) + return START_STICKY + } + + override fun onBind(p0: Intent?): IBinder? { + return null + } + + override fun onTaskRemoved(rootIntent: Intent?) { + super.onTaskRemoved(rootIntent) + with (NotificationManagerCompat.from(applicationContext)) { + cancel(1) + } + android.os.Process.killProcess(android.os.Process.myPid()) + stopSelf() + } +}
\ No newline at end of file diff --git a/android/app/src/main/java/dev/equestria/mist/ui/theme/Color.kt b/android/app/src/main/java/dev/equestria/mist/ui/theme/Color.kt new file mode 100644 index 0000000..4ef2c56 --- /dev/null +++ b/android/app/src/main/java/dev/equestria/mist/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package dev.equestria.mist.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/dev/equestria/mist/ui/theme/Theme.kt b/android/app/src/main/java/dev/equestria/mist/ui/theme/Theme.kt new file mode 100644 index 0000000..051d910 --- /dev/null +++ b/android/app/src/main/java/dev/equestria/mist/ui/theme/Theme.kt @@ -0,0 +1,80 @@ +package dev.equestria.mist.ui.theme + +import android.app.Activity +import android.graphics.Color +import android.os.Build +import android.view.Window +import android.view.WindowInsetsController +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.runtime.SideEffect +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat + +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 MistTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + 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 + } + val view = LocalView.current + + val navigationBarItemColor = when { + darkTheme -> Window.DECOR_CAPTION_SHADE_LIGHT + else -> Window.DECOR_CAPTION_SHADE_DARK + } + + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + window.statusBarColor = Color.TRANSPARENT + window.navigationBarColor = Color.TRANSPARENT + window.setDecorCaptionShade(navigationBarItemColor) + WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme + } + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +}
\ No newline at end of file diff --git a/android/app/src/main/java/dev/equestria/mist/ui/theme/Type.kt b/android/app/src/main/java/dev/equestria/mist/ui/theme/Type.kt new file mode 100644 index 0000000..290c7d2 --- /dev/null +++ b/android/app/src/main/java/dev/equestria/mist/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package dev.equestria.mist.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-anydpi/ic_stat_player.xml b/android/app/src/main/res/drawable-anydpi/ic_stat_player.xml new file mode 100644 index 0000000..b52b8bd --- /dev/null +++ b/android/app/src/main/res/drawable-anydpi/ic_stat_player.xml @@ -0,0 +1,82 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="512" + android:viewportHeight="512" + android:tint="#FFFFFF"> + <group android:scaleX="1.127451" + android:scaleY="1.127451" + android:translateX="-32.627453" + android:translateY="-32.627453"> + <path + android:pathData="M265.3,328.2c0.2,1.2 0.5,2.2 -0.5,2.9c-1,0.7 -1.9,0.3 -2.6,-0.4c-5.6,-5.3 -10.9,-4.2 -16,0.6c-0.7,0.7 -1.7,1.1 -2.7,0.6s-1.1,-1.5 -0.9,-2.5c0.7,-3.3 7.1,-7.5 11.8,-7.5C259.3,322 263,324.2 265.3,328.2z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M221.7,223.6c-8.7,-10.6 -17,-21.6 -26.5,-31.5c-15.3,-16.1 -31.8,-30.7 -52.1,-40.5c-13.3,-6.4 -27.1,-9.4 -41.7,-6.9c-9.1,1.6 -16.3,5.7 -18.6,15.5c-1.6,9.3 -0.8,18.4 1.9,27.6c2.5,8.2 4.3,16.6 5.8,25.1c2.1,11.9 5.5,23.5 9.8,34.9c5.1,13.6 11.7,26.4 20.1,38.2c2.6,4.4 6.9,6.7 11.3,8.8c2.5,2.6 5,0.9 7.8,0c6.3,-2.5 12.5,-5.4 19.1,-7.1c18,-4.8 36.4,-5.9 55,-6.2c3.3,-0.1 6.7,-0.1 9.3,-2.6c2.4,-2.7 2.5,-6.2 2.8,-9.4c0.5,-5.9 1.7,-11.8 4,-17.1c5.2,-11.8 -4.9,-19.2 -7.4,-28.7C222.2,223.6 221.9,223.6 221.7,223.6z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M285.2,157.2h-9.4c-7.5,10.9 -12.4,23.2 -15,36.5c-0.8,4 -2.2,6.1 -6.6,5.1c-1.1,-0.2 -2.4,-0.2 -3.5,0.1c-4.9,1.4 -6.9,-0.8 -8.1,-5.5c-3.4,-13.3 -8.9,-25.5 -16.9,-36.2h-9c9.8,12.2 16.1,26.3 19.8,41.7c0.5,1.6 0.6,3.3 -0.9,4.2c-7.6,4.9 -10.5,12.9 -14.1,20.5c1.2,6.8 0.9,14.1 7.7,18.7c1.5,0.9 0.5,2.5 -0.1,3.7c-4.5,10.1 -6.2,20.8 -7.3,31.7c-1.7,2.7 -2.9,5.3 -3,8.5c-0.7,20.5 1.5,40.5 8.2,60c0.8,2.4 1.2,5.1 4.1,6c3,3.6 5.9,7.3 9.1,10.7c8.8,9.1 18.8,9 27.6,0c2.9,-3 5,-6.5 7.1,-10c1,-1.8 1.4,-4.1 3.5,-5.2c1.7,-0.7 2.2,-2.2 2.6,-3.7c4.7,-16.4 7.2,-33.2 6,-50.3c-0.4,-4.9 0.2,-10.3 -3.5,-14.5c-2.2,-11.8 -4.8,-23.5 -8.3,-34.9c-0.5,-1.5 -0.7,-3.2 0.5,-4.4c4.8,-4.8 5.4,-11 5.9,-17.3c-3.3,-6.4 -6.5,-12.9 -12.5,-17.5c-1.8,-1.4 -1.9,-3.4 -1.5,-5.4C270.8,184.3 276.1,169.8 285.2,157.2z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:fillColor="#FF000000" + android:pathData="M217.8,147.9c-4.1,-4.3 -6.9,-8.7 -7.9,-14.6c-1.2,-7.2 -5.6,-12.4 -12.6,-15c-6.3,-2.3 -11.6,1.3 -11.9,7.9c-0.5,9.8 5.2,17.4 14.9,18.8c4.6,0.7 8,2.8 11,6c1.9,2 3.7,4.1 5.4,6.2h9C223.3,154 220.7,150.9 217.8,147.9z" + android:strokeWidth="10" + android:strokeColor="#000000"/> + <path + android:fillColor="#FF000000" + android:pathData="M299.3,144.8c7.5,-1 13.6,-4.9 18.4,-10.7c2.9,-3.6 3.8,-7.9 1.2,-12c-2.5,-3.9 -6.6,-4.4 -11,-3.6c-8.1,1.5 -13.9,6.6 -15.6,14.2c-1.3,6 -4.3,10 -8.2,14.2c-3.1,3.3 -5.8,6.7 -8.3,10.3h9.4c2.2,-3 4.5,-5.9 7.1,-8.7C294.2,146.4 296.3,145.2 299.3,144.8z" + android:strokeWidth="10" + android:strokeColor="#000000"/> + <path + android:fillColor="#FF000000" + android:pathData="M221.8,277.7c-1.6,25.4 0.9,50.4 9.3,74.6c-2,11.8 -3.8,23.6 -10.4,34.1c-7.1,11.4 -17.3,16.6 -30.6,16.1c-9.4,-0.4 -14.4,-4.4 -16.8,-13.5c-2.6,-9.9 -3.8,-20 -3.3,-30.3c0.4,-8.8 0.4,-8.9 -8,-5.2c-8.1,3.5 -16.5,6.3 -25.1,8.2c-4.3,0.9 -8.6,1.1 -12.8,0.2c-10.2,-2.2 -15.8,-10 -14.1,-20.3c3,-17.5 9.2,-33.6 21.7,-46.7c7.6,-2.9 15.1,-6.2 22.9,-8.6c19.4,-6 39.5,-7.4 59.8,-7.4C216.9,278.7 219.5,279.1 221.8,277.7z" + android:strokeWidth="10" + android:strokeColor="#000000"/> + <path + android:fillColor="#FF000000" + android:pathData="M278.4,347.8c0.2,-2.1 -0.1,-4.4 0.5,-6.4c6,-19.4 7,-39.2 4.3,-59.2c-0.1,-0.9 0.2,-1.9 0.3,-2.9c22.1,-0.9 44.1,-0.4 65.8,5.1c7.2,1.8 13.4,6.3 20.7,7.8c3.6,5.6 9,9.8 12.4,15.5c4.7,7.8 8.6,15.9 9.9,25c2.2,14.9 -6.1,24 -21,23c-10.5,-0.7 -20.4,-3.8 -29.9,-8.2c-5.8,-2.6 -5.7,-2.7 -5.3,3.5c0.5,10.2 0.9,20.3 -1.1,30.5c-1.7,8.5 -7.1,12.9 -15.1,14.2c-9.3,1.5 -17.4,-0.9 -24.2,-7.6C284.4,376.9 279.6,363.1 278.4,347.8z" + android:strokeWidth="10" + android:strokeColor="#000000"/> + <path + android:pathData="M356.7,256.6c-9.3,2 -21,1.6 -32.8,0.6c-3.3,-0.3 -4.9,-2 -5.1,-5.3c-0.8,-15.4 0,-30.5 5.2,-45.2c2.6,-7.4 8.4,-11.1 16,-12.1c5.3,-0.8 10.1,2.5 11.7,7.6c1.3,4.2 0.8,8.5 0.3,12.8c-1,8 -0.9,8 6.7,6c3.6,-1 7.2,-1.9 11,-1.8c7.8,0.2 11.8,4.8 10.7,12.6C378.9,242.5 369.4,253.2 356.7,256.6z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M367.2,197c-2.5,-9.6 4.7,-22.5 14.2,-25.4c6.5,-2 11.8,1.1 13.1,7.8c1.9,9.4 -5.6,21.9 -14.8,24.7C373.8,205.9 368.8,203 367.2,197z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M180.4,219.1c2.4,11.6 3.8,23.4 2.9,35.5c-0.2,3.4 -1.7,5 -4.9,5.3c-10.7,1 -21.4,2.2 -32.2,0.4c-12.4,-2.1 -23.3,-13.3 -24.9,-25.8c-0.8,-6.5 3.3,-11.1 10.6,-10.9c4.5,0.1 9,0.8 13.3,1.9c4.1,1.1 5,0 4.5,-3.8c-0.5,-3.9 -1.2,-7.8 -1.1,-11.7c0.4,-10 8.1,-14.6 17.6,-10.8C175.1,202.8 177.6,210.9 180.4,219.1z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M134.8,193.6c0.4,1.2 0.7,4.1 0.1,7c-1.5,6.8 -7.4,10 -13.9,7.4c-7.8,-3.1 -14.4,-13.1 -14.2,-21.4c0.2,-9.4 8.2,-13.9 16.4,-9.2C128.9,180.8 132.7,185.6 134.8,193.6z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M268.3,304c0.4,1.1 0.2,2 -0.6,2.8c-1,1 -2.2,0.8 -3.2,0c-7.2,-6.1 -14.3,-4.8 -21.4,0.3c-1.1,0.8 -2.5,1.2 -3.7,-0.1c-0.9,-1.1 -0.5,-2.1 0.1,-3.2c4.6,-7.8 23.7,-8.2 28.3,-0.6C268,303.4 268.1,303.8 268.3,304z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M250.9,274.9c4.9,-1.1 9.3,0.9 12.9,5c0.9,1.1 1.7,2.4 0.7,3.7c-1.1,1.5 -2.4,0.6 -3.5,-0.3c-5.1,-4.4 -10.1,-4.3 -15.1,0.2c-1,0.9 -2.2,2.1 -3.5,0.9c-1.4,-1.3 -0.7,-2.9 0.3,-4.2C244.7,277.7 247.1,275.9 250.9,274.9z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M420.6,160.4c-1.3,-10.7 -8.2,-18.4 -18.8,-20.6c-7.3,-1.5 -14.4,-1.3 -21.6,0.4c-20.7,4.8 -37.4,16.7 -53,30.4c-17.4,15.4 -31.7,33.6 -45.6,52.1c-2.4,0.9 -2.6,3.1 -3.1,5.3c-0.5,2.7 -0.9,5.4 -2.8,7.6c-3.2,3.8 -3.2,8 -2.1,12.7c2,8.1 5.1,16 5.7,24.5c0.2,2.3 0.9,4.6 2.5,6.5c1.8,1.8 4,2.4 6.5,2.3c4.5,-0.1 9,-0.1 13.5,0c21,0.6 42,1.5 61.4,11.1c2.2,1.1 4.7,2.3 6.8,-0.5c5.3,-1.4 9.3,-4.8 13,-8.7c5.7,-6.1 9.6,-13.4 13,-20.9c10.8,-24.3 16.6,-50.1 22.1,-76C420,178 421.7,169.3 420.6,160.4z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + </group> +</vector> diff --git a/android/app/src/main/res/drawable-hdpi/ic_stat_player.png b/android/app/src/main/res/drawable-hdpi/ic_stat_player.png Binary files differnew file mode 100644 index 0000000..7ab8931 --- /dev/null +++ b/android/app/src/main/res/drawable-hdpi/ic_stat_player.png diff --git a/android/app/src/main/res/drawable-mdpi/ic_stat_player.png b/android/app/src/main/res/drawable-mdpi/ic_stat_player.png Binary files differnew file mode 100644 index 0000000..c6a3e27 --- /dev/null +++ b/android/app/src/main/res/drawable-mdpi/ic_stat_player.png diff --git a/android/app/src/main/res/drawable-xhdpi/ic_stat_player.png b/android/app/src/main/res/drawable-xhdpi/ic_stat_player.png Binary files differnew file mode 100644 index 0000000..f4ec643 --- /dev/null +++ b/android/app/src/main/res/drawable-xhdpi/ic_stat_player.png diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_stat_player.png b/android/app/src/main/res/drawable-xxhdpi/ic_stat_player.png Binary files differnew file mode 100644 index 0000000..b0cb925 --- /dev/null +++ b/android/app/src/main/res/drawable-xxhdpi/ic_stat_player.png 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 0000000..07d5da9 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <path + android:fillColor="#3DDC84" + android:pathData="M0,0h108v108h-108z" /> + <path + android:fillColor="#00000000" + android:pathData="M9,0L9,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,0L19,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M29,0L29,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M39,0L39,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M49,0L49,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M59,0L59,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M69,0L69,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M79,0L79,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M89,0L89,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M99,0L99,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,9L108,9" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,19L108,19" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,29L108,29" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,39L108,39" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,49L108,49" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,59L108,59" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,69L108,69" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,79L108,79" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,89L108,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,99L108,99" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,29L89,29" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,39L89,39" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,49L89,49" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,59L89,59" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,69L89,69" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,79L89,79" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M29,19L29,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M39,19L39,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M49,19L49,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M59,19L59,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M69,19L69,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M79,19L79,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> +</vector> 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 0000000..999eb38 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,47 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:viewportWidth="512" + android:viewportHeight="512"> + <group android:scaleX="0.58666664" + android:scaleY="0.58666664" + android:translateX="108.59457" + android:translateY="103.0321"> + <path + android:pathData="M281.6,222.7c13.9,-18.5 28.2,-36.7 45.6,-52.1c15.6,-13.7 32.3,-25.6 53,-30.4c7.2,-1.7 14.3,-1.9 21.6,-0.4c10.6,2.2 17.5,9.9 18.8,20.6c1.1,8.9 -0.6,17.6 -2.5,26.2c-5.5,25.9 -11.3,51.7 -22.1,76c-3.4,7.5 -7.3,14.8 -13,20.9c-3.7,3.9 -7.7,7.3 -13,8.7c-2.1,2.8 -4.6,1.6 -6.8,0.5c-19.4,-9.6 -40.4,-10.5 -61.4,-11.1c-4.5,-0.1 -9,-0.1 -13.5,0c-2.5,0.1 -4.7,-0.5 -6.5,-2.3c-1.6,-1.9 -2.3,-4.2 -2.5,-6.5c-0.6,-8.5 -3.7,-16.4 -5.7,-24.5c-1.1,-4.7 -1.1,-8.9 2.1,-12.7c1.9,-2.2 2.3,-4.9 2.8,-7.6C279,225.8 279.2,223.6 281.6,222.7z" + android:fillColor="#49008D"/> + <path + android:pathData="M131.7,294.8c-4.4,-2.1 -8.7,-4.4 -11.3,-8.8c-8.4,-11.8 -15,-24.6 -20.1,-38.2c-4.3,-11.4 -7.7,-23 -9.8,-34.9c-1.5,-8.5 -3.3,-16.9 -5.8,-25.1c-2.7,-9.2 -3.5,-18.3 -1.9,-27.6c2.3,-9.8 9.5,-13.9 18.6,-15.5c14.6,-2.5 28.4,0.5 41.7,6.9c20.3,9.8 36.8,24.4 52.1,40.5c9.5,9.9 17.8,20.9 26.5,31.5c0.2,0 0.5,0 0.6,0.1c2.5,9.5 12.6,16.9 7.4,28.7c-2.3,5.3 -3.5,11.2 -4,17.1c-0.3,3.2 -0.4,6.7 -2.8,9.4c-2.6,2.5 -6,2.5 -9.3,2.6c-18.6,0.3 -37,1.4 -55,6.2c-6.6,1.7 -12.8,4.6 -19.1,7.1C136.7,295.7 134.2,297.4 131.7,294.8z" + android:fillColor="#49008D"/> + <path + android:pathData="M221.8,277.7c1.1,-10.9 2.8,-21.6 7.3,-31.7c0.6,-1.2 1.6,-2.8 0.1,-3.7c-6.8,-4.6 -6.5,-11.9 -7.7,-18.7c3.6,-7.6 6.5,-15.6 14.1,-20.5c1.5,-0.9 1.4,-2.6 0.9,-4.2c-4.4,-18.1 -12.3,-34.3 -25.2,-47.9c-3,-3.2 -6.4,-5.3 -11,-6c-9.7,-1.4 -15.4,-9 -14.9,-18.8c0.3,-6.6 5.6,-10.2 11.9,-7.9c7,2.6 11.4,7.8 12.6,15c1,5.9 3.8,10.3 7.9,14.6c12.4,12.8 20.4,28.2 24.8,45.5c1.2,4.7 3.2,6.9 8.1,5.5c1.1,-0.3 2.4,-0.3 3.5,-0.1c4.4,1 5.8,-1.1 6.6,-5.1c3.5,-17.7 10.9,-33.6 23.3,-46.8c3.9,-4.2 6.9,-8.2 8.2,-14.2c1.7,-7.6 7.5,-12.7 15.6,-14.2c4.4,-0.8 8.5,-0.3 11,3.6c2.6,4.1 1.7,8.4 -1.2,12c-4.8,5.8 -10.9,9.7 -18.4,10.7c-3,0.4 -5.1,1.6 -7,3.7c-13.5,14.5 -20.8,32.1 -24.7,51.2c-0.4,2 -0.3,4 1.5,5.4c6,4.6 9.2,11.1 12.5,17.5c-0.5,6.3 -1.1,12.5 -5.9,17.3c-1.2,1.2 -1,2.9 -0.5,4.4c3.5,11.4 6.1,23.1 8.3,34.9c3.7,4.2 3.1,9.6 3.5,14.5c1.2,17.1 -1.3,33.9 -6,50.3c-0.4,1.5 -0.9,3 -2.6,3.7c-2.1,1.1 -2.5,3.4 -3.5,5.2c-2.1,3.5 -4.2,7 -7.1,10c-8.8,9 -18.8,9.1 -27.6,0c-3.2,-3.4 -6.1,-7.1 -9.1,-10.7c-2.9,-0.9 -3.3,-3.6 -4.1,-6c-6.7,-19.5 -8.9,-39.5 -8.2,-60C218.9,283 220.1,280.4 221.8,277.7z" + android:fillColor="#FE6972"/> + <path + android:pathData="M221.8,277.7c-1.6,25.4 0.9,50.4 9.3,74.6c-2,11.8 -3.8,23.6 -10.4,34.1c-7.1,11.4 -17.3,16.6 -30.6,16.1c-9.4,-0.4 -14.4,-4.4 -16.8,-13.5c-2.6,-9.9 -3.8,-20 -3.3,-30.3c0.4,-8.8 0.4,-8.9 -8,-5.2c-8.1,3.5 -16.5,6.3 -25.1,8.2c-4.3,0.9 -8.6,1.1 -12.8,0.2c-10.2,-2.2 -15.8,-10 -14.1,-20.3c3,-17.5 9.2,-33.6 21.7,-46.7c7.6,-2.9 15.1,-6.2 22.9,-8.6c19.4,-6 39.5,-7.4 59.8,-7.4C216.9,278.7 219.5,279.1 221.8,277.7z" + android:fillColor="#D200AB"/> + <path + android:pathData="M278.4,347.8c0.2,-2.1 -0.1,-4.4 0.5,-6.4c6,-19.4 7,-39.2 4.3,-59.2c-0.1,-0.9 0.2,-1.9 0.3,-2.9c22.1,-0.9 44.1,-0.4 65.8,5.1c7.2,1.8 13.4,6.3 20.7,7.8c3.6,5.6 9,9.8 12.4,15.5c4.7,7.8 8.6,15.9 9.9,25c2.2,14.9 -6.1,24 -21,23c-10.5,-0.7 -20.4,-3.8 -29.9,-8.2c-5.8,-2.6 -5.7,-2.7 -5.3,3.5c0.5,10.2 0.9,20.3 -1.1,30.5c-1.7,8.5 -7.1,12.9 -15.1,14.2c-9.3,1.5 -17.4,-0.9 -24.2,-7.6C284.4,376.9 279.6,363.1 278.4,347.8z" + android:fillColor="#D200AB"/> + <path + android:pathData="M356.7,256.6c-9.3,2 -21,1.6 -32.8,0.6c-3.3,-0.3 -4.9,-2 -5.1,-5.3c-0.8,-15.4 0,-30.5 5.2,-45.2c2.6,-7.4 8.4,-11.1 16,-12.1c5.3,-0.8 10.1,2.5 11.7,7.6c1.3,4.2 0.8,8.5 0.3,12.8c-1,8 -0.9,8 6.7,6c3.6,-1 7.2,-1.9 11,-1.8c7.8,0.2 11.8,4.8 10.7,12.6C378.9,242.5 369.4,253.2 356.7,256.6z" + android:fillColor="#D200AB"/> + <path + android:pathData="M367.2,197c-2.5,-9.6 4.7,-22.5 14.2,-25.4c6.5,-2 11.8,1.1 13.1,7.8c1.9,9.4 -5.6,21.9 -14.8,24.7C373.8,205.9 368.8,203 367.2,197z" + android:fillColor="#FD6872"/> + <path + android:pathData="M180.4,219.1c2.4,11.6 3.8,23.4 2.9,35.5c-0.2,3.4 -1.7,5 -4.9,5.3c-10.7,1 -21.4,2.2 -32.2,0.4c-12.4,-2.1 -23.3,-13.3 -24.9,-25.8c-0.8,-6.5 3.3,-11.1 10.6,-10.9c4.5,0.1 9,0.8 13.3,1.9c4.1,1.1 5,0 4.5,-3.8c-0.5,-3.9 -1.2,-7.8 -1.1,-11.7c0.4,-10 8.1,-14.6 17.6,-10.8C175.1,202.8 177.6,210.9 180.4,219.1z" + android:fillColor="#D200AB"/> + <path + android:pathData="M134.8,193.6c0.4,1.2 0.7,4.1 0.1,7c-1.5,6.8 -7.4,10 -13.9,7.4c-7.8,-3.1 -14.4,-13.1 -14.2,-21.4c0.2,-9.4 8.2,-13.9 16.4,-9.2C128.9,180.8 132.7,185.6 134.8,193.6z" + android:fillColor="#FD6774"/> + <path + android:pathData="M268.3,304c0.4,1.1 0.2,2 -0.6,2.8c-1,1 -2.2,0.8 -3.2,0c-7.2,-6.1 -14.3,-4.8 -21.4,0.3c-1.1,0.8 -2.5,1.2 -3.7,-0.1c-0.9,-1.1 -0.5,-2.1 0.1,-3.2c4.6,-7.8 23.7,-8.2 28.3,-0.6C268,303.4 268.1,303.8 268.3,304z" + android:fillColor="#48426B"/> + <path + android:pathData="M250.9,274.9c4.9,-1.1 9.3,0.9 12.9,5c0.9,1.1 1.7,2.4 0.7,3.7c-1.1,1.5 -2.4,0.6 -3.5,-0.3c-5.1,-4.4 -10.1,-4.3 -15.1,0.2c-1,0.9 -2.2,2.1 -3.5,0.9c-1.4,-1.3 -0.7,-2.9 0.3,-4.2C244.7,277.7 247.1,275.9 250.9,274.9z" + android:fillColor="#4D426A"/> + <path + android:pathData="M265.3,328.2c0.2,1.2 0.5,2.2 -0.5,2.9c-1,0.7 -1.9,0.3 -2.6,-0.4c-5.6,-5.3 -10.9,-4.2 -16,0.6c-0.7,0.7 -1.7,1.1 -2.7,0.6c-1,-0.5 -1.1,-1.5 -0.9,-2.5c0.7,-3.3 7.1,-7.5 11.8,-7.5C259.3,322 263,324.2 265.3,328.2z" + android:fillColor="#4B4168"/> + </group> +</vector> diff --git a/android/app/src/main/res/drawable/ic_monochrome.xml b/android/app/src/main/res/drawable/ic_monochrome.xml new file mode 100644 index 0000000..70c171b --- /dev/null +++ b/android/app/src/main/res/drawable/ic_monochrome.xml @@ -0,0 +1,76 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="512dp" + android:height="512dp" + android:viewportWidth="512" + android:viewportHeight="512"> + <path + android:pathData="M265.3,328.2c0.2,1.2 0.5,2.2 -0.5,2.9c-1,0.7 -1.9,0.3 -2.6,-0.4c-5.6,-5.3 -10.9,-4.2 -16,0.6c-0.7,0.7 -1.7,1.1 -2.7,0.6s-1.1,-1.5 -0.9,-2.5c0.7,-3.3 7.1,-7.5 11.8,-7.5C259.3,322 263,324.2 265.3,328.2z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M221.7,223.6c-8.7,-10.6 -17,-21.6 -26.5,-31.5c-15.3,-16.1 -31.8,-30.7 -52.1,-40.5c-13.3,-6.4 -27.1,-9.4 -41.7,-6.9c-9.1,1.6 -16.3,5.7 -18.6,15.5c-1.6,9.3 -0.8,18.4 1.9,27.6c2.5,8.2 4.3,16.6 5.8,25.1c2.1,11.9 5.5,23.5 9.8,34.9c5.1,13.6 11.7,26.4 20.1,38.2c2.6,4.4 6.9,6.7 11.3,8.8c2.5,2.6 5,0.9 7.8,0c6.3,-2.5 12.5,-5.4 19.1,-7.1c18,-4.8 36.4,-5.9 55,-6.2c3.3,-0.1 6.7,-0.1 9.3,-2.6c2.4,-2.7 2.5,-6.2 2.8,-9.4c0.5,-5.9 1.7,-11.8 4,-17.1c5.2,-11.8 -4.9,-19.2 -7.4,-28.7C222.2,223.6 221.9,223.6 221.7,223.6z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M285.2,157.2h-9.4c-7.5,10.9 -12.4,23.2 -15,36.5c-0.8,4 -2.2,6.1 -6.6,5.1c-1.1,-0.2 -2.4,-0.2 -3.5,0.1c-4.9,1.4 -6.9,-0.8 -8.1,-5.5c-3.4,-13.3 -8.9,-25.5 -16.9,-36.2h-9c9.8,12.2 16.1,26.3 19.8,41.7c0.5,1.6 0.6,3.3 -0.9,4.2c-7.6,4.9 -10.5,12.9 -14.1,20.5c1.2,6.8 0.9,14.1 7.7,18.7c1.5,0.9 0.5,2.5 -0.1,3.7c-4.5,10.1 -6.2,20.8 -7.3,31.7c-1.7,2.7 -2.9,5.3 -3,8.5c-0.7,20.5 1.5,40.5 8.2,60c0.8,2.4 1.2,5.1 4.1,6c3,3.6 5.9,7.3 9.1,10.7c8.8,9.1 18.8,9 27.6,0c2.9,-3 5,-6.5 7.1,-10c1,-1.8 1.4,-4.1 3.5,-5.2c1.7,-0.7 2.2,-2.2 2.6,-3.7c4.7,-16.4 7.2,-33.2 6,-50.3c-0.4,-4.9 0.2,-10.3 -3.5,-14.5c-2.2,-11.8 -4.8,-23.5 -8.3,-34.9c-0.5,-1.5 -0.7,-3.2 0.5,-4.4c4.8,-4.8 5.4,-11 5.9,-17.3c-3.3,-6.4 -6.5,-12.9 -12.5,-17.5c-1.8,-1.4 -1.9,-3.4 -1.5,-5.4C270.8,184.3 276.1,169.8 285.2,157.2z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:fillColor="#FF000000" + android:pathData="M217.8,147.9c-4.1,-4.3 -6.9,-8.7 -7.9,-14.6c-1.2,-7.2 -5.6,-12.4 -12.6,-15c-6.3,-2.3 -11.6,1.3 -11.9,7.9c-0.5,9.8 5.2,17.4 14.9,18.8c4.6,0.7 8,2.8 11,6c1.9,2 3.7,4.1 5.4,6.2h9C223.3,154 220.7,150.9 217.8,147.9z" + android:strokeWidth="10" + android:strokeColor="#000000"/> + <path + android:fillColor="#FF000000" + android:pathData="M299.3,144.8c7.5,-1 13.6,-4.9 18.4,-10.7c2.9,-3.6 3.8,-7.9 1.2,-12c-2.5,-3.9 -6.6,-4.4 -11,-3.6c-8.1,1.5 -13.9,6.6 -15.6,14.2c-1.3,6 -4.3,10 -8.2,14.2c-3.1,3.3 -5.8,6.7 -8.3,10.3h9.4c2.2,-3 4.5,-5.9 7.1,-8.7C294.2,146.4 296.3,145.2 299.3,144.8z" + android:strokeWidth="10" + android:strokeColor="#000000"/> + <path + android:fillColor="#FF000000" + android:pathData="M221.8,277.7c-1.6,25.4 0.9,50.4 9.3,74.6c-2,11.8 -3.8,23.6 -10.4,34.1c-7.1,11.4 -17.3,16.6 -30.6,16.1c-9.4,-0.4 -14.4,-4.4 -16.8,-13.5c-2.6,-9.9 -3.8,-20 -3.3,-30.3c0.4,-8.8 0.4,-8.9 -8,-5.2c-8.1,3.5 -16.5,6.3 -25.1,8.2c-4.3,0.9 -8.6,1.1 -12.8,0.2c-10.2,-2.2 -15.8,-10 -14.1,-20.3c3,-17.5 9.2,-33.6 21.7,-46.7c7.6,-2.9 15.1,-6.2 22.9,-8.6c19.4,-6 39.5,-7.4 59.8,-7.4C216.9,278.7 219.5,279.1 221.8,277.7z" + android:strokeWidth="10" + android:strokeColor="#000000"/> + <path + android:fillColor="#FF000000" + android:pathData="M278.4,347.8c0.2,-2.1 -0.1,-4.4 0.5,-6.4c6,-19.4 7,-39.2 4.3,-59.2c-0.1,-0.9 0.2,-1.9 0.3,-2.9c22.1,-0.9 44.1,-0.4 65.8,5.1c7.2,1.8 13.4,6.3 20.7,7.8c3.6,5.6 9,9.8 12.4,15.5c4.7,7.8 8.6,15.9 9.9,25c2.2,14.9 -6.1,24 -21,23c-10.5,-0.7 -20.4,-3.8 -29.9,-8.2c-5.8,-2.6 -5.7,-2.7 -5.3,3.5c0.5,10.2 0.9,20.3 -1.1,30.5c-1.7,8.5 -7.1,12.9 -15.1,14.2c-9.3,1.5 -17.4,-0.9 -24.2,-7.6C284.4,376.9 279.6,363.1 278.4,347.8z" + android:strokeWidth="10" + android:strokeColor="#000000"/> + <path + android:pathData="M356.7,256.6c-9.3,2 -21,1.6 -32.8,0.6c-3.3,-0.3 -4.9,-2 -5.1,-5.3c-0.8,-15.4 0,-30.5 5.2,-45.2c2.6,-7.4 8.4,-11.1 16,-12.1c5.3,-0.8 10.1,2.5 11.7,7.6c1.3,4.2 0.8,8.5 0.3,12.8c-1,8 -0.9,8 6.7,6c3.6,-1 7.2,-1.9 11,-1.8c7.8,0.2 11.8,4.8 10.7,12.6C378.9,242.5 369.4,253.2 356.7,256.6z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M367.2,197c-2.5,-9.6 4.7,-22.5 14.2,-25.4c6.5,-2 11.8,1.1 13.1,7.8c1.9,9.4 -5.6,21.9 -14.8,24.7C373.8,205.9 368.8,203 367.2,197z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M180.4,219.1c2.4,11.6 3.8,23.4 2.9,35.5c-0.2,3.4 -1.7,5 -4.9,5.3c-10.7,1 -21.4,2.2 -32.2,0.4c-12.4,-2.1 -23.3,-13.3 -24.9,-25.8c-0.8,-6.5 3.3,-11.1 10.6,-10.9c4.5,0.1 9,0.8 13.3,1.9c4.1,1.1 5,0 4.5,-3.8c-0.5,-3.9 -1.2,-7.8 -1.1,-11.7c0.4,-10 8.1,-14.6 17.6,-10.8C175.1,202.8 177.6,210.9 180.4,219.1z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M134.8,193.6c0.4,1.2 0.7,4.1 0.1,7c-1.5,6.8 -7.4,10 -13.9,7.4c-7.8,-3.1 -14.4,-13.1 -14.2,-21.4c0.2,-9.4 8.2,-13.9 16.4,-9.2C128.9,180.8 132.7,185.6 134.8,193.6z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M268.3,304c0.4,1.1 0.2,2 -0.6,2.8c-1,1 -2.2,0.8 -3.2,0c-7.2,-6.1 -14.3,-4.8 -21.4,0.3c-1.1,0.8 -2.5,1.2 -3.7,-0.1c-0.9,-1.1 -0.5,-2.1 0.1,-3.2c4.6,-7.8 23.7,-8.2 28.3,-0.6C268,303.4 268.1,303.8 268.3,304z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M250.9,274.9c4.9,-1.1 9.3,0.9 12.9,5c0.9,1.1 1.7,2.4 0.7,3.7c-1.1,1.5 -2.4,0.6 -3.5,-0.3c-5.1,-4.4 -10.1,-4.3 -15.1,0.2c-1,0.9 -2.2,2.1 -3.5,0.9c-1.4,-1.3 -0.7,-2.9 0.3,-4.2C244.7,277.7 247.1,275.9 250.9,274.9z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> + <path + android:pathData="M420.6,160.4c-1.3,-10.7 -8.2,-18.4 -18.8,-20.6c-7.3,-1.5 -14.4,-1.3 -21.6,0.4c-20.7,4.8 -37.4,16.7 -53,30.4c-17.4,15.4 -31.7,33.6 -45.6,52.1c-2.4,0.9 -2.6,3.1 -3.1,5.3c-0.5,2.7 -0.9,5.4 -2.8,7.6c-3.2,3.8 -3.2,8 -2.1,12.7c2,8.1 5.1,16 5.7,24.5c0.2,2.3 0.9,4.6 2.5,6.5c1.8,1.8 4,2.4 6.5,2.3c4.5,-0.1 9,-0.1 13.5,0c21,0.6 42,1.5 61.4,11.1c2.2,1.1 4.7,2.3 6.8,-0.5c5.3,-1.4 9.3,-4.8 13,-8.7c5.7,-6.1 9.6,-13.4 13,-20.9c10.8,-24.3 16.6,-50.1 22.1,-76C420,178 421.7,169.3 420.6,160.4z" + android:strokeWidth="10" + android:fillColor="#00000000" + android:strokeColor="#000000"/> +</vector> 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 0000000..6c75ef2 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/ic_launcher_background"/> + <foreground android:drawable="@drawable/ic_launcher_foreground"/> + <monochrome> + <inset android:drawable="@drawable/ic_monochrome" + android:inset="22%"/> + </monochrome> +</adaptive-icon>
\ 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 0000000..6c75ef2 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/ic_launcher_background"/> + <foreground android:drawable="@drawable/ic_launcher_foreground"/> + <monochrome> + <inset android:drawable="@drawable/ic_monochrome" + android:inset="22%"/> + </monochrome> +</adaptive-icon>
\ 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 Binary files differnew file mode 100644 index 0000000..09b568a --- /dev/null +++ b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp Binary files differnew file mode 100644 index 0000000..3031c92 --- /dev/null +++ b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp 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 Binary files differnew file mode 100644 index 0000000..e7d2efb --- /dev/null +++ b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp Binary files differnew file mode 100644 index 0000000..74bd707 --- /dev/null +++ b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp Binary files differnew file mode 100644 index 0000000..7288244 --- /dev/null +++ b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp Binary files differnew file mode 100644 index 0000000..2559856 --- /dev/null +++ b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp Binary files differnew file mode 100644 index 0000000..a0f3424 --- /dev/null +++ b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp Binary files differnew file mode 100644 index 0000000..8bacd29 --- /dev/null +++ b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp 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 Binary files differnew file mode 100644 index 0000000..1d28687 --- /dev/null +++ b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp Binary files differnew file mode 100644 index 0000000..fc86da9 --- /dev/null +++ b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp Binary files differnew file mode 100644 index 0000000..267289c --- /dev/null +++ b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp Binary files differnew file mode 100644 index 0000000..63c71e0 --- /dev/null +++ b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp Binary files differnew file mode 100644 index 0000000..25d2b5e --- /dev/null +++ b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp Binary files differnew file mode 100644 index 0000000..c386890 --- /dev/null +++ b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp Binary files differnew file mode 100644 index 0000000..e1d56c6 --- /dev/null +++ b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp 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 0000000..f8c6127 --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="purple_200">#FFBB86FC</color> + <color name="purple_500">#FF6200EE</color> + <color name="purple_700">#FF3700B3</color> + <color name="teal_200">#FF03DAC5</color> + <color name="teal_700">#FF018786</color> + <color name="black">#FF000000</color> + <color name="white">#FFFFFFFF</color> +</resources>
\ 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 0000000..bf4fc02 --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="ic_launcher_background">#79C2F6</color> +</resources>
\ 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 0000000..446cc54 --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">Mist</string> +</resources>
\ 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 0000000..33bd1a4 --- /dev/null +++ b/android/app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <style name="Theme.Mist" parent="Theme.Material3.DayNight.NoActionBar" /> +</resources>
\ No newline at end of file diff --git a/android/app/src/main/res/xml/backup_rules.xml b/android/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..fa0f996 --- /dev/null +++ b/android/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + Sample backup rules file; uncomment and customize as necessary. + See https://developer.android.com/guide/topics/data/autobackup + for details. + Note: This file is ignored for devices older that API 31 + See https://developer.android.com/about/versions/12/backup-restore +--> +<full-backup-content> + <!-- + <include domain="sharedpref" path="."/> + <exclude domain="sharedpref" path="device.xml"/> +--> +</full-backup-content>
\ No newline at end of file diff --git a/android/app/src/main/res/xml/data_extraction_rules.xml b/android/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..9ee9997 --- /dev/null +++ b/android/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + Sample data extraction rules file; uncomment and customize as necessary. + See https://developer.android.com/about/versions/12/backup-restore#xml-changes + for details. +--> +<data-extraction-rules> + <cloud-backup> + <!-- TODO: Use <include> and <exclude> to control what is backed up. + <include .../> + <exclude .../> + --> + </cloud-backup> + <!-- + <device-transfer> + <include .../> + <exclude .../> + </device-transfer> + --> +</data-extraction-rules>
\ No newline at end of file diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000..20d87a7 --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,7 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed +plugins { + alias(libs.plugins.androidApplication) apply false + alias(libs.plugins.kotlinAndroid) apply false +} +true // Needed to make the Suppress annotation work for the plugins block
\ No newline at end of file diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..3c5031e --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true
\ No newline at end of file diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml new file mode 100644 index 0000000..fde57b9 --- /dev/null +++ b/android/gradle/libs.versions.toml @@ -0,0 +1,39 @@ +[versions] +agp = "8.3.0-alpha07" +kotlin = "1.9.0" +core-ktx = "1.10.1" +junit = "4.13.2" +androidx-test-ext-junit = "1.1.5" +espresso-core = "3.5.1" +lifecycle-runtime-ktx = "2.6.1" +activity-compose = "1.7.0" +compose-bom = "2023.08.00" +media = "1.6.0" +volley = "1.2.1" +material = "1.10.0" +media3-session = "1.1.1" + +[libraries] +androidx-media = { module = "androidx.media:media", version.ref = "media" } +core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" } +espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" } +lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle-runtime-ktx" } +activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activity-compose" } +compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } +ui = { group = "androidx.compose.ui", name = "ui" } +ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } +material3 = { group = "androidx.compose.material3", name = "material3" } +volley = { module = "com.android.volley:volley", version.ref = "volley" } +material = { group = "com.google.android.material", name = "material", version.ref = "material" } +androidx-media3-session = { group = "androidx.media3", name = "media3-session", version.ref = "media3-session" } + +[plugins] +androidApplication = { id = "com.android.application", version.ref = "agp" } +kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } + diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 0000000..e708b1c --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.jar diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..2ff99f2 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Oct 27 08:52:38 CEST 2023 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-rc-2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/android/gradlew b/android/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,89 @@ +@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000..49370f6 --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,24 @@ +pluginManagement { + repositories { + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "Mist" +include(":app") +
\ No newline at end of file |