ui/common/src/desktopMain/kotlin/DesktopBrowserLauncher.kt
changeset 48 de36017d25b3
child 51 d69bdf1ad491
equal deleted inserted replaced
47:246422783c0c 48:de36017d25b3
       
     1 /*
       
     2  * AboutOss is an utility library to retrieve and display
       
     3  * opensource licenses in Android applications.
       
     4  *
       
     5  * Copyright (C) 2023-2025 by Frederic-Charles Barthelery.
       
     6  *
       
     7  * This file is part of AboutOss.
       
     8  *
       
     9  * AboutOss is free software: you can redistribute it and/or modify
       
    10  * it under the terms of the GNU General Public License as published by
       
    11  * the Free Software Foundation, either version 3 of the License, or
       
    12  * (at your option) any later version.
       
    13  *
       
    14  * AboutOss is distributed in the hope that it will be useful,
       
    15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    17  * GNU General Public License for more details.
       
    18  *
       
    19  * You should have received a copy of the GNU General Public License
       
    20  * along with AboutOss.  If not, see <http://www.gnu.org/licenses/>.
       
    21  */
       
    22 package com.geekorum.aboutoss.ui.common
       
    23 
       
    24 import java.awt.Desktop
       
    25 import java.net.URI
       
    26 import java.util.Locale
       
    27 
       
    28 class DesktopBrowserLauncher : BrowserLauncher {
       
    29 
       
    30     private val desktopLauncher = run {
       
    31         if (Desktop.isDesktopSupported()) {
       
    32             val desktop = Desktop.getDesktop()
       
    33             if (desktop.isSupported(Desktop.Action.BROWSE)) {
       
    34                 return@run DesktopLauncher(desktop)
       
    35             }
       
    36         }
       
    37         null
       
    38     }
       
    39 
       
    40     private val openCommandLauncher = OpenCommandLauncher()
       
    41 
       
    42     override fun warmUp() {
       
    43     }
       
    44 
       
    45     override fun launchUrl(link: String) {
       
    46         try {
       
    47             desktopLauncher?.launchUrl(link)
       
    48             return
       
    49         } catch (e: Exception) {
       
    50             e.printStackTrace()
       
    51             System.err.println("Unable to launch url $link. Use fallback")
       
    52         }
       
    53 
       
    54         try {
       
    55             openCommandLauncher.launchUrl(link)
       
    56             return
       
    57         } catch (e: Exception) {
       
    58             e.printStackTrace()
       
    59             System.err.println("Unable to launch url $link")
       
    60         }
       
    61     }
       
    62 
       
    63     override fun mayLaunchUrl(vararg uris: String) {
       
    64     }
       
    65 
       
    66     override fun shutdown() {
       
    67     }
       
    68 }
       
    69 
       
    70 private interface Launcher {
       
    71     fun launchUrl(link: String)
       
    72 }
       
    73 
       
    74 private class DesktopLauncher(
       
    75     private val desktop: Desktop
       
    76 ) : Launcher {
       
    77     override fun launchUrl(link: String) {
       
    78         desktop.browse(URI(link))
       
    79     }
       
    80 }
       
    81 
       
    82 private class OpenCommandLauncher: Launcher {
       
    83     override fun launchUrl(link: String) {
       
    84         val osName = System.getProperty("os.name").lowercase(Locale.getDefault())
       
    85         val command = when {
       
    86             "mac" in osName -> "open"
       
    87             "nix" in osName || "nux" in osName -> "xdg-open"
       
    88             else -> error("cannot open $link")
       
    89         }
       
    90 
       
    91         ProcessBuilder(command, link)
       
    92             .start()
       
    93     }
       
    94 }