Skip to content
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
26 changes: 14 additions & 12 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -219,18 +219,6 @@ var package = Package(
sdkVersionDefine
]
),
.target(
name: "AndroidManifest",
dependencies: [
"AndroidJava"
],
exclude: ["swift-java.config"],
swiftSettings: [
.swiftLanguageMode(.v5),
ndkVersionDefine,
sdkVersionDefine
]
),
.target(
name: "AndroidR",
dependencies: [
Expand Down Expand Up @@ -487,6 +475,20 @@ var package = Package(
linkerSettings: [
.linkedLibrary("android", .when(platforms: [.android]))
]
),
.target(
name: "AndroidManifest",
dependencies: [
"AndroidNDK"
],
swiftSettings: [
.swiftLanguageMode(.v6),
ndkVersionDefine,
sdkVersionDefine
],
linkerSettings: [
.linkedLibrary("android", .when(platforms: [.android]))
]
)
],
swiftLanguageModes: [.v5, .v6]
Expand Down
2 changes: 1 addition & 1 deletion Sources/AndroidBinder/Error.swift
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ internal extension binder_status_t {
return .failure(error)
}

func mapError<T>(
func mapError<T: ~Copyable>(
as _: T.Type,
file: StaticString = #file,
function: StaticString = #function
Expand Down
8 changes: 0 additions & 8 deletions Sources/AndroidManifest/AndroidManifest.swift

This file was deleted.

1,731 changes: 1,370 additions & 361 deletions Sources/AndroidManifest/Permission.swift

Large diffs are not rendered by default.

99 changes: 99 additions & 0 deletions Sources/AndroidManifest/PermissionCheck.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
//
// Permission+Check.swift
// AndroidKit
//
// Created by Alsey Coleman Miller on 2/26/26.
//

#if os(Android)
import Android
import AndroidNDK
#elseif canImport(Darwin)
import Darwin
#elseif canImport(Glibc)
import Glibc
#endif

public extension Permission {

/// Permission State
enum CheckStatus: Int32, Sendable, Equatable {

/// Permission is granted (`0`).
case granted = 0

/// Permission is denied (`-1`).
case denied = -1
}

enum Error: Int32, Swift.Error {

/**
This is returned if the permission check encountered an unspecified error.

The output result is unmodified.
*/
case unknown = -1

/**
This is returned if the permission check failed because the service is unavailable.

The output result is unmodified.
*/
case serviceUnavailable = -2
}
}

public extension Permission {

/// Checks this permission for a specific process/user pair using
/// `APermissionManager_checkPermission`.
///
/// - Parameters:
/// - pid: Process ID to evaluate. Defaults to the current process ID.
/// - uid: User ID to evaluate. Defaults to the current user ID.
/// - Returns: Permission check status.
func check(
pid: pid_t = getpid(),
uid: uid_t = getuid()
) throws(Permission.Error) -> CheckStatus {
try _check(pid: pid, uid: uid).get()
}

/// Checks this permission for a specific process/user pair using
/// `APermissionManager_checkPermission`.
///
/// - Parameters:
/// - pid: Process ID to evaluate. Defaults to the current process ID.
/// - uid: User ID to evaluate. Defaults to the current user ID.
/// - Returns: Permission check status.
internal func _check(
pid: pid_t = getpid(),
uid: uid_t = getuid()
) -> Result<CheckStatus, Error> {
var result: Int32 = -1
let returnCode: Int32
#if os(Android)
returnCode = rawValue.withCString {
APermissionManager_checkPermission($0, pid, uid, &result)
}
#else
returnCode = -1
#endif
guard returnCode != 0, let status = CheckStatus(rawValue: result) else {
return .failure(.init(rawValue: returnCode) ?? .unknown)
}
return .success(status)
}

/// Returns `true` when this permission is granted for the current process.
var isGranted: Bool {
let status = _check()
switch status {
case .success(.granted):
return true
default:
return false
}
}
}
24 changes: 11 additions & 13 deletions Sources/AndroidManifest/PermissionGroup.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@
// Created by Killian Greene on 7/6/18.
//

import SwiftJava

public extension Permission {

public struct Group: RawRepresentable, Equatable, Hashable, Codable, Sendable {
struct Group: RawRepresentable, Equatable, Hashable, Codable, Sendable {

public let rawValue: String

Expand All @@ -21,23 +19,23 @@ public extension Permission {

public extension Permission.Group {

static let calendar = Permission.Group(rawValue: try! JavaClass<AndroidManifest.Manifest.Permission.Group>().CALENDAR)
static let calendar = Permission.Group(rawValue: "android.permission-group.CALENDAR")

static let callLog = Permission.Group(rawValue: try! JavaClass<AndroidManifest.Manifest.Permission.Group>().CALL_LOG)
static let callLog = Permission.Group(rawValue: "android.permission-group.CALL_LOG")

static let camera = Permission.Group(rawValue: try! JavaClass<AndroidManifest.Manifest.Permission.Group>().CAMERA)
static let camera = Permission.Group(rawValue: "android.permission-group.CAMERA")

static let contacts = Permission.Group(rawValue: try! JavaClass<AndroidManifest.Manifest.Permission.Group>().CONTACTS)
static let contacts = Permission.Group(rawValue: "android.permission-group.CONTACTS")

static let location = Permission.Group(rawValue: try! JavaClass<AndroidManifest.Manifest.Permission.Group>().LOCATION)
static let location = Permission.Group(rawValue: "android.permission-group.LOCATION")

static let microphone = Permission.Group(rawValue: try! JavaClass<AndroidManifest.Manifest.Permission.Group>().MICROPHONE)
static let microphone = Permission.Group(rawValue: "android.permission-group.MICROPHONE")

static let phone = Permission.Group(rawValue: try! JavaClass<AndroidManifest.Manifest.Permission.Group>().PHONE)
static let phone = Permission.Group(rawValue: "android.permission-group.PHONE")

static let sensors = Permission.Group(rawValue: try! JavaClass<AndroidManifest.Manifest.Permission.Group>().SENSORS)
static let sensors = Permission.Group(rawValue: "android.permission-group.SENSORS")

static let sms = Permission.Group(rawValue: try! JavaClass<AndroidManifest.Manifest.Permission.Group>().SMS)
static let sms = Permission.Group(rawValue: "android.permission-group.SMS")

static let storage = Permission.Group(rawValue: try! JavaClass<AndroidManifest.Manifest.Permission.Group>().STORAGE)
static let storage = Permission.Group(rawValue: "android.permission-group.STORAGE")
}
57 changes: 0 additions & 57 deletions Sources/AndroidManifest/generated/Manifest+Permission+Group.swift

This file was deleted.

Loading