diff --git a/frontend/src-tauri/capabilities/default.json b/frontend/src-tauri/capabilities/default.json index 6c95be9..e7950a7 100644 --- a/frontend/src-tauri/capabilities/default.json +++ b/frontend/src-tauri/capabilities/default.json @@ -8,10 +8,6 @@ "opener:default", "dialog:default", "core:window:allow-start-dragging", - "global-shortcut:allow-is-registered", - "global-shortcut:allow-register", - "global-shortcut:allow-unregister", - "global-shortcut:allow-unregister-all", "http:default", { "identifier": "http:default", diff --git a/frontend/src-tauri/gen/android/.editorconfig b/frontend/src-tauri/gen/android/.editorconfig new file mode 100644 index 0000000..ebe51d3 --- /dev/null +++ b/frontend/src-tauri/gen/android/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/.gitignore b/frontend/src-tauri/gen/android/.gitignore new file mode 100644 index 0000000..b248203 --- /dev/null +++ b/frontend/src-tauri/gen/android/.gitignore @@ -0,0 +1,19 @@ +*.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 +key.properties + +/.tauri +/tauri.settings.gradle \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/app/.gitignore b/frontend/src-tauri/gen/android/app/.gitignore new file mode 100644 index 0000000..538803f --- /dev/null +++ b/frontend/src-tauri/gen/android/app/.gitignore @@ -0,0 +1,6 @@ +/src/main/java/com/haystack/app/generated +/src/main/jniLibs/**/*.so +/src/main/assets/tauri.conf.json +/tauri.build.gradle.kts +/proguard-tauri.pro +/tauri.properties \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/app/build.gradle.kts b/frontend/src-tauri/gen/android/app/build.gradle.kts new file mode 100644 index 0000000..3ad4365 --- /dev/null +++ b/frontend/src-tauri/gen/android/app/build.gradle.kts @@ -0,0 +1,69 @@ +import java.util.Properties + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("rust") +} + +val tauriProperties = Properties().apply { + val propFile = file("tauri.properties") + if (propFile.exists()) { + propFile.inputStream().use { load(it) } + } +} + +android { + compileSdk = 34 + namespace = "com.haystack.app" + defaultConfig { + manifestPlaceholders["usesCleartextTraffic"] = "false" + applicationId = "com.haystack.app" + minSdk = 24 + targetSdk = 34 + versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt() + versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0") + } + buildTypes { + getByName("debug") { + manifestPlaceholders["usesCleartextTraffic"] = "true" + isDebuggable = true + isJniDebuggable = true + isMinifyEnabled = false + packaging { jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so") + jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so") + jniLibs.keepDebugSymbols.add("*/x86/*.so") + jniLibs.keepDebugSymbols.add("*/x86_64/*.so") + } + } + getByName("release") { + isMinifyEnabled = true + proguardFiles( + *fileTree(".") { include("**/*.pro") } + .plus(getDefaultProguardFile("proguard-android-optimize.txt")) + .toList().toTypedArray() + ) + } + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + buildConfig = true + } +} + +rust { + rootDirRel = "../../../" +} + +dependencies { + implementation("androidx.webkit:webkit:1.6.1") + implementation("androidx.appcompat:appcompat:1.6.1") + implementation("com.google.android.material:material:1.8.0") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.4") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") +} + +apply(from = "tauri.build.gradle.kts") \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/app/proguard-rules.pro b/frontend/src-tauri/gen/android/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/frontend/src-tauri/gen/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/frontend/src-tauri/gen/android/app/src/main/AndroidManifest.xml b/frontend/src-tauri/gen/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a8d9fb6 --- /dev/null +++ b/frontend/src-tauri/gen/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src-tauri/gen/android/app/src/main/java/com/haystack/app/MainActivity.kt b/frontend/src-tauri/gen/android/app/src/main/java/com/haystack/app/MainActivity.kt new file mode 100644 index 0000000..8bbc680 --- /dev/null +++ b/frontend/src-tauri/gen/android/app/src/main/java/com/haystack/app/MainActivity.kt @@ -0,0 +1,3 @@ +package com.haystack.app + +class MainActivity : TauriActivity() \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/frontend/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/frontend/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml b/frontend/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/frontend/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml b/frontend/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..4fc2444 --- /dev/null +++ b/frontend/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..28f1aa1 Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..85d0c88 Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..28f1aa1 Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..73e48db Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..13dd214 Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..73e48db Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..1d98044 Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..a888b33 Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..1d98044 Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..0818324 Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..a2a838e Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..0818324 Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..b18bceb Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..3f8a57f Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b18bceb Binary files /dev/null and b/frontend/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/frontend/src-tauri/gen/android/app/src/main/res/values-night/themes.xml b/frontend/src-tauri/gen/android/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..3bf00f3 --- /dev/null +++ b/frontend/src-tauri/gen/android/app/src/main/res/values-night/themes.xml @@ -0,0 +1,6 @@ + + + + diff --git a/frontend/src-tauri/gen/android/app/src/main/res/values/colors.xml b/frontend/src-tauri/gen/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /dev/null +++ b/frontend/src-tauri/gen/android/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/app/src/main/res/values/strings.xml b/frontend/src-tauri/gen/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..05a98f5 --- /dev/null +++ b/frontend/src-tauri/gen/android/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + Haystack + Haystack + \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/app/src/main/res/values/themes.xml b/frontend/src-tauri/gen/android/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..3bf00f3 --- /dev/null +++ b/frontend/src-tauri/gen/android/app/src/main/res/values/themes.xml @@ -0,0 +1,6 @@ + + + + diff --git a/frontend/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml b/frontend/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..782d63b --- /dev/null +++ b/frontend/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/frontend/src-tauri/gen/android/build.gradle.kts b/frontend/src-tauri/gen/android/build.gradle.kts new file mode 100644 index 0000000..c5ef452 --- /dev/null +++ b/frontend/src-tauri/gen/android/build.gradle.kts @@ -0,0 +1,22 @@ +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath("com.android.tools.build:gradle:8.5.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.25") + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +tasks.register("clean").configure { + delete("build") +} + diff --git a/frontend/src-tauri/gen/android/buildSrc/build.gradle.kts b/frontend/src-tauri/gen/android/buildSrc/build.gradle.kts new file mode 100644 index 0000000..39e90b0 --- /dev/null +++ b/frontend/src-tauri/gen/android/buildSrc/build.gradle.kts @@ -0,0 +1,23 @@ +plugins { + `kotlin-dsl` +} + +gradlePlugin { + plugins { + create("pluginsForCoolKids") { + id = "rust" + implementationClass = "RustPlugin" + } + } +} + +repositories { + google() + mavenCentral() +} + +dependencies { + compileOnly(gradleApi()) + implementation("com.android.tools.build:gradle:8.5.1") +} + diff --git a/frontend/src-tauri/gen/android/buildSrc/src/main/java/com/haystack/app/kotlin/BuildTask.kt b/frontend/src-tauri/gen/android/buildSrc/src/main/java/com/haystack/app/kotlin/BuildTask.kt new file mode 100644 index 0000000..6276570 --- /dev/null +++ b/frontend/src-tauri/gen/android/buildSrc/src/main/java/com/haystack/app/kotlin/BuildTask.kt @@ -0,0 +1,52 @@ +import java.io.File +import org.apache.tools.ant.taskdefs.condition.Os +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.logging.LogLevel +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction + +open class BuildTask : DefaultTask() { + @Input + var rootDirRel: String? = null + @Input + var target: String? = null + @Input + var release: Boolean? = null + + @TaskAction + fun assemble() { + val executable = """bun"""; + try { + runTauriCli(executable) + } catch (e: Exception) { + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + runTauriCli("$executable.cmd") + } else { + throw e; + } + } + } + + fun runTauriCli(executable: String) { + val rootDirRel = rootDirRel ?: throw GradleException("rootDirRel cannot be null") + val target = target ?: throw GradleException("target cannot be null") + val release = release ?: throw GradleException("release cannot be null") + val args = listOf("tauri", "android", "android-studio-script"); + + project.exec { + workingDir(File(project.projectDir, rootDirRel)) + executable(executable) + args(args) + if (project.logger.isEnabled(LogLevel.DEBUG)) { + args("-vv") + } else if (project.logger.isEnabled(LogLevel.INFO)) { + args("-v") + } + if (release) { + args("--release") + } + args(listOf("--target", target)) + }.assertNormalExitValue() + } +} \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/buildSrc/src/main/java/com/haystack/app/kotlin/RustPlugin.kt b/frontend/src-tauri/gen/android/buildSrc/src/main/java/com/haystack/app/kotlin/RustPlugin.kt new file mode 100644 index 0000000..4aa7fca --- /dev/null +++ b/frontend/src-tauri/gen/android/buildSrc/src/main/java/com/haystack/app/kotlin/RustPlugin.kt @@ -0,0 +1,85 @@ +import com.android.build.api.dsl.ApplicationExtension +import org.gradle.api.DefaultTask +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.get + +const val TASK_GROUP = "rust" + +open class Config { + lateinit var rootDirRel: String +} + +open class RustPlugin : Plugin { + private lateinit var config: Config + + override fun apply(project: Project) = with(project) { + config = extensions.create("rust", Config::class.java) + + val defaultAbiList = listOf("arm64-v8a", "armeabi-v7a", "x86", "x86_64"); + val abiList = (findProperty("abiList") as? String)?.split(',') ?: defaultAbiList + + val defaultArchList = listOf("arm64", "arm", "x86", "x86_64"); + val archList = (findProperty("archList") as? String)?.split(',') ?: defaultArchList + + val targetsList = (findProperty("targetList") as? String)?.split(',') ?: listOf("aarch64", "armv7", "i686", "x86_64") + + extensions.configure { + @Suppress("UnstableApiUsage") + flavorDimensions.add("abi") + productFlavors { + create("universal") { + dimension = "abi" + ndk { + abiFilters += abiList + } + } + defaultArchList.forEachIndexed { index, arch -> + create(arch) { + dimension = "abi" + ndk { + abiFilters.add(defaultAbiList[index]) + } + } + } + } + } + + afterEvaluate { + for (profile in listOf("debug", "release")) { + val profileCapitalized = profile.replaceFirstChar { it.uppercase() } + val buildTask = tasks.maybeCreate( + "rustBuildUniversal$profileCapitalized", + DefaultTask::class.java + ).apply { + group = TASK_GROUP + description = "Build dynamic library in $profile mode for all targets" + } + + tasks["mergeUniversal${profileCapitalized}JniLibFolders"].dependsOn(buildTask) + + for (targetPair in targetsList.withIndex()) { + val targetName = targetPair.value + val targetArch = archList[targetPair.index] + val targetArchCapitalized = targetArch.replaceFirstChar { it.uppercase() } + val targetBuildTask = project.tasks.maybeCreate( + "rustBuild$targetArchCapitalized$profileCapitalized", + BuildTask::class.java + ).apply { + group = TASK_GROUP + description = "Build dynamic library in $profile mode for $targetArch" + rootDirRel = config.rootDirRel + target = targetName + release = profile == "release" + } + + buildTask.dependsOn(targetBuildTask) + tasks["merge$targetArchCapitalized${profileCapitalized}JniLibFolders"].dependsOn( + targetBuildTask + ) + } + } + } + } +} \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/gradle.properties b/frontend/src-tauri/gen/android/gradle.properties new file mode 100644 index 0000000..21f0c74 --- /dev/null +++ b/frontend/src-tauri/gen/android/gradle.properties @@ -0,0 +1,25 @@ +# 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 +android.nonFinalResIds=false +org.gradle.java.home=/usr/lib/jvm/java-17-openjdk-amd64 \ No newline at end of file diff --git a/frontend/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar b/frontend/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/frontend/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/frontend/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties b/frontend/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..0df10d5 --- /dev/null +++ b/frontend/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue May 10 19:22:52 CST 2022 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/frontend/src-tauri/gen/android/gradlew b/frontend/src-tauri/gen/android/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/frontend/src-tauri/gen/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/frontend/src-tauri/gen/android/gradlew.bat b/frontend/src-tauri/gen/android/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/frontend/src-tauri/gen/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/frontend/src-tauri/gen/android/settings.gradle b/frontend/src-tauri/gen/android/settings.gradle new file mode 100644 index 0000000..3939116 --- /dev/null +++ b/frontend/src-tauri/gen/android/settings.gradle @@ -0,0 +1,3 @@ +include ':app' + +apply from: 'tauri.settings.gradle' diff --git a/frontend/src-tauri/src/lib.rs b/frontend/src-tauri/src/lib.rs index 5de6bb4..da8ac75 100644 --- a/frontend/src-tauri/src/lib.rs +++ b/frontend/src-tauri/src/lib.rs @@ -1,5 +1,4 @@ mod commands; -mod shortcut; mod state; mod utils; mod window; @@ -17,15 +16,9 @@ pub fn run() { .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_opener::init()) .manage(watcher_state) - .invoke_handler(tauri::generate_handler![ - commands::handle_selected_folder, - shortcut::change_shortcut, - shortcut::unregister_shortcut, - shortcut::get_current_shortcut, - ]) + .invoke_handler(tauri::generate_handler![commands::handle_selected_folder,]) .setup(|app| { setup_window(app)?; - shortcut::enable_shortcut(app); Ok(()) }) diff --git a/frontend/src-tauri/src/shortcut.rs b/frontend/src-tauri/src/shortcut.rs deleted file mode 100644 index b853778..0000000 --- a/frontend/src-tauri/src/shortcut.rs +++ /dev/null @@ -1,175 +0,0 @@ -use tauri::App; -use tauri::AppHandle; -use tauri::Emitter; -use tauri::Manager; -use tauri::Runtime; -use tauri_plugin_global_shortcut::GlobalShortcutExt; -use tauri_plugin_global_shortcut::Shortcut; -use tauri_plugin_global_shortcut::ShortcutState; -use tauri_plugin_store::JsonValue; -use tauri_plugin_store::StoreExt; - -/// Name of the Tauri storage -const HAYSTACK_TAURI_STORE: &str = "haystack_tauri_store"; - -/// Key for storing global shortcuts -const HAYSTACK_GLOBAL_SHORTCUT: &str = "haystack_global_shortcut"; - -/// Default shortcut for macOS -#[cfg(target_os = "macos")] -const DEFAULT_SHORTCUT: &str = "command+shift+k"; - -/// Default shortcut for Windows and Linux -#[cfg(any(target_os = "windows", target_os = "linux"))] -const DEFAULT_SHORTCUT: &str = "ctrl+shift+k"; - -/// Set shortcut during application startup -pub fn enable_shortcut(app: &App) { - let store = app - .store(HAYSTACK_TAURI_STORE) - .expect("Creating the store should not fail"); - - // Use stored shortcut if it exists - if let Some(stored_shortcut) = store.get(HAYSTACK_GLOBAL_SHORTCUT) { - let stored_shortcut_str = match stored_shortcut { - JsonValue::String(str) => str, - unexpected_type => panic!( - "Haystack shortcuts should be stored as strings, found type: {} ", - unexpected_type - ), - }; - let stored_shortcut = stored_shortcut_str - .parse::() - .expect("Stored shortcut string should be valid"); - _register_shortcut_upon_start(app, stored_shortcut); // Register stored shortcut - } else { - // Use default shortcut if none is stored - store.set( - HAYSTACK_GLOBAL_SHORTCUT, - JsonValue::String(DEFAULT_SHORTCUT.to_string()), - ); - let default_shortcut = DEFAULT_SHORTCUT - .parse::() - .expect("Default shortcut should be valid"); - _register_shortcut_upon_start(app, default_shortcut); // Register default shortcut - } -} - -/// Get the current stored shortcut as a string -#[tauri::command] -pub fn get_current_shortcut(app: AppHandle) -> Result { - let shortcut = _get_shortcut(&app); - Ok(shortcut) -} - -/// Unregister the current shortcut in Tauri -#[tauri::command] -pub fn unregister_shortcut(app: AppHandle) { - let shortcut_str = _get_shortcut(&app); - let shortcut = shortcut_str - .parse::() - .expect("Stored shortcut string should be valid"); - - // Unregister the shortcut - app.global_shortcut() - .unregister(shortcut) - .expect("Failed to unregister shortcut") -} - -/// Change the global shortcut -#[tauri::command] -pub fn change_shortcut( - app: AppHandle, - _window: tauri::Window, - key: String, -) -> Result<(), String> { - println!("Key: {}", key); - let shortcut = match key.parse::() { - Ok(shortcut) => shortcut, - Err(_) => return Err(format!("Invalid shortcut {}", key)), - }; - - // Store the new shortcut - let store = app - .get_store(HAYSTACK_TAURI_STORE) - .expect("Store should already be loaded or created"); - store.set(HAYSTACK_GLOBAL_SHORTCUT, JsonValue::String(key)); - - // Register the new shortcut - _register_shortcut(&app, shortcut); - - Ok(()) -} - -/// Helper function to register a shortcut, primarily for updating shortcuts -fn _register_shortcut(app: &AppHandle, shortcut: Shortcut) { - let main_window = app.get_webview_window("main").unwrap(); - // Register global shortcut and define its behavior - app.global_shortcut() - .on_shortcut(shortcut, move |app, scut, event| { - if scut == &shortcut { - if let ShortcutState::Pressed = event.state() { - // Toggle window visibility - if main_window.is_visible().unwrap() { - main_window.hide().unwrap(); // Hide window - } else { - main_window.show().unwrap(); // Show window - main_window.set_focus().unwrap(); // Focus window - // Emit focus-search event - app.emit("focus-search", ()).unwrap(); - } - } - } - }) - .map_err(|err| format!("Failed to register new shortcut '{}'", err)) - .unwrap(); -} - -/// Helper function to register shortcuts during application startup -fn _register_shortcut_upon_start(app: &App, shortcut: Shortcut) { - let window = app - .get_webview_window("main") - .expect("webview to be defined"); - - // Initialize global shortcut and set its handler - app.handle() - .plugin( - tauri_plugin_global_shortcut::Builder::new() - .with_handler(move |app, scut, event| { - if scut == &shortcut { - if let ShortcutState::Pressed = event.state() { - // Toggle window visibility - if window.is_visible().unwrap() { - window.hide().unwrap(); // Hide window - } else { - window.show().unwrap(); // Show window - window.set_focus().unwrap(); // Focus window - // Emit focus-search event - app.emit("focus-search", ()).unwrap(); - } - } - } - }) - .build(), - ) - .unwrap(); - app.global_shortcut().register(shortcut).unwrap(); // Register global shortcut -} - -/// Retrieve the stored global shortcut as a string -pub fn _get_shortcut(app: &AppHandle) -> String { - let store = app - .get_store(HAYSTACK_TAURI_STORE) - .expect("Store should already be loaded or created"); - - match store - .get(HAYSTACK_GLOBAL_SHORTCUT) - .expect("Shortcut should already be stored") - { - JsonValue::String(str) => str, - unexpected_type => panic!( - "Haystack shortcuts should be stored as strings, found type: {} ", - unexpected_type - ), - } -} diff --git a/frontend/src-tauri/src/window.rs b/frontend/src-tauri/src/window.rs index 5c8767f..8827ce0 100644 --- a/frontend/src-tauri/src/window.rs +++ b/frontend/src-tauri/src/window.rs @@ -2,10 +2,10 @@ use tauri::App; use tauri::{WebviewUrl, WebviewWindowBuilder}; pub fn setup_window(app: &mut App) -> Result<(), Box> { - let win_builder = WebviewWindowBuilder::new(app, "main", WebviewUrl::default()) - .inner_size(480.0, 360.0) - .title("Haystack") - .resizable(false); + let win_builder = WebviewWindowBuilder::new(app, "main", WebviewUrl::default()); + //.inner_size(480.0, 360.0) + //.title("Haystack") + //.resizable(false); #[cfg(target_os = "macos")] {