Skip to content
This repository has been archived by the owner on May 10, 2024. It is now read-only.

Commit

Permalink
Move ad-block loading to BVC and hide elements until ready
Browse files Browse the repository at this point in the history
  • Loading branch information
cuba committed Nov 16, 2022
1 parent ec6cff1 commit 0f1ec7e
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 120 deletions.
1 change: 0 additions & 1 deletion App/iOS/Delegates/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
return true
}

BrowserViewController.isFirstLaunch = Preferences.General.isFirstLaunch.value
migration = Migration(braveCore: braveCore)

// TODO: Downgrade to 14.5 once api becomes available.
Expand Down
16 changes: 5 additions & 11 deletions App/iOS/Delegates/SceneDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -103,17 +103,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
$0.browserController = browserViewController
}

Task { @MainActor in
await LaunchHelper.shared.prepareAdBlockServices(
adBlockService: appDelegate.braveCore.adblockService
)

self.present(
browserViewController: browserViewController,
windowScene: windowScene,
connectionOptions: connectionOptions
)
}
self.present(
browserViewController: browserViewController,
windowScene: windowScene,
connectionOptions: connectionOptions
)

PrivacyReportsManager.scheduleNotification(debugMode: !AppConstants.buildChannel.isPublic)
PrivacyReportsManager.consolidateData()
Expand Down
256 changes: 148 additions & 108 deletions Client/Frontend/Browser/BrowserViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,83 @@ private let KVOs: [KVOConstants] = [
]

public class BrowserViewController: UIViewController {
public static var isFirstLaunch = true
private(set) lazy var webViewContainer = UIView()
private(set) lazy var screenshotHelper = ScreenshotHelper(tabManager: tabManager)

private(set) lazy var topToolbar: TopToolbarView = {
// Setup the URL bar, wrapped in a view to get transparency effect
let topToolbar = TopToolbarView()
topToolbar.translatesAutoresizingMaskIntoConstraints = false
topToolbar.delegate = self
topToolbar.tabToolbarDelegate = self

let toolBarInteraction = UIContextMenuInteraction(delegate: self)
topToolbar.locationView.addInteraction(toolBarInteraction)
return topToolbar
}()

private(set) lazy var tabsBar: TabsBarViewController = {
let tabsBar = TabsBarViewController(tabManager: tabManager)
tabsBar.delegate = self
return tabsBar
}()

// These views wrap the top and bottom toolbars to provide background effects on them
let header = HeaderContainerView()
private let headerHeightLayoutGuide = UILayoutGuide()

private(set) lazy var footer: UIView = {
let footer = UIView()
footer.translatesAutoresizingMaskIntoConstraints = false
return footer
}()

private lazy var topTouchArea: UIButton = {
let topTouchArea = UIButton()
topTouchArea.isAccessibilityElement = false
return topTouchArea
}()

private lazy var bottomTouchArea: UIButton = {
let bottomTouchArea = UIButton()
bottomTouchArea.isAccessibilityElement = false
return bottomTouchArea
}()

/// These constraints allow to show/hide tabs bar
private var webViewContainerTopOffset: Constraint?

/// Backdrop used for displaying greyed background for private tabs
private lazy var webViewContainerBackdrop: UIView = {
let webViewContainerBackdrop = UIView()
webViewContainerBackdrop.backgroundColor = .braveBackground
webViewContainerBackdrop.alpha = 0
return webViewContainerBackdrop
}()

var webViewContainer: UIView!
var topToolbar: TopToolbarView!
var tabsBar: TabsBarViewController!
var readerModeBar: ReaderModeBarView?
var readerModeCache: ReaderModeCache
var statusBarOverlay: UIView!
fileprivate(set) var toolbar: BottomToolbarView?
private(set) var readerModeCache: ReaderModeCache

private lazy var statusBarOverlay: UIView = {
// Temporary work around for covering the non-clipped web view content
let statusBarOverlay = UIView()
statusBarOverlay.backgroundColor = Preferences.General.nightModeEnabled.value ? .nightModeBackground : .urlBarBackground
return statusBarOverlay
}()

private(set) var toolbar: BottomToolbarView?
var searchLoader: SearchLoader?
var searchController: SearchViewController?
var favoritesController: FavoritesViewController?
var screenshotHelper: ScreenshotHelper!
var searchLoader: SearchLoader?
let alertStackView = UIStackView() // All content that appears above the footer should be added to this view. (Find In Page/SnackBars)

/// All content that appears above the footer should be added to this view. (Find In Page/SnackBars)
private(set) lazy var alertStackView: UIStackView = {
let alertStackView = UIStackView()
alertStackView.axis = .vertical
alertStackView.alignment = .center
return alertStackView
}()

var findInPageBar: FindInPageBar?
var pageZoomBar: UIHostingController<PageZoomView>?
private var pageZoomListener: NSObjectProtocol?
Expand Down Expand Up @@ -94,26 +157,14 @@ public class BrowserViewController: UIViewController {
let bookmarkManager: BookmarkManager

/// Whether last session was a crash or not
fileprivate let crashedLastSession: Bool

// These views wrap the top and bottom toolbars to provide background effects on them
let header = HeaderContainerView()
private let headerHeightLayoutGuide = UILayoutGuide()
var footer: UIView!
fileprivate var topTouchArea: UIButton!
fileprivate let bottomTouchArea = UIButton()
private let crashedLastSession: Bool

// A view to place behind the bottom bar down to the toolbar during keyboard animations to avoid
// the odd look for the URL bar floating
private let bottomBarKeyboardBackground = UIView().then {
$0.isUserInteractionEnabled = false
}

// These constraints allow to show/hide tabs bar
var webViewContainerTopOffset: Constraint?

// Backdrop used for displaying greyed background for private tabs
var webViewContainerBackdrop: UIView!

var toolbarVisibilityViewModel = ToolbarVisibilityViewModel(estimatedTransitionDistance: 44)
private var toolbarLayoutGuide = UILayoutGuide().then {
$0.identifier = "toolbar-visibility-layout-guide"
Expand Down Expand Up @@ -398,7 +449,6 @@ public class BrowserViewController: UIViewController {

fileprivate func didInit() {
updateApplicationShortcuts()
screenshotHelper = ScreenshotHelper(tabManager: tabManager)
tabManager.addDelegate(self)
tabManager.addNavigationDelegate(self)
tabManager.makeWalletEthProvider = { [weak self] tab in
Expand Down Expand Up @@ -729,6 +779,62 @@ public class BrowserViewController: UIViewController {

override public func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .braveBackground

// Add layout guides
view.addLayoutGuide(pageOverlayLayoutGuide)
view.addLayoutGuide(headerHeightLayoutGuide)
view.addLayoutGuide(toolbarLayoutGuide)

// Add views
view.addSubview(webViewContainerBackdrop)
view.addSubview(webViewContainer)
header.expandedBarStackView.addArrangedSubview(topToolbar)
header.collapsedBarContainerView.addSubview(collapsedURLBarView)

addChild(tabsBar)
tabsBar.didMove(toParent: self)

view.addSubview(alertStackView)
view.addSubview(bottomTouchArea)
view.addSubview(topTouchArea)
view.addSubview(bottomBarKeyboardBackground)
view.addSubview(footer)
view.addSubview(header)
view.addSubview(statusBarOverlay)

// For now we hide some elements so they are not visible
header.isHidden = true
footer.isHidden = true

// Setup constraints
setupConstraints()
updateToolbarStateForTraitCollection(self.traitCollection)

// Do some migratins
LegacyBookmarksHelper.restore_1_12_Bookmarks() {
Logger.module.info("Bookmarks from old database were successfully restored")
}

// Perform migration to brave-core sync objects
if !Migration.isChromiumMigrationCompleted,
!Preferences.Chromium.syncV2PasswordMigrationStarted.value {
Preferences.Chromium.syncV2ObjectMigrationCount.value = 0
}

Task { @MainActor in
await LaunchHelper.shared.prepareAdBlockServices(
adBlockService: self.braveCore.adblockService
)

self.setupInteractions()
}
}

private func setupInteractions() {
// We now show some elements since we're ready to use the app
header.isHidden = false
footer.isHidden = false

NotificationCenter.default.do {
$0.addObserver(
Expand All @@ -750,87 +856,21 @@ public class BrowserViewController: UIViewController {
self, selector: #selector(updateShieldNotifications),
name: NSNotification.Name(rawValue: BraveGlobalShieldStats.didUpdateNotification), object: nil)
}

view.backgroundColor = .braveBackground

KeyboardHelper.defaultHelper.addDelegate(self)
UNUserNotificationCenter.current().delegate = self

view.addLayoutGuide(pageOverlayLayoutGuide)
view.addLayoutGuide(headerHeightLayoutGuide)

webViewContainerBackdrop = UIView()
webViewContainerBackdrop.backgroundColor = .braveBackground
webViewContainerBackdrop.alpha = 0
view.addSubview(webViewContainerBackdrop)

webViewContainer = UIView()
view.addSubview(webViewContainer)

// Temporary work around for covering the non-clipped web view content
statusBarOverlay = UIView()
statusBarOverlay.backgroundColor = Preferences.General.nightModeEnabled.value ? .nightModeBackground : .urlBarBackground

topTouchArea = UIButton()
topTouchArea.isAccessibilityElement = false
topTouchArea.addTarget(self, action: #selector(tappedTopArea), for: .touchUpInside)

bottomTouchArea.isAccessibilityElement = false
// Add interactions
topTouchArea.addTarget(self, action: #selector(tappedTopArea), for: .touchUpInside)
bottomTouchArea.addTarget(self, action: #selector(tappedTopArea), for: .touchUpInside)

// Setup the URL bar, wrapped in a view to get transparency effect
topToolbar = TopToolbarView()
topToolbar.translatesAutoresizingMaskIntoConstraints = false
topToolbar.delegate = self
topToolbar.tabToolbarDelegate = self

let toolBarInteraction = UIContextMenuInteraction(delegate: self)
topToolbar.locationView.addInteraction(toolBarInteraction)

header.expandedBarStackView.addArrangedSubview(topToolbar)

tabsBar = TabsBarViewController(tabManager: tabManager)
tabsBar.delegate = self

header.collapsedBarContainerView.addSubview(collapsedURLBarView)
header.collapsedBarContainerView.addTarget(self, action: #selector(tappedCollapsedURLBar), for: .touchUpInside)

addChild(tabsBar)
tabsBar.didMove(toParent: self)

view.addSubview(alertStackView)
footer = UIView()
footer.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(bottomTouchArea)
view.addSubview(topTouchArea)
view.addSubview(bottomBarKeyboardBackground)
view.addSubview(footer)
view.addSubview(header)
view.addSubview(statusBarOverlay)
alertStackView.axis = .vertical
alertStackView.alignment = .center

view.addLayoutGuide(toolbarLayoutGuide)
toolbarLayoutGuide.snp.makeConstraints {
self.toolbarTopConstraint = $0.top.equalTo(view.safeArea.top).constraint
self.toolbarBottomConstraint = $0.bottom.equalTo(view).constraint
$0.leading.trailing.equalTo(view)
}

self.updateToolbarStateForTraitCollection(self.traitCollection)

setupConstraints()

updateRewardsButtonState()

// Setup UIDropInteraction to handle dragging and dropping
// links into the view from other apps.
let dropInteraction = UIDropInteraction(delegate: self)
view.addInteraction(dropInteraction)

LegacyBookmarksHelper.restore_1_12_Bookmarks() {
Logger.module.info("Bookmarks from old database were successfully restored")
}

// Adding a small delay before fetching gives more reliability to it,
// epsecially when you are connected to a VPN.
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
Expand All @@ -846,12 +886,6 @@ public class BrowserViewController: UIViewController {

showWalletTransferExpiryPanelIfNeeded()

/// Perform migration to brave-core sync objects
if !Migration.isChromiumMigrationCompleted,
!Preferences.Chromium.syncV2PasswordMigrationStarted.value {
Preferences.Chromium.syncV2ObjectMigrationCount.value = 0
}

doSyncMigration()

if #available(iOS 14, *), !Preferences.DefaultBrowserIntro.defaultBrowserNotificationScheduled.value {
Expand Down Expand Up @@ -994,7 +1028,13 @@ public class BrowserViewController: UIViewController {
}
}

fileprivate func setupConstraints() {
private func setupConstraints() {
toolbarLayoutGuide.snp.makeConstraints {
self.toolbarTopConstraint = $0.top.equalTo(view.safeArea.top).constraint
self.toolbarBottomConstraint = $0.bottom.equalTo(view).constraint
$0.leading.trailing.equalTo(view)
}

collapsedURLBarView.snp.makeConstraints {
$0.edges.equalToSuperview()
}
Expand Down Expand Up @@ -1406,7 +1446,7 @@ public class BrowserViewController: UIViewController {
}

if tabManager.selectedTab == nil {
tabsBar?.view.isHidden = true
tabsBar.view.isHidden = true
return
}

Expand All @@ -1430,7 +1470,7 @@ public class BrowserViewController: UIViewController {
}
}

let isShowing = tabsBar?.view.isHidden == false
let isShowing = tabsBar.view.isHidden == false
let shouldShow = shouldShowTabBar()

if isShowing != shouldShow && presentedViewController == nil {
Expand Down Expand Up @@ -2796,7 +2836,7 @@ extension BrowserViewController: TabManagerDelegate {
// Update Tab Count on Tab-Tray Button
let count = tabManager.tabsForCurrentMode.count
toolbar?.updateTabCount(count)
topToolbar?.updateTabCount(count)
topToolbar.updateTabCount(count)

// Update Actions for Tab-Tray Button
var newTabMenuChildren: [UIAction] = []
Expand All @@ -2810,7 +2850,7 @@ extension BrowserViewController: TabManagerDelegate {
self.openBlankNewTab(attemptLocationFieldFocus: false, isPrivate: true)
})

if (UIDevice.current.userInterfaceIdiom == .pad && tabsBar?.view.isHidden == true) || (UIDevice.current.userInterfaceIdiom == .phone && toolbar == nil) {
if (UIDevice.current.userInterfaceIdiom == .pad && tabsBar.view.isHidden == true) || (UIDevice.current.userInterfaceIdiom == .phone && toolbar == nil) {
newTabMenuChildren.append(openNewPrivateTab)
}

Expand Down Expand Up @@ -2911,8 +2951,8 @@ extension BrowserViewController: TabManagerDelegate {
alert.addAction(closeAllAction)
alert.addAction(cancelAction)

if let popoverPresentation = alert.popoverPresentationController,
let tabsButton = toolbar?.tabsButton ?? topToolbar?.tabsButton {
if let popoverPresentation = alert.popoverPresentationController {
let tabsButton = toolbar?.tabsButton ?? topToolbar.tabsButton
popoverPresentation.sourceView = tabsButton
popoverPresentation.sourceRect =
.init(x: tabsButton.frame.width / 2, y: tabsButton.frame.height, width: 1, height: 1)
Expand All @@ -2931,7 +2971,7 @@ extension BrowserViewController: TabManagerDelegate {
let closeTabMenu = UIMenu(title: "", options: .displayInline, children: closeTabMenuChildren)

toolbar?.tabsButton.menu = UIMenu(title: "", identifier: nil, children: [closeTabMenu, duplicateTabMenu, bookmarkMenu, newTabMenu])
topToolbar?.tabsButton.menu = UIMenu(title: "", identifier: nil, children: [closeTabMenu, duplicateTabMenu, bookmarkMenu, newTabMenu])
topToolbar.tabsButton.menu = UIMenu(title: "", identifier: nil, children: [closeTabMenu, duplicateTabMenu, bookmarkMenu, newTabMenu])

// Update Actions for Add-Tab Button
toolbar?.addTabButton.menu = UIMenu(title: "", identifier: nil, children: [addTabMenu])
Expand Down

0 comments on commit 0f1ec7e

Please # to comment.