Skip to content

Commit 5314fea

Browse files
authored
Fix Apple Pencil compatibility for M4 iPad Pro and M2/M3 iPad Air models (#474)
* Initial plan * Fix Apple Pencil compatibility for iPad models * Add tests for Apple Pencil compatibility * Add changelog entry and fix trailing whitespace in tests * Fix linting issues. * Fix changelog entry. * Fix additional linting issues. * Fix ApplePencilSupport OptionSet raw values to use non-overlapping bits The firstGenerationUsbC raw value (0x03) overlapped with firstGeneration (0x01) and secondGeneration (0x02), causing contains() checks to return incorrect results. Changed to proper power-of-2 values.
1 parent d07d19c commit 5314fea

File tree

7 files changed

+103
-46
lines changed

7 files changed

+103
-46
lines changed

.swiftlint.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ disabled_rules:
44
- switch_case_alignment
55
- type_body_length
66
- identifier_name
7+
- trailing_comma
8+
- function_body_length
79

810
opt_in_rules:
911
- anyobject_protocol

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
### Bug fixes
2222

2323
- Fixed iPhone Air incorrectly marked as having ultra-wide camera. ([#463](https://github.com/devicekit/DeviceKit/pull/463))
24+
- Fixed Apple Pencil compatibility for M4 iPad Pro, M2/M3 iPad Air, iPad (10th gen), and iPad (A16) models. ([#474](https://github.com/devicekit/DeviceKit/pull/474))
25+
- Fixed `ApplePencilSupport` OptionSet raw values so that `.firstGenerationUsbC` no longer incorrectly overlaps with `.firstGeneration` and `.secondGeneration`. ([#474](https://github.com/devicekit/DeviceKit/pull/474))
2426
- Exclude unhandled files (`Info.plist`, `Device.swift.gyb`) to suppress SPM warnings. ([#484](https://github.com/devicekit/DeviceKit/pull/484))
2527

2628
## Version 5.7.0

Example/DeviceKitPlayground.playground/Contents.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ if Device.volumeAvailableCapacityForImportantUsage ?? 0 > Int64(1_000) {
9696
// Get the underlying device
9797
let simulator = Device.simulator(.iPhone8Plus)
9898
let realDevice = Device.iPhone8Plus
99-
simulator.realDevice == realDevice // true
100-
realDevice.realDevice == realDevice // true
99+
100+
_ = simulator.realDevice == realDevice // true
101+
_ = realDevice.realDevice == realDevice // true
101102

102103
// Get device thermal state
103104
if device.thermalState == .nominal {

Package.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// swift-tools-version:5.3
2-
//===----------------------------------------------------------------------===//
2+
// ===----------------------------------------------------------------------=== //
33
//
44
// This source file is part of the DeviceKit open source project
55
//
@@ -8,7 +8,7 @@
88
// License: https://github.com/dennisweissmann/DeviceKit/blob/master/LICENSE
99
// Contributors: https://github.com/dennisweissmann/DeviceKit#contributors
1010
//
11-
//===----------------------------------------------------------------------===//
11+
// ===----------------------------------------------------------------------=== //
1212

1313
import PackageDescription
1414

Source/Device.generated.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ public enum Device {
623623
/// - parameter identifier: The device identifier, e.g. "iPhone7,1". Can be obtained from `Device.identifier`.
624624
///
625625
/// - returns: An initialized `Device`.
626-
public static func mapToDevice(identifier: String) -> Device { // swiftlint:disable:this cyclomatic_complexity function_body_length
626+
public static func mapToDevice(identifier: String) -> Device {
627627
#if os(iOS)
628628
switch identifier {
629629
case "iPod5,1": return iPodTouch5
@@ -2197,7 +2197,7 @@ extension Device {
21972197

21982198
/// The volume’s available capacity in bytes for storing nonessential resources.
21992199
@available(iOS 11.0, *)
2200-
public static var volumeAvailableCapacityForOpportunisticUsage: Int64? { //swiftlint:disable:this identifier_name
2200+
public static var volumeAvailableCapacityForOpportunisticUsage: Int64? { // swiftlint:disable:this identifier_name
22012201
return (try? rootURL.resourceValues(forKeys: [.volumeAvailableCapacityForOpportunisticUsageKey]))?.volumeAvailableCapacityForOpportunisticUsage
22022202
}
22032203

@@ -2247,8 +2247,8 @@ extension Device {
22472247

22482248
public static let firstGeneration = ApplePencilSupport(rawValue: 0x01)
22492249
public static let secondGeneration = ApplePencilSupport(rawValue: 0x02)
2250-
public static let firstGenerationUsbC = ApplePencilSupport(rawValue: 0x03)
2251-
public static let pro = ApplePencilSupport(rawValue: 0x04)
2250+
public static let firstGenerationUsbC = ApplePencilSupport(rawValue: 0x04)
2251+
public static let pro = ApplePencilSupport(rawValue: 0x08)
22522252
}
22532253

22542254
/// All Apple Pencil Capable Devices
@@ -2269,8 +2269,8 @@ extension Device {
22692269
case .iPadPro12Inch: return .firstGeneration
22702270
case .iPadPro12Inch2: return .firstGeneration
22712271
case .iPadPro10Inch: return .firstGeneration
2272-
case .iPad10: return .firstGenerationUsbC
2273-
case .iPadA16: return .firstGenerationUsbC
2272+
case .iPad10: return [.firstGeneration, .firstGenerationUsbC]
2273+
case .iPadA16: return [.firstGeneration, .firstGenerationUsbC]
22742274
case .iPadAir4: return [.secondGeneration, .firstGenerationUsbC]
22752275
case .iPadAir5: return [.secondGeneration, .firstGenerationUsbC]
22762276
case .iPadMini6: return [.secondGeneration, .firstGenerationUsbC]
@@ -2282,17 +2282,17 @@ extension Device {
22822282
case .iPadPro12Inch5: return [.secondGeneration, .firstGenerationUsbC]
22832283
case .iPadPro11Inch4: return [.secondGeneration, .firstGenerationUsbC]
22842284
case .iPadPro12Inch6: return [.secondGeneration, .firstGenerationUsbC]
2285-
case .iPadPro11M4: return [.secondGeneration, .firstGenerationUsbC, .pro]
2286-
case .iPadPro13M4: return [.secondGeneration, .firstGenerationUsbC, .pro]
22872285
case .iPadPro11M5: return [.secondGeneration, .firstGenerationUsbC, .pro]
22882286
case .iPadPro13M5: return [.secondGeneration, .firstGenerationUsbC, .pro]
2289-
case .iPadAir11M2: return [.secondGeneration, .pro]
2290-
case .iPadAir13M2: return [.secondGeneration, .pro]
2291-
case .iPadAir11M3: return [.secondGeneration, .pro]
2292-
case .iPadAir13M3: return [.secondGeneration, .pro]
2293-
case .iPadAir11M4: return [.secondGeneration, .pro]
2294-
case .iPadAir13M4: return [.secondGeneration, .pro]
2287+
case .iPadAir11M2: return [.firstGenerationUsbC, .pro]
2288+
case .iPadAir13M2: return [.firstGenerationUsbC, .pro]
2289+
case .iPadAir11M3: return [.firstGenerationUsbC, .pro]
2290+
case .iPadAir13M3: return [.firstGenerationUsbC, .pro]
2291+
case .iPadAir11M4: return [.firstGenerationUsbC, .pro]
2292+
case .iPadAir13M4: return [.firstGenerationUsbC, .pro]
22952293
case .iPadMiniA17Pro: return [.firstGenerationUsbC, .pro]
2294+
case .iPadPro11M4: return [.firstGenerationUsbC, .pro]
2295+
case .iPadPro13M4: return [.firstGenerationUsbC, .pro]
22962296
case .simulator(let model): return model.applePencilSupport
22972297
default: return []
22982298
}

0 commit comments

Comments
 (0)