Skip to content

Migrate to Kotlin #16

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Nov 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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