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
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ enum KnownExperiment: CaseIterable {
// Supports client experimentation
// For each experiment, add a case to `KnownExperiment`
//
case placeholder // TODO: Replace with real experiments

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Avoid shipping a dummy enum case; make it debug‑only or remove via explicit allCases.

Keeping placeholder in a CaseIterable enum risks showing a bogus “experiment” in any UI/logic that iterates KnownExperiment.allCases. Also the // TODO trips SwiftLint. Prefer either: (A) gate the placeholder behind #if DEBUG and give it a stable UUID; or (B) remove the placeholder and implement allCases as [] until real experiments exist.

Option A (debug‑only placeholder, stable UUID, no TODO):

 enum KnownExperiment: CaseIterable {
@@
-    case placeholder // TODO: Replace with real experiments
+    #if DEBUG
+    /// Debug-only placeholder to keep CaseIterable non-empty during development.
+    case placeholder
+    #endif
@@
-    var uuid: UUID {
-        /*
-        switch self {
-            case someExperiment: return "Experiment UUID"
-        }
-         */
-        
-        // Return a UUID for each known experiment
-        return UUID()
-    }
+    var uuid: UUID {
+        switch self {
+        #if DEBUG
+        case .placeholder:
+            // Stable value to avoid churn in persisted state or lookups.
+            return UUID(uuidString: "00000000-0000-0000-0000-000000000000")!
+        #endif
+        }
+    }

Option B (no placeholder; explicit empty cases):

-enum KnownExperiment: CaseIterable {
-    
-    //
-    // Supports client experimentation
-    // For each experiment, add a case to `KnownExperiment`
-    //
-    case placeholder // TODO: Replace with real experiments
-    
-    var uuid: UUID {
-        // Return a UUID for each known experiment
-        return UUID()
-    }
-    
-    static let configurationVersion = "1.0.0"
-}
+enum KnownExperiment: CaseIterable {
+    static var allCases: [KnownExperiment] { [] }
+    var uuid: UUID {
+        preconditionFailure("No KnownExperiment cases defined yet")
+    }
+    static let configurationVersion = "1.0.0"
+}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
case placeholder // TODO: Replace with real experiments
enum KnownExperiment: CaseIterable {
static var allCases: [KnownExperiment] { [] }
var uuid: UUID {
preconditionFailure("No KnownExperiment cases defined yet")
}
static let configurationVersion = "1.0.0"
}
🧰 Tools
🪛 SwiftLint (0.57.0)

[Warning] 17-17: TODOs should be resolved (Replace with real experiments)

(todo)

🤖 Prompt for AI Agents
In apps/ios/GuideDogs/Code/App/Feature Flags/Experiment
Flighting/ExperimentManager.swift around line 17, the CaseIterable enum contains
a shipping placeholder case which can leak into production UIs and trips
SwiftLint; either replace it with a debug‑only case or remove it and provide an
explicit empty allCases. For Option A: wrap the placeholder case in #if DEBUG /
#endif (no TODO comment), give it a stable UUID value if the enum requires
associated IDs, and leave CaseIterable synthesis for debug builds only. For
Option B: delete the placeholder case entirely and implement a manual static var
allCases: [KnownExperiment] { return [] } (or the equivalent explicit array) so
production builds have no dummy experiment. Ensure no TODO comments remain and
the enum compiles in both debug and release.


var uuid: UUID {
/*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ extension Array where Element == CLLocation {
extension CLLocationCoordinate2D {

var isValidLocationCoordinate: Bool {
return CLLocationCoordinate2DIsValid(self) && self != CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)
return CLLocationCoordinate2DIsValid(self) && !self.isNear(to: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0))
}

func distance(from coordinate: CLLocationCoordinate2D) -> CLLocationDistance {
Expand Down Expand Up @@ -165,7 +165,7 @@ extension CLLocationCoordinate2D {
}

// Check if the coordinates are the same
guard self != coordinate else {
guard !self .isNear(to: coordinate )else {

Copilot AI Sep 18, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent spacing around the method call. There should be no space before the dot operator and after the parentheses.

Copilot uses AI. Check for mistakes.
return 0
}

Expand Down Expand Up @@ -221,14 +221,18 @@ extension CLLocationCoordinate2D {

}

extension CLLocationCoordinate2D: Equatable {
public static func == (lhs: CLLocationCoordinate2D, rhs: CLLocationCoordinate2D) -> Bool {
return lhs.equalTo(coordinate: rhs, threshold: 0.0000009)
}
extension CLLocationCoordinate2D {

private func equalTo(coordinate: CLLocationCoordinate2D, threshold: CLLocationDegrees) -> Bool {
public func isNear(to coordinate: CLLocationCoordinate2D, threshold: CLLocationDegrees = 0.0000009) -> Bool {
return fabs(self.latitude - coordinate.latitude) <= threshold && fabs(self.longitude - coordinate.longitude) <= threshold
}

public func isNear(to coordinate: CLLocationCoordinate2D?, threshold: CLLocationDegrees = 0.0000009) -> Bool {
guard let coordinate = coordinate else {
return false
}
return isNear(to: coordinate, threshold: threshold)
}
}

extension CLLocationCoordinate2D: CustomStringConvertible {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ extension MKMapView {
}

private func showAnnotationAndCenter(_ annotation: MKAnnotation) {
guard centerCoordinate != annotation.coordinate else {
guard !centerCoordinate.isNear(to: annotation.coordinate )else {

Copilot AI Sep 18, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent spacing after the closing parenthesis. There should be a space between the closing parenthesis and 'else'.

Copilot uses AI. Check for mistakes.
// no-op
return
}
Expand Down
9 changes: 5 additions & 4 deletions apps/ios/GuideDogs/Code/App/Helpers/GeometryUtils.swift
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ class GeometryUtils {
}

// Check if we need to add a coordinate for a closed path
if coordinates.last! != coordinates.first! {
if !coordinates.last!.isNear(to: coordinates.first! ){
(pixelX, pixelY) = VectorTile.getPixelXY(latitude: coordinates.first!.latitude, longitude: coordinates.first!.longitude, zoom: 16)
}
path.move(to: CGPoint(x: pixelX, y: pixelY))
Expand Down Expand Up @@ -125,7 +125,7 @@ class GeometryUtils {
static func split(path: [CLLocationCoordinate2D],
atCoordinate coordinate: CLLocationCoordinate2D,
reversedDirection: Bool = false) -> [CLLocationCoordinate2D] {
guard let coordinateIndex = path.firstIndex(of: coordinate) else {
guard let coordinateIndex = path.firstIndex(where: {coordinate.isNear(to: $0)}) else {
return []
}

Expand All @@ -147,7 +147,8 @@ class GeometryUtils {
static func rotate(circularPath path: [CLLocationCoordinate2D],
atCoordinate coordinate: CLLocationCoordinate2D,
reversedDirection: Bool = false) -> [CLLocationCoordinate2D] {
guard pathIsCircular(path), let coordinateIndex = path.firstIndex(of: coordinate) else {
guard pathIsCircular(path),
let coordinateIndex = path.firstIndex(where: {coordinate.isNear(to: $0)}) else {
return []
}

Expand Down Expand Up @@ -176,7 +177,7 @@ class GeometryUtils {
return false
}

return first == last
return first.isNear(to: last)
}

/// Returns the distance of a coordinate path
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,7 @@ extension ActivityPOI: POI {
}

func contains(location: CLLocationCoordinate2D) -> Bool {
return coordinate == location
return coordinate.isNear(to: location)
}

func closestLocation(from location: CLLocation, useEntranceIfAvailable: Bool) -> CLLocation {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -380,15 +380,15 @@ class Intersection: Object, Locatable, Localizable {
// Check roads that intersect with their vertices (first or last coordinates).
// This represents the vertical section of the T.
guard let roadCoordinates = road.coordinates else { return false }
guard intersectionCoordinate == roadCoordinates.first || intersectionCoordinate == roadCoordinates.last else { return false }
guard intersectionCoordinate.isNear(to: roadCoordinates.first) || intersectionCoordinate.isNear(to: roadCoordinates.last) else { return false }

// Find a similar road that intersect with it's edge (not the first or last coordinates).
// This represents the horizontal section of the T.
return roads.contains { (otherRoad) -> Bool in
guard otherRoad.key != road.key && otherRoad.name == road.name else { return false }
guard let otherRoadCoordinates = otherRoad.coordinates else { return false }

return intersectionCoordinate != otherRoadCoordinates.first && intersectionCoordinate != otherRoadCoordinates.last
return !intersectionCoordinate.isNear(to: otherRoadCoordinates.first) && !intersectionCoordinate.isNear(to: otherRoadCoordinates.last)
}
}
}
Expand Down Expand Up @@ -520,7 +520,7 @@ extension Intersection {
return intersection
}

let similarIntersections = intersections.filter { $0.coordinate == intersection.coordinate }
let similarIntersections = intersections.filter { $0.coordinate.isNear(to: intersection.coordinate) }
guard similarIntersections.count > 1 else {
return intersection
}
Expand Down Expand Up @@ -611,14 +611,14 @@ extension Intersection {
let intersectionCoordinate = self.coordinate

// 1. Road start
if intersectionCoordinate == roadCoordinates.first! {
if intersectionCoordinate.isNear(to: roadCoordinates.first) {
guard let bearing = road.bearing() else { return nil }
let direction = Direction(from: heading, to: bearing, type: .leftRight)

return [RoadDirection(road, bearing, direction)]
}
// 2. Road end
else if intersectionCoordinate == roadCoordinates.last! {
else if intersectionCoordinate.isNear(to: roadCoordinates.last) {
guard let bearing = road.bearing(reversedDirection: true) else { return nil }
let direction = Direction(from: heading, to: bearing, type: .leftRight)

Expand All @@ -627,7 +627,7 @@ extension Intersection {
// 3. Along the road
else {
// Find the intersection coordinate along the road
guard let intersectionCoordinateIndex = roadCoordinates.firstIndex(of: intersectionCoordinate) else {
guard let intersectionCoordinateIndex = roadCoordinates.firstIndex(where: {$0.isNear(to: intersectionCoordinate) }) else {
// We did not find a match for the intersection coordinate
// The road does not contain the intersection coordinate
DDLogDebug("Could not find an intersection coordinate for road: \(road.name)")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ class ReferenceEntity: Object, ObjectKeyIdentifiable {
/// - Throws: If the database/cache cannot be accessed or the new reference entity cannot be added
static func update(entity: ReferenceEntity, location: CLLocationCoordinate2D? = nil, nickname: String?, address: String?, annotation: String?, context: String? = nil, isTemp: Bool) throws {
var locChanged: Bool = false
if let loc = location, loc != entity.coordinate {
if let loc = location, !loc.isNear(to: entity.coordinate) {
locChanged = true
}

Expand Down
6 changes: 3 additions & 3 deletions apps/ios/GuideDogs/Code/Data/Models/Protocols/Road.swift
Original file line number Diff line number Diff line change
Expand Up @@ -165,11 +165,11 @@ extension Road {
guard let roadCoordinates = coordinates else { return .none }
let intersectionCoordinate = intersection.coordinate

if intersectionCoordinate == roadCoordinates.first {
if intersectionCoordinate.isNear(to: roadCoordinates.first) {
return .leading
} else if intersectionCoordinate == roadCoordinates.last {
} else if intersectionCoordinate.isNear(to: roadCoordinates.last) {
return .trailing
} else if roadCoordinates.contains(intersectionCoordinate) {
} else if roadCoordinates.contains(where: {$0.isNear(to: intersectionCoordinate) }) {
return .leadingAndTrailing
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class GenericLocation: SelectablePOI {
// MARK: Methods

func contains(location: CLLocationCoordinate2D) -> Bool {
return location == self.location.coordinate
return location.isNear(to: self.location.coordinate)
}

func updateDistanceAndBearing(with location: CLLocation) {
Expand Down
25 changes: 14 additions & 11 deletions apps/ios/GuideDogs/Code/Data/Preview/IntersectionFinder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ struct IntersectionFinder {
road: Road,
preferMainIntersections: Bool = false,
secondaryRoadsContext: SecondaryRoadsContext = .standard) {
guard let roadCoordinates = road.coordinates, roadCoordinates.contains(rootCoordinate) else {
guard let roadCoordinates = road.coordinates, roadCoordinates.contains(where: {rootCoordinate.isNear(to: $0)}) else {
return nil
}

Expand Down Expand Up @@ -195,10 +195,10 @@ struct IntersectionFinder {
coordinatesFromRoot :
(trailingCoordinates + coordinatesFromRoot.dropFirst())

guard let endpointIntersection = intersections.first(where: { $0.coordinate == lastCoordinate }) else {
guard let endpointIntersection = intersections.first(where: { $0.coordinate.isNear(to: lastCoordinate) }) else {
// Reached the end of the road

if road.intersections.contains(where: { $0.coordinate == lastCoordinate }) {
if road.intersections.contains(where: { $0.coordinate.isNear(to: lastCoordinate) }) {
// Don't synthesize an intersection here since we already filtered this intersection out
return nil
}
Expand Down Expand Up @@ -300,7 +300,7 @@ struct IntersectionFinder {
// If so, reverse the direction of calculation
// note: We want the first adjacent road coordinate to be the same as the last coordinate of the root road
guard let lastAdjacentRoadCoordinate = nextRoadSegmentCoordinates.last else { return nil }
let reversedDirection = (rootCoordinate == lastAdjacentRoadCoordinate)
let reversedDirection = rootCoordinate.isNear(to: lastAdjacentRoadCoordinate)

if let adjacentRoadClosestIntersection = closestIntersection(fromCoordinate: rootCoordinate,
onRoad: nextRoadSegment,
Expand Down Expand Up @@ -336,7 +336,7 @@ struct IntersectionFinder {
}

for (i, coordinate) in roadCoordinates.enumerated() {
if let intersection = intersections.first(where: { $0.coordinate == coordinate }) {
if let intersection = intersections.first(where: { $0.coordinate.isNear(to: coordinate) }) {
let similarIntersectionWithMaxRoads = Intersection.similarIntersectionWithMaxRoads(intersection: intersection, intersections: intersections)
return (similarIntersectionWithMaxRoads, i)
}
Expand Down Expand Up @@ -395,7 +395,7 @@ struct IntersectionFinder {
}

if IntersectionFinder.roadContainsCycle(road: nextRoadSegment, to: trailingCoordinates) {
if intersection.coordinate == self.rootCoordinate {
if intersection.coordinate.isNear(to: self.rootCoordinate) {
// If the road loops back to the root coordinate, no need to return an intersection.
return nil
} else {
Expand All @@ -412,7 +412,7 @@ struct IntersectionFinder {
// If so, reverse the direction of calculation
// note: We want the first adjacent road coordinate to be the same as the last coordinate of the root road
guard let lastAdjacentRoadCoordinate = nextRoadSegmentCoordinates.last else { return nil }
let reversedDirection = (lastCoordinate == lastAdjacentRoadCoordinate)
let reversedDirection = lastCoordinate .isNear(to: lastAdjacentRoadCoordinate)

Copilot AI Sep 18, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent spacing before the dot operator. There should be no space between the variable name and the dot.

Copilot uses AI. Check for mistakes.

return lastIntersection(fromCoordinate: lastCoordinate,
onRoad: nextRoadSegment,
Expand All @@ -429,7 +429,8 @@ struct IntersectionFinder {
guard let roadCoordinates = road.coordinates else { return false }
guard let lastCoordinate = coordinates.last else { return false }

if roadCoordinates.first == lastCoordinate && roadCoordinates.last == lastCoordinate {
if lastCoordinate.isNear(to: roadCoordinates.first) &&
lastCoordinate.isNear(to: roadCoordinates.last) {
// The road starts and ends at the same coordinate (loops back)
return true
}
Expand All @@ -439,15 +440,17 @@ struct IntersectionFinder {
var coordinatesExcludingRoot: [CLLocationCoordinate2D]

// Because of road segments direction, we check if the root coordinate is the first or last.
if roadCoordinates.first == lastCoordinate {
if lastCoordinate.isNear(to: roadCoordinates.first) {
coordinatesExcludingRoot = Array(roadCoordinates.dropFirst())
} else if roadCoordinates.last == lastCoordinate {
} else if lastCoordinate.isNear(to: roadCoordinates.last) {
coordinatesExcludingRoot = roadCoordinates.dropLast()
} else {
return false
}

if coordinatesExcludingRoot.contains(where: { coordinates.contains($0) }) {
if coordinatesExcludingRoot.contains(where: {coordinate in
coordinates.contains(where: {coordinate.isNear(to: $0)})
}) {
return true
Comment on lines +451 to 454

Copilot AI Sep 18, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The nested contains(where:) calls create confusing logic. Consider refactoring this into a more readable implementation with better variable naming to distinguish between the outer and inner coordinate variables.

Suggested change
if coordinatesExcludingRoot.contains(where: {coordinate in
coordinates.contains(where: {coordinate.isNear(to: $0)})
}) {
return true
for roadCoordinate in coordinatesExcludingRoot {
for trailCoordinate in coordinates {
if roadCoordinate.isNear(to: trailCoordinate) {
return true
}
}

Copilot uses AI. Check for mistakes.
}

Expand Down
36 changes: 35 additions & 1 deletion apps/ios/GuideDogs/Code/Data/Preview/RoadAdjacentDataView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import CoreLocation
import CocoaLumberjackSwift
import CoreGPX

struct RoadAdjacentDataView: AdjacentDataView, Equatable {
struct RoadAdjacentDataView: AdjacentDataView /*, fixme Equatable */ {

typealias ReferenceEntityID = String

Expand Down Expand Up @@ -413,3 +413,37 @@ extension RoadAdjacentDataView {
}

}

// MARK: Equatable Conformance
// this emulates the old custom Equatable conformance extension on CLLocationCoordinate2D, which was not based on exact equality.
extension RoadAdjacentDataView: Equatable {
static func ==(lhs: RoadAdjacentDataView, rhs: RoadAdjacentDataView) -> Bool {
guard lhs.endpoint == rhs.endpoint,
lhs.direction == rhs.direction,
lhs.style == rhs.style,
lhs.adjacent == rhs.adjacent,
lhs.coordinatesToEndpoint.count
== rhs.coordinatesToEndpoint.count,
lhs.adjacentCalloutLocationsHistory.count
== rhs.adjacentCalloutLocationsHistory.count
else {
return false
}

// 2) compare the two coordinate arrays element-wise
for (c1, c2) in zip(lhs.coordinatesToEndpoint, rhs.coordinatesToEndpoint) {
if !c1.isNear(to: c2) { return false }
}

// 3) compare the dictionary of callout locations
for (key, loc1) in lhs.adjacentCalloutLocationsHistory {
guard let loc2 = rhs.adjacentCalloutLocationsHistory[key],
loc1.isNear(to: loc2)
else {
return false
}
}

return true
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ class SpatialDataCache: NSObject {

/// Returns all the intersections that connect to a given road
static func intersection(forRoadKey roadKey: String, atCoordinate coordinate: CLLocationCoordinate2D) -> Intersection? {
return intersections(forRoadKey: roadKey)?.first(where: { $0.coordinate == coordinate })
return intersections(forRoadKey: roadKey)?.first(where: { $0.coordinate.isNear(to: coordinate) })
}

/// Returns all the intersections that connect to a given road, within a region.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ class BeaconTitleViewController: UIViewController {

// If the selected location on the underlying entity has changed, reconfigure the view
// to show the new distance
let beaconCoordinateDidChange = newValue?.locationDetail.location.coordinate != oldValue?.locationDetail.location.coordinate
let beaconCoordinateDidChange = !(newValue?.locationDetail.location.coordinate.isNear(to: oldValue?.locationDetail.location.coordinate) ?? false)

Copilot AI Sep 18, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is overly complex and hard to read. Consider extracting the coordinate comparison logic into a separate variable or method for better readability.

Copilot uses AI. Check for mistakes.

// If the underlying entity has changed, reconfigure the view and the view's accessibility
// actions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,21 +82,21 @@ struct LocationDetail {
return false
}

return lhsAt.coordinate == rhsAt.coordinate
return lhsAt.coordinate.isNear(to: rhsAt.coordinate
)
case let .designData(lhsAt, lhsAddress):
guard case let .designData(rhsAt, rhsAddress) = rhs else {
return false
}

return lhsAt.coordinate == rhsAt.coordinate && lhsAddress == rhsAddress
return lhsAt.coordinate.isNear(to: rhsAt.coordinate) && lhsAddress == rhsAddress

case let .screenshots(lhsPoi):
guard case let .screenshots(rhsPoi) = rhs else {
return false
}

return lhsPoi.location.coordinate == rhsPoi.location.coordinate && lhsPoi.name == rhsPoi.name && lhsPoi.addressLine == rhsPoi.addressLine
return lhsPoi.location.coordinate.isNear(to: rhsPoi.location.coordinate) && lhsPoi.name == rhsPoi.name && lhsPoi.addressLine == rhsPoi.addressLine
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ class BeaconDetailStore: ObservableObject {

let newValue = BeaconDetail.updateLocationDetailIfNeeded(for: oldValue)

guard newValue.locationDetail.source != oldValue.locationDetail.source || newValue.locationDetail.location.coordinate != oldValue.locationDetail.location.coordinate else {
guard newValue.locationDetail.source != oldValue.locationDetail.source || !newValue.locationDetail.location.coordinate.isNear(to: oldValue.locationDetail.location.coordinate) else {
return
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ class EditableMapViewController: UIViewController {
// Selected location is at the center of the map
let newLocation = CLLocation(mapView.centerCoordinate)

if newLocation.coordinate != detail.centerLocation.coordinate {
if !newLocation.coordinate.isNear(to: detail.centerLocation.coordinate) {
// Notify the delegate
delegate?.viewController(self, didUpdateLocation: LocationDetail(detail, withUpdatedLocation: newLocation))
}
Expand All @@ -132,7 +132,7 @@ class EditableMapViewController: UIViewController {
dismiss(animated: true, completion: nil)
} else {
// `Edit` selected
if detail.centerLocation.coordinate == mapView.centerCoordinate {
if detail.centerLocation.coordinate.isNear(to: mapView.centerCoordinate) {
// Map region is centered at the given location
// Immediately configure the view
configureForEditLocation()
Expand Down
Loading