Skip to content

Commit bbe68eb

Browse files
committed
Move extensions that were in UITraitCollection to new AppEnvironment class.
1 parent 6747ee2 commit bbe68eb

7 files changed

Lines changed: 52 additions & 51 deletions

File tree

src/Shared/MapView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ final class MapView: UIView, UIGestureRecognizerDelegate, UIContextMenuInteracti
100100
let hover = UIHoverGestureRecognizer(target: self, action: #selector(hover(_:)))
101101
addGestureRecognizer(hover)
102102

103-
if traitCollection.isRunningOnMac {
103+
if AppEnvironment.isRunningOnMac {
104104
// right-click support for Mac
105105
let rightClick = UIContextMenuInteraction(delegate: self)
106106
addInteraction(rightClick)

src/Shared/Utility/UITraitCollection+Ext.swift

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/iOS/AppDelegate.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
120120
// Turn off GPS so we gracefully end GPX trace.
121121
AppDelegate.shared.mainView.gpsState = .NONE
122122

123-
#if canImport(ActivityKit) && !targetEnvironment(macCatalyst)
123+
#if canImport(ActivityKit)
124124
// Remove any live activities
125-
if #available(iOS 16.2, *) {
125+
if !AppEnvironment.isRunningOnMac,
126+
#available(iOS 16.2, *)
127+
{
126128
GpxTrackWidgetManager.endAllActivitiesSynchronously()
127129
}
128130
#endif

src/iOS/AppEnvironment.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//
2+
// AppEnvironment.swift
3+
// Go Map!!
4+
//
5+
// Created by Bryce Cogswell on 3/12/26.
6+
// Copyright © 2026 Bryce Cogswell. All rights reserved.
7+
//
8+
9+
import UIKit
10+
11+
enum AppEnvironment {
12+
13+
/// Returns true when running on a Mac (Catalyst, Designed for iPad, or native Mac idiom).
14+
static var isRunningOnMac: Bool {
15+
if #available(iOS 14.0, *),
16+
ProcessInfo.processInfo.isiOSAppOnMac
17+
{
18+
return true
19+
}
20+
return ProcessInfo.processInfo.isMacCatalystApp
21+
}
22+
23+
/// Returns false when running on a Mac, where no on-screen keyboard is shown.
24+
static var usesOnScreenKeyboard: Bool {
25+
if #available(iOS 14.0, *),
26+
UIDevice.current.userInterfaceIdiom == .mac
27+
{
28+
return false
29+
}
30+
return !isRunningOnMac
31+
}
32+
33+
static var hasRearCamera: Bool {
34+
return !isRunningOnMac
35+
}
36+
}

src/iOS/Go Map!!.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
02079803299470FB00D3C654 /* QuestBuilder.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 02079802299470FB00D3C654 /* QuestBuilder.storyboard */; };
2222
02092ECF29E32DD40095042B /* UserPrefs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02092ECE29E32DD40095042B /* UserPrefs.swift */; };
2323
02092ED129E8ADB70095042B /* ArchivePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02092ED029E8ADB70095042B /* ArchivePath.swift */; };
24+
020E0E212F6374A500A9D27C /* AppEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020E0E202F6374A500A9D27C /* AppEnvironment.swift */; };
2425
020E160B267A82050037DE49 /* TileServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020E160A267A82050037DE49 /* TileServer.swift */; };
2526
020EBA7926506156001D56F4 /* MercatorTileLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3FA925326411C2B000A2A99 /* MercatorTileLayer.swift */; };
2627
020EBA7A26507B50001D56F4 /* PersistentWebCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D0969F263CD4BD00E3B129 /* PersistentWebCache.swift */; };
@@ -68,7 +69,6 @@
6869
02505C5929A52EA80078D60D /* QuestDefinitionWithFilters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02505C5829A52EA80078D60D /* QuestDefinitionWithFilters.swift */; };
6970
02505C5B29A52EEE0078D60D /* QuestDefinitionWithFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02505C5A29A52EEE0078D60D /* QuestDefinitionWithFeatures.swift */; };
7071
02572B732F10D8C400216EE3 /* MessageDisplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02572B722F10D8C400216EE3 /* MessageDisplay.swift */; };
71-
025BD4422F53BF6E00CB0D35 /* UITraitCollection+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025BD4412F53BF6E00CB0D35 /* UITraitCollection+Ext.swift */; };
7272
025CCA12271244B800074726 /* KissXML in Frameworks */ = {isa = PBXBuildFile; productRef = 025CCA11271244B800074726 /* KissXML */; };
7373
025F004F2E453002003A68FA /* TypeCast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025F004E2E453002003A68FA /* TypeCast.swift */; };
7474
0260E05F2BE30D4700975570 /* CompassButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0260E05E2BE30D4700975570 /* CompassButton.swift */; };
@@ -378,6 +378,7 @@
378378
02079802299470FB00D3C654 /* QuestBuilder.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = QuestBuilder.storyboard; sourceTree = "<group>"; };
379379
02092ECE29E32DD40095042B /* UserPrefs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = UserPrefs.swift; path = ../Shared/UserPrefs.swift; sourceTree = "<group>"; };
380380
02092ED029E8ADB70095042B /* ArchivePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArchivePath.swift; sourceTree = "<group>"; };
381+
020E0E202F6374A500A9D27C /* AppEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppEnvironment.swift; sourceTree = "<group>"; };
381382
020E160A267A82050037DE49 /* TileServer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TileServer.swift; sourceTree = "<group>"; };
382383
020EC41E2EA9D6B9005B94D9 /* AlertPopup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertPopup.swift; sourceTree = "<group>"; };
383384
020F4ADD24AAD4E700D9E34A /* PresetsDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresetsDatabase.swift; sourceTree = "<group>"; };
@@ -429,7 +430,6 @@
429430
0254C6CD2579CD88000705B4 /* POI-Icons */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "POI-Icons"; path = "../POI-Icons"; sourceTree = "<group>"; };
430431
02572B722F10D8C400216EE3 /* MessageDisplay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageDisplay.swift; sourceTree = "<group>"; };
431432
025B841619DCF55C0053C637 /* SceneKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SceneKit.framework; path = System/Library/Frameworks/SceneKit.framework; sourceTree = SDKROOT; };
432-
025BD4412F53BF6E00CB0D35 /* UITraitCollection+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITraitCollection+Ext.swift"; sourceTree = "<group>"; };
433433
025F004E2E453002003A68FA /* TypeCast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypeCast.swift; sourceTree = "<group>"; };
434434
0260E05E2BE30D4700975570 /* CompassButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompassButton.swift; sourceTree = "<group>"; };
435435
0262175A2F08533D00594D88 /* PresetTranslations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresetTranslations.swift; sourceTree = "<group>"; };
@@ -894,6 +894,7 @@
894894
02ACBCFF16713F7F00BB4414 /* Shared */ = {
895895
isa = PBXGroup;
896896
children = (
897+
020E0E202F6374A500A9D27C /* AppEnvironment.swift */,
897898
0210AE082F1A2C770031F047 /* AppState.swift */,
898899
02B52E7828CAA8F800CB55F3 /* CustomViews */,
899900
02F5329B267AD0A50088DF41 /* Database */,
@@ -1165,7 +1166,6 @@
11651166
025F004E2E453002003A68FA /* TypeCast.swift */,
11661167
02EF13C22E5D041800418CA4 /* UIFont+Ext.swift */,
11671168
02811D6D2E3176DB00E9D889 /* UIImage+Extension.swift */,
1168-
025BD4412F53BF6E00CB0D35 /* UITraitCollection+Ext.swift */,
11691169
028365C82EFDFC22002B9E34 /* UnitFormatter.swift */,
11701170
02709BD12F282A8400B277C6 /* URL+Extension.swift */,
11711171
0226B7722683BCB6005DB9E2 /* URLSession+Extension.swift */,
@@ -1593,6 +1593,7 @@
15931593
02BB355D29B6A55D00FB52E5 /* OsmUserPrefs.swift in Sources */,
15941594
C3D096AE263D4BFB00E3B129 /* UploadViewController.swift in Sources */,
15951595
0288169E265895FA00C30EA2 /* OsmMapData+Edit.swift in Sources */,
1596+
020E0E212F6374A500A9D27C /* AppEnvironment.swift in Sources */,
15961597
02092ECF29E32DD40095042B /* UserPrefs.swift in Sources */,
15971598
C365A569263FCC9C007DEC94 /* TapAndDragGesture.swift in Sources */,
15981599
02A59EDB297DE4E100B0A676 /* PresetField.swift in Sources */,
@@ -1721,7 +1722,6 @@
17211722
0293B2CD2F53DDB100044DDE /* DeprecatedTags.swift in Sources */,
17221723
C341E15C2639DF440022E983 /* NearbyMappersViewController.swift in Sources */,
17231724
021FADC52585951E00F6E1C0 /* PresetDisplayGroup.swift in Sources */,
1724-
025BD4422F53BF6E00CB0D35 /* UITraitCollection+Ext.swift in Sources */,
17251725
02EF13C12E5ABF7600418CA4 /* CustomActionSheetController.swift in Sources */,
17261726
02C8C56526F446FD003B0122 /* MapMarker.swift in Sources */,
17271727
02CE3CE7299187C100DDACE0 /* TelephoneToolbar.swift in Sources */,

src/iOS/POI/PresetValueTextField.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class PresetValueTextField: AutocompleteTextField, PanoramaxDelegate {
7979
keyboardType = preset.keyboardType
8080

8181
if preset.keyboardType == .phonePad,
82-
traitCollection.usesOnScreenKeyboard
82+
AppEnvironment.usesOnScreenKeyboard
8383
{
8484
inputAccessoryView = TelephoneToolbar(forTextField: self, frame: frame)
8585
}
@@ -89,7 +89,7 @@ class PresetValueTextField: AutocompleteTextField, PanoramaxDelegate {
8989
autocapitalizationType = .sentences
9090
case "phone", "contact:phone", "fax", "contact:fax":
9191
keyboardType = .phonePad
92-
if traitCollection.usesOnScreenKeyboard {
92+
if AppEnvironment.usesOnScreenKeyboard {
9393
inputAccessoryView = TelephoneToolbar(forTextField: self, frame: frame)
9494
}
9595
case "maxspeed":
@@ -356,7 +356,7 @@ class PresetValueTextField: AutocompleteTextField, PanoramaxDelegate {
356356
private func getHeightButton() -> UIView? {
357357
guard
358358
key == "height",
359-
traitCollection.hasRearCamera
359+
AppEnvironment.hasRearCamera
360360
else {
361361
return nil
362362
}
@@ -454,7 +454,7 @@ class PresetValueTextField: AutocompleteTextField, PanoramaxDelegate {
454454
private func getOpeningHoursButton() -> UIView? {
455455
guard
456456
#available(iOS 14.0, *), // also validates SwiftUI is available
457-
traitCollection.hasRearCamera,
457+
AppEnvironment.hasRearCamera,
458458
OsmTags.isKey(key, variantOf: "opening_hours")
459459
else {
460460
return nil
@@ -484,7 +484,7 @@ class PresetValueTextField: AutocompleteTextField, PanoramaxDelegate {
484484
var panoramaxKey: String?
485485
private func getPhotographButton() -> UIView? {
486486
guard
487-
traitCollection.hasRearCamera,
487+
AppEnvironment.hasRearCamera,
488488
#available(iOS 13.0, *), // required by camera control
489489
OsmTags.isKey(key, variantOf: "panoramax")
490490
else {

src/iOS/Quests/QuestSolverController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ extension QuestSolverController {
339339

340340
func isOpeningHours(key: PresetDisplayKey) -> Bool {
341341
guard
342-
traitCollection.hasRearCamera,
342+
AppEnvironment.hasRearCamera,
343343
#available(iOS 14.0, *)
344344
else {
345345
return false
@@ -349,7 +349,7 @@ extension QuestSolverController {
349349

350350
@objc func recognizeOpeningHours(_ sender: Any?) {
351351
guard
352-
traitCollection.hasRearCamera,
352+
AppEnvironment.hasRearCamera,
353353
#available(iOS 14.0, *)
354354
else {
355355
return

0 commit comments

Comments
 (0)