Skip to content
Open
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
4 changes: 3 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,6 @@ permissions:
jobs:
call-workflow:
uses: skiptools/actions/.github/workflows/skip-framework.yml@v1

with:
runs-on: "['macos-15-intel', 'ubuntu-24.04']"
swift-android-sdk-version: "['', 'nightly-main']"
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.1
import PackageDescription

let package = Package(
Expand Down
2 changes: 1 addition & 1 deletion Sources/SkipAndroidBridge/AndroidBridgeBootstrap.swift
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public class AndroidBridge {
/// get `Foundation` idioms working with Android conventions.
// SKIP @bridge
public class AndroidBridgeBootstrap {
private static var androidBridgeInit = false
nonisolated(unsafe) private static var androidBridgeInit = false

/// Perform all the setup that is needed to get `Foundation` idioms working with Android conventions.
///
Expand Down
13 changes: 8 additions & 5 deletions Sources/SkipAndroidBridge/AndroidBundle.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,19 @@ open class AndroidBundle : Foundation.Bundle, @unchecked Sendable {
super.init(path: Foundation.Bundle.main.bundlePath)!
}

// These inits require 'override' on Android but not iOS or ROBOLECTRIC
// These inits require 'override' on Android but not iOS or ROBOLECTRIC.
// They must not be marked unavailable because the auto-generated
// resource_bundle_accessor.swift (produced by the swiftbuild build system)
// calls Bundle(for: BundleFinder.self) as part of its fallback chain.
#if os(Android)
@available(*, unavailable)
public override init(for aClass: AnyClass) {
fatalError()
self.bundleAccess = BundleAccess.main
super.init(path: Foundation.Bundle.main.bundlePath)!
}

@available(*, unavailable)
public override init?(identifier: String) {
fatalError()
self.bundleAccess = BundleAccess.main
super.init(path: Foundation.Bundle.main.bundlePath)!
}
#endif

Expand Down
2 changes: 1 addition & 1 deletion Sources/SkipAndroidBridge/AndroidUserDefaults.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ open class AndroidUserDefaults : Foundation.UserDefaults {
open override class var standard: AndroidUserDefaults {
return _standard
}
private static let _standard = AndroidUserDefaults()
nonisolated(unsafe) private static let _standard = AndroidUserDefaults()

private let userDefaultsAccess: UserDefaultsAccess

Expand Down
6 changes: 3 additions & 3 deletions Sources/SkipAndroidBridge/AssetURLProtocol.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ fileprivate let logger: Logger = Logger(subsystem: "skip.android.bridge", catego
/// A custom URLProtocol that serves requests from the native Android `AAssetManager`, which is implemented in `swift-android-native / AndroidAssetManager.swift`
public class AssetURLProtocol: URLProtocol {
/// The URL scheme that this protocol handles
public static var scheme = "asset"
public static let scheme = "asset"

private static var registered = false
private static var assetManager: AndroidAssetManager? = nil
nonisolated(unsafe) private static var registered = false
nonisolated(unsafe) private static var assetManager: AndroidAssetManager? = nil

public static func register() throws {
if registered { return }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ final class SkipAndroidBridgeSamplesTests: XCTestCase {
}

// SkipAndroidBridgeSamplesTests.kt testAndroidContext -> SkipAndroidBridgeSamples.kt nativeAndroidContextPackageName -> SkipAndroidBridgeSamples.swift nativeAndroidContextPackageName -> AndroidContext.swift getPackageName()
XCTAssertEqual("skip.android.bridge.samples.test", try nativeAndroidContextPackageName())
XCTAssertEqual("skip.android.bridge.samples.module.test", try nativeAndroidContextPackageName())
}

func testLocalizedStringResource() throws {
Expand Down
10 changes: 5 additions & 5 deletions Tests/SkipAndroidBridgeTests/AndroidBridgeTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@ final class AndroidBridgeTests: XCTestCase {
let cacheDir = URL(fileURLWithPath: context.getCacheDir().getAbsolutePath(), isDirectory: true)

if isRobolectric {
// Robolectric's files folder is tough to predict (e.g. /var/folders/zl/wkdjv4s1271fbm6w0plzknkh0000gn/T/robolectric-AndroidBridgeTests_testAndroidBridge_SkipAndroidBridge_debugUnitTest10131350412654065418/skip.android.bridge.test-dataDir/files)
XCTAssertTrue(filesDir.path.hasSuffix("/files"), "unexpected filesDir.path: \(filesDir.path)")
XCTAssertTrue(cacheDir.path.hasSuffix("/cache"), "unexpected cacheDir.path: \(cacheDir.path)")
// Robolectric's files folder is tough to predict (e.g. /var/folders/zl/wkdjv4s1271fbm6w0plzknkh0000gn/T/robolectric-AndroidBridgeTests_testAndroidBridge_SkipAndroidBridge_debugUnitTest10131350412654065418/skip.android.bridge.module.test-dataDir/files)
XCTAssertTrue(filesDir.path.hasSuffix("/skip.android.bridge.module.test-dataDir/files"), "unexpected filesDir.path: \(filesDir.path)")
XCTAssertTrue(cacheDir.path.hasSuffix("/skip.android.bridge.module.test-dataDir/cache"), "unexpected cacheDir.path: \(cacheDir.path)")
} else {
// …but Android is predictably the app's "files" and "cache" directories
XCTAssertEqual("/data/user/0/skip.android.bridge.test/files", filesDir.path)
XCTAssertEqual("/data/user/0/skip.android.bridge.test/cache", cacheDir.path)
XCTAssertEqual("/data/user/0/skip.android.bridge.module.test/files", filesDir.path)
XCTAssertEqual("/data/user/0/skip.android.bridge.module.test/cache", cacheDir.path)
}

// make sure we can read and write to the filesDir
Expand Down
Loading