Skip to content

Commit

Permalink
Migrate to Kotlin (#16)
Browse files Browse the repository at this point in the history
  • Loading branch information
zoontek authored Nov 4, 2024
1 parent d36414d commit 67f2905
Show file tree
Hide file tree
Showing 32 changed files with 4,412 additions and 4,182 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ openBrowser("https://swan.io", {
});
```

> [!IMPORTANT]
> On Android, the Chrome app must be opened at least once for this to work — a step often overlooked when using emulators in development.
## Handle deeplinks

In order to receive deeplink on browser close event, you have to setup them first. We **highly** recommand defining a custom schema + url for this specific task. For example, `com.company.myapp://close`.
Expand Down
12 changes: 7 additions & 5 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ buildscript {
gradlePluginPortal()
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${safeExtGet("kotlinVersion", "1.8.0")}")
classpath("com.android.tools.build:gradle:7.3.1")
}
}
Expand All @@ -16,14 +17,15 @@ def isNewArchitectureEnabled() {
}

apply plugin: "com.android.library"
apply plugin: "kotlin-android"

if (isNewArchitectureEnabled()) {
apply plugin: "com.facebook.react"
}

android {
buildToolsVersion safeExtGet("buildToolsVersion", "33.0.0")
compileSdkVersion safeExtGet("compileSdkVersion", 33)
buildToolsVersion safeExtGet("buildToolsVersion", "34.0.0")
compileSdkVersion safeExtGet("compileSdkVersion", 34)

if (project.android.hasProperty("namespace")) {
namespace "io.swan.rnbrowser"
Expand All @@ -39,8 +41,8 @@ android {
}
defaultConfig {
buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString())
minSdkVersion safeExtGet("minSdkVersion", 21)
targetSdkVersion safeExtGet("targetSdkVersion", 33)
minSdkVersion safeExtGet("minSdkVersion", 23)
targetSdkVersion safeExtGet("targetSdkVersion", 34)
}
lintOptions {
abortOnError false
Expand Down Expand Up @@ -68,5 +70,5 @@ repositories {
dependencies {
//noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+" // From node_modules
implementation "androidx.browser:browser:${safeExtGet("androidXBrowserVersion", "1.5.0")}"
implementation "androidx.browser:browser:${safeExtGet("androidXBrowserVersion", "1.8.0")}"
}

This file was deleted.

105 changes: 105 additions & 0 deletions android/src/main/java/io/swan/rnbrowser/RNSwanBrowserModuleImpl.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package io.swan.rnbrowser

import android.content.Intent
import android.net.Uri

import androidx.annotation.ColorInt
import androidx.browser.customtabs.CustomTabColorSchemeParams
import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.content.ContextCompat
import androidx.core.graphics.ColorUtils

import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter

import io.swan.rnbrowser.helpers.CustomTabActivityHelper

object RNSwanBrowserModuleImpl {
const val NAME = "RNSwanBrowser"
private var browserVisible = false

internal fun onHostResume(reactContext: ReactApplicationContext) {
if (browserVisible && reactContext.hasActiveReactInstance()) {
browserVisible = false

reactContext
.getJSModule(RCTDeviceEventEmitter::class.java)
.emit("swanBrowserDidClose", null)
}
}

internal fun open(
reactContext: ReactApplicationContext,
url: String,
options: ReadableMap,
promise: Promise
) {
if (browserVisible) {
return promise.reject(
"swan_browser_visible",
"An instance of the swan browser is already visible"
)
}

val activity = reactContext.currentActivity
?: return promise.reject(
"no_current_activity",
"Couldn't call open() when the app is in background"
)

browserVisible = true

val intentBuilder = CustomTabsIntent.Builder().apply {
setBookmarksButtonEnabled(false)
setDownloadButtonEnabled(false)
setInstantAppsEnabled(false)
setSendToExternalDefaultHandlerEnabled(false)
setShowTitle(false)

if (options.getString("animationType") == "fade") {
setStartAnimations(activity, com.facebook.react.R.anim.catalyst_fade_in, R.anim.inert)
setExitAnimations(activity, R.anim.inert, com.facebook.react.R.anim.catalyst_fade_out)
} else {
setStartAnimations(activity, com.facebook.react.R.anim.catalyst_slide_up, R.anim.inert)
setExitAnimations(activity, R.anim.inert, com.facebook.react.R.anim.catalyst_slide_down)
}
}

@ColorInt val blackColor = ContextCompat.getColor(activity ,android.R.color.black)

val paramsBuilder = CustomTabColorSchemeParams.Builder().apply {
setNavigationBarColor(blackColor)

if (options.hasKey("barTintColor")) {
@ColorInt val barTintColor = options.getInt("barTintColor")

setToolbarColor(barTintColor)
setSecondaryToolbarColor(barTintColor)

intentBuilder.setColorScheme(
when (ColorUtils.calculateLuminance(barTintColor) > 0.5) {
true -> CustomTabsIntent.COLOR_SCHEME_LIGHT
false -> CustomTabsIntent.COLOR_SCHEME_DARK
}
)
}
}

intentBuilder.setDefaultColorSchemeParams(paramsBuilder.build())

val customTabsIntent = intentBuilder.build().apply {
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
}

CustomTabActivityHelper.openCustomTab(
activity, customTabsIntent, Uri.parse(url)
) { currentActivity, uri ->
currentActivity.startActivity(Intent(Intent.ACTION_VIEW, uri))
}

promise.resolve(null)
}
}
47 changes: 0 additions & 47 deletions android/src/main/java/io/swan/rnbrowser/RNSwanBrowserPackage.java

This file was deleted.

37 changes: 37 additions & 0 deletions android/src/main/java/io/swan/rnbrowser/RNSwanBrowserPackage.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package io.swan.rnbrowser

import com.facebook.react.TurboReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.module.model.ReactModuleInfo
import com.facebook.react.module.model.ReactModuleInfoProvider

class RNSwanBrowserPackage : TurboReactPackage() {

override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
return when (name) {
RNSwanBrowserModuleImpl.NAME -> RNSwanBrowserModule(reactContext)
else -> null
}
}

override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
return ReactModuleInfoProvider {
val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
val isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED

val moduleInfo = ReactModuleInfo(
RNSwanBrowserModuleImpl.NAME,
RNSwanBrowserModuleImpl.NAME,
false,
false,
true,
false,
isTurboModule
)

moduleInfos[RNSwanBrowserModuleImpl.NAME] = moduleInfo
moduleInfos
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// https://github.com/GoogleChrome/android-browser-helper/blob/master/demos/custom-tabs-example-app/src/main/java/org/chromium/customtabsdemos/CustomTabActivityHelper.java
// https://github.com/GoogleChrome/android-browser-helper/blob/main/demos/custom-tabs-example-app/src/main/java/org/chromium/customtabsdemos/CustomTabActivityHelper.java
//
// Copyright 2015 Google Inc. All Rights Reserved.
//
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// https://github.com/GoogleChrome/android-browser-helper/blob/master/demos/custom-tabs-example-app/src/main/java/org/chromium/customtabsdemos/CustomTabsHelper.java
// https://github.com/GoogleChrome/android-browser-helper/blob/main/demos/custom-tabs-example-app/src/main/java/org/chromium/customtabsdemos/CustomTabsHelper.java
//
// Copyright 2015 Google Inc. All Rights Reserved.
//
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// https://github.com/GoogleChrome/android-browser-helper/blob/master/demos/custom-tabs-example-app/src/main/java/org/chromium/customtabsdemos/ServiceConnection.java
// https://github.com/GoogleChrome/android-browser-helper/blob/main/demos/custom-tabs-example-app/src/main/java/org/chromium/customtabsdemos/ServiceConnection.java
//
// Copyright 2015 Google Inc. All Rights Reserved.
//
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// https://github.com/GoogleChrome/android-browser-helper/blob/master/demos/custom-tabs-example-app/src/main/java/org/chromium/customtabsdemos/ServiceConnectionCallback.java
// https://github.com/GoogleChrome/android-browser-helper/blob/main/demos/custom-tabs-example-app/src/main/java/org/chromium/customtabsdemos/ServiceConnectionCallback.java
//
// Copyright 2015 Google Inc. All Rights Reserved.
//
Expand Down
Loading

0 comments on commit 67f2905

Please sign in to comment.