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
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ struct POSSettingsLocalCatalogDetailView: View {
ScrollView {
VStack(spacing: POSSpacing.medium) {
catalogStatus
managingDataUsage
if viewModel.deviceHasCellularCapability {
managingDataUsage
}
manualCatalogUpdate
}
.padding(.horizontal, POSPadding.medium)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import CocoaLumberjackSwift
import Yosemite
import Foundation
import Storage
import WooFoundation

@Observable
final class POSSettingsLocalCatalogViewModel {
Expand All @@ -11,6 +12,7 @@ final class POSSettingsLocalCatalogViewModel {

private(set) var isLoading: Bool = false
private(set) var isRefreshingCatalog: Bool = false
let deviceHasCellularCapability: Bool = CellularCapabilityChecker.deviceHasCellularCapability()

var catalogRefreshError: POSIdentifiableErrorState? = nil

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import Darwin

public struct CellularCapabilityChecker {
public static func deviceHasCellularCapability() -> Bool {
var addrs: UnsafeMutablePointer<ifaddrs>?
guard getifaddrs(&addrs) == 0 else { return false }
defer { freeifaddrs(addrs) }

var cursor = addrs
while let addr = cursor {
guard let namePtr = addr.pointee.ifa_name else {
cursor = addr.pointee.ifa_next
continue
}

let name = String(cString: namePtr)
// This isn't a great check, but the alternatives are deprecated, and apparently it's commonly used.
// pdp_ip0 is the first cellular interface – it's not present if there's no cellular hardware.
if name == "pdp_ip0" {
return true
}
cursor = addr.pointee.ifa_next
}
return false
}
}