Skip to content

Commit

Permalink
Release 12.1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
rlepinski committed Jan 23, 2025
1 parent 0b4ad79 commit 3700311
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 3 deletions.
2 changes: 1 addition & 1 deletion AirshipFrameworkProxy.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

Pod::Spec.new do |s|
s.version = "12.0.0"
s.version = "12.1.0"
s.name = "AirshipFrameworkProxy"
s.summary = "Airship iOS mobile framework proxy"
s.documentation_url = "https://docs.airship.com/platform/mobile"
Expand Down
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version:5.9
// swift-tools-version:6.0

// Copyright Airship and Contributors

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package com.urbanairship.android.framework.proxy.ui

import android.content.Context
import android.os.Bundle
import android.util.AttributeSet
import android.webkit.WebView
import androidx.annotation.CallSuper
import androidx.annotation.MainThread
import androidx.annotation.RestrictTo
import com.urbanairship.UALog
import com.urbanairship.actions.ActionArguments
import com.urbanairship.actions.ActionRunRequest
import com.urbanairship.javascript.JavaScriptEnvironment
import com.urbanairship.json.JsonMap
import com.urbanairship.json.JsonValue
import com.urbanairship.messagecenter.Message
import com.urbanairship.messagecenter.MessageCenter
import com.urbanairship.webkit.AirshipWebViewClient
import com.urbanairship.webkit.NestedScrollAirshipWebView
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.TimeZone
import kotlinx.coroutines.runBlocking

// Copy of https://github.com/urbanairship/android-library-dev/blob/main/urbanairship-message-center/src/main/java/com/urbanairship/messagecenter/ui/widget/MessageWebView.kt until its
// public again

/** Base WebView configured for Airship Message Center content. */
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class MessageWebView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0,
defResStyle: Int = 0
): NestedScrollAirshipWebView(context, attrs, defStyle, defResStyle) {

/**
* Loads the web view with the [Message].
*
* @param message The message that will be displayed.
*/
public fun loadMessage(message: Message) {
UALog.v { "Loading message: ${message.id}" }
val user = MessageCenter.shared().user

// Send authorization in the headers if the web view supports it
val headers = HashMap<String, String>()

// Set the auth
val (userId, password) = user.id to user.password
if (userId != null && password != null) {
setClientAuthRequest(message.bodyUrl, userId, password)
headers["Authorization"] = createBasicAuth(userId, password)
}
UALog.v { "Load URL: ${message.bodyUrl}" }
loadUrl(message.bodyUrl, headers)
}
}

/** A `WebViewClient` that enables the Airship Native Bridge for Message Center. */
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public open class MessageWebViewClient : AirshipWebViewClient() {

/**
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
override fun extendActionRequest(
request: ActionRunRequest,
webView: WebView
): ActionRunRequest {
val metadata = Bundle()
val message = getMessage(webView)
if (message != null) {
metadata.putString(ActionArguments.RICH_PUSH_ID_METADATA, message.id)
}
request.setMetadata(metadata)
return request
}

/**
* @hide
*/
@CallSuper
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
override fun extendJavascriptEnvironment(
builder: JavaScriptEnvironment.Builder,
webView: WebView
): JavaScriptEnvironment.Builder {
val message = getMessage(webView)
val extras = message?.extras?.let { JsonValue.wrapOpt(it).optMap() } ?: JsonMap.EMPTY_MAP
val formattedSentDate = message?.sentDate?.let { DATE_FORMATTER.format(it) }

return super.extendJavascriptEnvironment(builder, webView)
.addGetter("getMessageSentDateMS", message?.sentDate?.time ?: -1)
.addGetter("getMessageId", message?.id)
.addGetter("getMessageTitle", message?.title)
.addGetter("getMessageSentDate", formattedSentDate)
.addGetter("getUserId", MessageCenter.shared().user.id)
.addGetter("getMessageExtras", extras)
}

/**
* Helper method to get the RichPushMessage from the web view.
*
* @param webView The web view.
* @return The rich push message, or null if the web view does not have an associated message.
* @note This method should only be called from the main thread.
*/
@MainThread
private fun getMessage(webView: WebView): Message? = runBlocking {
val url = webView.url
MessageCenter.shared().inbox.getMessageByUrl(url)
}

private companion object {
private val DATE_FORMATTER = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ", Locale.US).apply {
timeZone = TimeZone.getTimeZone("UTC")
}
}
}
2 changes: 1 addition & 1 deletion android/gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[versions]

# Airship
airshipProxy = '12.0.0'
airshipProxy = '12.1.0'
airship = '19.0.0'

# Gradle plugins
Expand Down
3 changes: 3 additions & 0 deletions ios/AirshipFrameworkProxy/Proxies/AirshipProxy.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,11 @@ public enum AirshipProxyError: Error {
}

public protocol AirshipProxyDelegate {
@MainActor
func migrateData(store: ProxyStore)
@MainActor
func loadDefaultConfig() -> AirshipConfig
@MainActor
func onAirshipReady()
}

Expand Down

0 comments on commit 3700311

Please sign in to comment.