diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 1b541886..fbb79ecd 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -81,6 +81,10 @@ dependencies { implementation ("org.jetbrains.exposed:exposed-jdbc:$exposed_version") implementation ("com.h2database:h2:1.4.199") + // tray icon + implementation("com.dorkbox:SystemTray:3.17") + + // AndroidCompat implementation(project(":AndroidCompat")) diff --git a/server/src/main/kotlin/ir/armor/tachidesk/Main.kt b/server/src/main/kotlin/ir/armor/tachidesk/Main.kt index 79f796f8..1b726344 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/Main.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/Main.kt @@ -18,10 +18,12 @@ import ir.armor.tachidesk.util.getSource import ir.armor.tachidesk.util.getSourceList import ir.armor.tachidesk.util.getThumbnail import ir.armor.tachidesk.util.installAPK +import ir.armor.tachidesk.util.openInBrowser import ir.armor.tachidesk.util.removeExtension import ir.armor.tachidesk.util.sourceFilters import ir.armor.tachidesk.util.sourceGlobalSearch import ir.armor.tachidesk.util.sourceSearch +import ir.armor.tachidesk.util.systemTray import org.kodein.di.DI import org.kodein.di.conf.global import xyz.nulldev.androidcompat.AndroidCompat @@ -48,6 +50,7 @@ class Main { // make sure everything we need exists applicationSetup() + val tray = systemTray() registerConfigModules() @@ -58,17 +61,22 @@ class Main { // start app androidCompat.startApp(App()) -// Thread(getMangaUpdateQueueThread).start() + var hasWebUiBundled: Boolean = false val app = Javalin.create { config -> try { this::class.java.classLoader.getResource("/react/index.html") + hasWebUiBundled = true config.addStaticFiles("/react") config.addSinglePageRoot("/", "/react/index.html") } catch (e: RuntimeException) { println("Warning: react build files are missing.") + hasWebUiBundled = false } }.start(4567) + if (hasWebUiBundled) { + openInBrowser() + } app.before() { ctx -> // allow the client which is running on another port diff --git a/server/src/main/kotlin/ir/armor/tachidesk/util/Util.kt b/server/src/main/kotlin/ir/armor/tachidesk/util/Util.kt index f59e16c5..4e05e4e2 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/util/Util.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/util/Util.kt @@ -4,9 +4,17 @@ package ir.armor.tachidesk.util * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +import dorkbox.systemTray.MenuItem +import dorkbox.systemTray.SystemTray +import dorkbox.systemTray.SystemTray.TrayType +import dorkbox.util.CacheUtil +import dorkbox.util.Desktop import ir.armor.tachidesk.Config +import ir.armor.tachidesk.Main import ir.armor.tachidesk.database.makeDataBaseTables +import java.awt.event.ActionListener import java.io.File +import java.io.IOException fun applicationSetup() { // make dirs we need @@ -17,3 +25,47 @@ fun applicationSetup() { makeDataBaseTables() } + +fun openInBrowser() { + Desktop.browseURL("http://127.0.0.1:4567") +} + +val icon = Main::class.java.getResource("/icon/icon_round.png") + +fun systemTray(): SystemTray? { + // ref: https://github.com/dorkbox/SystemTray/blob/master/test/dorkbox/TestTray.java + SystemTray.DEBUG = true; // for test apps, we always want to run in debug mode + if (System.getProperty("os.name").startsWith("Windows")) + SystemTray.FORCE_TRAY_TYPE = TrayType.Swing + + CacheUtil.clear() + + val systemTray = SystemTray.get() ?: return null + val mainMenu = systemTray.menu + + mainMenu.add( + MenuItem( + "Open Tachidesk", + ActionListener { + try { + Desktop.browseURL("http://127.0.0.1:4567") + } catch (e1: IOException) { + e1.printStackTrace() + } + } + ) + ) + +// systemTray.setTooltip("Tachidesk") + systemTray.setImage(icon) +// systemTray.status = "No Mail" + + systemTray.getMenu().add( + MenuItem("Quit") { + systemTray.shutdown() + System.exit(0) + } + ) + + return systemTray +} diff --git a/server/src/main/resources/icon/icon_round.png b/server/src/main/resources/icon/icon_round.png new file mode 100644 index 00000000..ead7c324 Binary files /dev/null and b/server/src/main/resources/icon/icon_round.png differ