Unverified Commit e9fdfe70 authored by Nikolay Igotti's avatar Nikolay Igotti Committed by GitHub

Add multiplatform openUri API (#497)

parent 87e97798
......@@ -334,6 +334,11 @@ kotlin {
}
if (supportNative) {
all {
// Really ugly, see https://youtrack.jetbrains.com/issue/KT-46649 why it is required,
// note that setting it per source set still keeps it unset in commonized source sets.
languageSettings.optIn("kotlin.native.SymbolNameIsInternal")
}
// See https://kotlinlang.org/docs/mpp-share-on-platforms.html#configure-the-hierarchical-structure-manually
val nativeMain by creating {
dependsOn(nativeJsMain)
......@@ -1236,14 +1241,6 @@ if (skiko.isCIBuild || mavenCentral.signArtifacts) {
}
}
afterEvaluate {
tasks.withType<KotlinCompile>().configureEach { // this one is actually KotlinJvmCompile
if (name == "compileTestKotlinJvm") {
kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
}
}
}
/**
* Do not call inside tasks.register or tasks.call callback
* (tasks' registration during other task's registration is prohibited)
......
package org.jetbrains.skiko
import android.content.Context
import android.content.*
import android.content.ClipboardManager
import android.content.res.Configuration
import android.net.Uri
import org.jetbrains.skiko.redrawer.Redrawer
actual fun setSystemLookAndFeel(): Unit = TODO()
internal class AndroidOpenGLRedrawer(
......@@ -45,3 +48,20 @@ actual val currentSystemTheme: SystemTheme
else -> SystemTheme.UNKNOWN
}
}
internal actual fun URIHandler_openUri(uri: String) {
defaultContext!!.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(uri)))
}
internal actual fun ClipboardManager_setText(text: String) {
val clipboard = defaultContext!!.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("", text)
clipboard.setPrimaryClip(clip)
}
internal actual fun ClipboardManager_getText(): String? {
val context = defaultContext!!
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = clipboard.primaryClip ?: return null
return clip.getItemAt(0)?.text?.toString()
}
\ No newline at end of file
package org.jetbrains.skiko
import org.jetbrains.skiko.redrawer.*
import java.awt.Desktop
import java.awt.Toolkit
import java.awt.datatransfer.DataFlavor
import java.awt.datatransfer.StringSelection
import java.awt.datatransfer.UnsupportedFlavorException
import java.net.URI
import javax.swing.UIManager
actual fun setSystemLookAndFeel() = UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
......@@ -34,3 +40,26 @@ internal actual fun makeDefaultRenderFactory(): RenderFactory {
}
}
}
internal actual fun URIHandler_openUri(uri: String) {
Desktop.getDesktop().browse(URI(uri))
}
private val systemClipboard by lazy {
try {
Toolkit.getDefaultToolkit().getSystemClipboard()
} catch (e: java.awt.HeadlessException) {
null
}
}
internal actual fun ClipboardManager_setText(text: String) {
systemClipboard?.setContents(StringSelection(text), null)
}
internal actual fun ClipboardManager_getText(): String? {
return try {
systemClipboard?.getData(DataFlavor.stringFlavor) as String?
} catch (_: UnsupportedFlavorException) {
null
}
}
package org.jetbrains.skiko
/**
* Manager for opening external links. Is open so that platform could provide an override if default doesn't fit.
*/
open class URIManager {
/**
* Asynchronous request to open a URI in system browser.
* [uri] a universal resource identifier to open, exact set of supported APIs is platform dependent
*/
open fun openUri(uri: String) = URIHandler_openUri(uri)
}
internal expect fun URIHandler_openUri(uri: String)
/**
* Manager for controlling system clipboard. Is open so that platform could provide an override if default doesn't fit.
*/
open class ClipboardManager {
open fun setText(text: String) = ClipboardManager_setText(text)
open fun getText(): String? = ClipboardManager_getText()
}
internal expect fun ClipboardManager_setText(text: String)
internal expect fun ClipboardManager_getText(): String?
package org.jetbrains.skiko
import platform.Foundation.NSURL.Companion.URLWithString
import platform.UIKit.UIApplication
import platform.UIKit.UIPasteboard
internal actual fun URIHandler_openUri(uri: String) {
UIApplication.sharedApplication.openURL(URLWithString(uri)!!)
}
internal actual fun ClipboardManager_setText(text: String) {
UIPasteboard.generalPasteboard.string = text
}
internal actual fun ClipboardManager_getText(): String? {
return UIPasteboard.generalPasteboard.string
}
\ No newline at end of file
package org.jetbrains.skiko
import kotlinx.coroutines.await
internal actual inline fun <R> maybeSynchronized(lock: Any, block: () -> R): R =
block()
actual fun currentNanoTime(): Long = (kotlinx.browser.window.performance.now() * 1_000_000).toLong()
internal actual fun URIHandler_openUri(uri: String) {
kotlinx.browser.window.open(uri, target = "_blank")
}
internal actual fun ClipboardManager_setText(text: String) {
kotlinx.browser.window.navigator.clipboard.writeText(text)
}
internal actual fun ClipboardManager_getText(): String? {
TODO("implement ClipboardManager_getText")
// kotlinx.browser.window.navigator.clipboard.readText()
}
\ No newline at end of file
package org.jetbrains.skiko
actual fun URIHandler_openUri(uri: String) {
TODO("Implement URIHandler_openUri() on Linux")
}
internal actual fun ClipboardManager_setText(text: String) {
TODO("Implement ClipboardManager_setText() on Linux")
}
internal actual fun ClipboardManager_getText(): String? {
TODO("Implement ClipboardManager_getText() on Linux")
}
\ No newline at end of file
package org.jetbrains.skiko
import platform.AppKit.NSPasteboard
import platform.AppKit.NSPasteboardTypeString
import platform.AppKit.NSWorkspace
import platform.Foundation.NSURL
internal actual fun URIHandler_openUri(uri: String) {
NSWorkspace.sharedWorkspace.openURL(NSURL.URLWithString(uri)!!)
}
internal actual fun ClipboardManager_setText(text: String) {
NSPasteboard.generalPasteboard.setString(string = text, forType = NSPasteboardTypeString)
}
internal actual fun ClipboardManager_getText(): String? {
return NSPasteboard.generalPasteboard.stringForType(dataType = NSPasteboardTypeString)
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment