-
Notifications
You must be signed in to change notification settings - Fork 2.9k
/
ClipboardBarDisplayHandler.swift
83 lines (68 loc) · 3.04 KB
/
ClipboardBarDisplayHandler.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
80
81
82
83
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import Foundation
import Shared
public struct ClipboardBarToastUX {
static let ToastDelay = 4.0
}
protocol ClipboardBarDisplayHandlerDelegate: class {
func shouldDisplay(clipboardBar bar: ButtonToast)
}
class ClipboardBarDisplayHandler {
weak var delegate: (ClipboardBarDisplayHandlerDelegate & SettingsDelegate)?
weak var settingsDelegate: SettingsDelegate?
private var sessionStarted = true
private var prefs: Prefs
private var lastDisplayedURL: String?
var clipboardToast: ButtonToast?
init(prefs: Prefs) {
self.prefs = prefs
NotificationCenter.default.addObserver(self, selector: #selector(self.SELAppWillEnterForegroundNotification), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.SELAppWillResignActive), name: NSNotification.Name.UIApplicationDidEnterBackground, object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)
}
@objc private func SELAppWillEnterForegroundNotification() {
sessionStarted = true
checkIfShouldDisplayBar()
}
@objc private func SELAppWillResignActive() {
sessionStarted = true
lastDisplayedURL = UIPasteboard.general.copiedURL?.absoluteString
}
private func shouldDisplayBar() -> Bool {
if !sessionStarted ||
UIPasteboard.general.copiedURL == nil ||
wasClipboardURLAlreadyDisplayed() ||
self.prefs.intForKey(IntroViewControllerSeenProfileKey) == nil {
return false
}
sessionStarted = false
lastDisplayedURL = UIPasteboard.general.copiedURL?.absoluteString
return true
}
//If we already displayed this URL on the previous session
//We shouldn't display it again
private func wasClipboardURLAlreadyDisplayed() -> Bool {
guard let clipboardURL = UIPasteboard.general.copiedURL?.absoluteString ,
let savedURL = lastDisplayedURL else {
return false
}
if clipboardURL == savedURL {
return true
}
return false
}
func checkIfShouldDisplayBar() {
guard let absoluteString = UIPasteboard.general.copiedURL?.absoluteString, shouldDisplayBar() else { return }
clipboardToast = ButtonToast(labelText: Strings.GoToCopiedLink, descriptionText: absoluteString, buttonText: Strings.GoButtonTittle, completion: { buttonPressed in
guard let url = URL(string: absoluteString), buttonPressed else { return }
self.delegate?.settingsOpenURLInNewTab(url)
})
if let toast = clipboardToast {
delegate?.shouldDisplay(clipboardBar: toast)
}
}
}