This repository was archived by the owner on Feb 24, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathDockPositionProvider.swift
79 lines (68 loc) · 2.55 KB
/
DockPositionProvider.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//
// DockPositionProvider.swift
//
// Copyright © 2024 DuckDuckGo. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Foundation
enum DockApp: String, CaseIterable {
case chrome = "/Applications/Google Chrome.app/"
case firefox = "/Applications/Firefox.app/"
case edge = "/Applications/Microsoft Edge.app/"
case brave = "/Applications/Brave Browser.app/"
case opera = "/Applications/Opera.app/"
case arc = "/Applications/Arc.app/"
case safari = "/Applications/Safari.app/"
case safariLong = "/System/Volumes/Preboot/Cryptexes/App/System/Applications/Safari.app/"
var url: URL? {
return URL(string: "file://" + self.rawValue)
}
}
protocol DockPositionProviding {
func newDockIndex(from currentAppURLs: [URL]) -> Int
}
/// Class to determine the best positioning in the Dock
final class DockPositionProvider: DockPositionProviding {
private let preferredOrder: [DockApp] = [
.chrome,
.firefox,
.edge,
.brave,
.opera,
.arc,
.safari,
.safariLong
]
private var defaultBrowserProvider: DefaultBrowserProvider
init(defaultBrowserProvider: DefaultBrowserProvider = SystemDefaultBrowserProvider()) {
self.defaultBrowserProvider = defaultBrowserProvider
}
/// Determines the new dock index for a new app based on the default browser or preferred order
func newDockIndex(from currentAppURLs: [URL]) -> Int {
// Place next to the default browser
if !defaultBrowserProvider.isDefault,
let defaultBrowserURL = defaultBrowserProvider.defaultBrowserURL,
let position = currentAppURLs.firstIndex(of: defaultBrowserURL) {
return position + 1
}
// Place based on the preferred order
for app in preferredOrder {
if let appUrl = app.url, let position = currentAppURLs.firstIndex(of: appUrl) {
return position + 1
}
}
// Otherwise, place at the end
return currentAppURLs.count
}
}