Skip to content
This repository has been archived by the owner on Nov 26, 2020. It is now read-only.

[WIP] Save last readed position #334

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
33 changes: 19 additions & 14 deletions Source/FolioReaderCenter.swift
Expand Up @@ -157,6 +157,10 @@ open class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UIColl
enableScrollBetweenChapters(scrollEnabled: true)
view.addSubview(collectionView)

if #available(iOS 11.0, *) {
collectionView.contentInsetAdjustmentBehavior = .never
}

// Activity Indicator
self.activityIndicator.activityIndicatorViewStyle = .gray
self.activityIndicator.hidesWhenStopped = true
Expand Down Expand Up @@ -297,15 +301,16 @@ open class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UIColl
self.configureNavBarButtons()
self.setCollectionViewProgressiveDirection()

if self.readerConfig.loadSavedPositionForCurrentBook {
guard let position = folioReader.savedPositionForCurrentBook, let pageNumber = position["pageNumber"] as? Int, pageNumber > 0 else {
self.currentPageNumber = 1
guard readerConfig.loadSavedPositionForCurrentBook,
let position = folioReader.savedPositionForCurrentBook,
let chapterHref = position["chapterHref"] as? String else {
currentPageNumber = 1
return
}

self.changePageWith(page: pageNumber)
self.currentPageNumber = pageNumber
}

let pageNumber = findPageByHref(chapterHref) + 1
changePageWith(page: pageNumber)
currentPageNumber = pageNumber
}

// MARK: Change page progressive direction
Expand Down Expand Up @@ -1368,19 +1373,19 @@ open class FolioReaderCenter: UIViewController, UICollectionViewDelegate, UIColl
extension FolioReaderCenter: FolioReaderPageDelegate {

public func pageDidLoad(_ page: FolioReaderPage) {
if self.readerConfig.loadSavedPositionForCurrentBook, let position = folioReader.savedPositionForCurrentBook {
let pageNumber = position["pageNumber"] as? Int
let offset = self.readerConfig.isDirection(position["pageOffsetY"], position["pageOffsetX"], position["pageOffsetY"]) as? CGFloat
let pageOffset = offset
if readerConfig.loadSavedPositionForCurrentBook, let position = folioReader.savedPositionForCurrentBook {
guard let chapterHref = position["chapterHref"] as? String else { return }
guard let value = position["value"] as? Int else { return }
guard let usingId = position["usingId"] as? Bool else { return }

if isFirstLoad {
updateCurrentPage(page)
isFirstLoad = false

if (self.currentPageNumber == pageNumber && pageOffset > 0) {
page.scrollPageToOffset(pageOffset!, animated: false)
if currentPageNumber == findPageByHref(chapterHref) + 1, let pageOffset = page.getReadingPositionOffset(usingId: usingId, value: value) {
page.scrollPageToOffset(pageOffset, animated: false)
}
} else if (self.isScrolling == false && folioReader.needsRTLChange == true) {
} else if !isScrolling && folioReader.needsRTLChange {
page.scrollPageToBottom()
}
} else if isFirstLoad {
Expand Down
35 changes: 25 additions & 10 deletions Source/FolioReaderKit.swift
Expand Up @@ -338,18 +338,33 @@ extension FolioReader {
guard isReaderOpen else {
return
}

guard let currentPage = self.readerCenter?.currentPage, let webView = currentPage.webView else {
guard let chapterHref = self.readerCenter?.getCurrentChapter()?.href else {
return
}

let position = [
"pageNumber": (self.readerCenter?.currentPageNumber ?? 0),
"pageOffsetX": webView.scrollView.contentOffset.x,
"pageOffsetY": webView.scrollView.contentOffset.y
] as [String : Any]

self.savedPositionForCurrentBook = position

let position = ["chapterHref": chapterHref] as NSMutableDictionary

guard let currentPosition = self.readerCenter?.currentPage?.webView?.js("getLineId(\(self.readerContainer?.readerConfig.scrollDirection == .horizontal))") else {
return

}

let jsonData = currentPosition.data(using: String.Encoding.utf8)

do {
if let data = jsonData {
let json = try JSONSerialization.jsonObject(with: data) as? [String: Any]
if let j = json {
position.setValue(j["value"], forKey: "value")
position.setValue(j["usingId"], forKey: "usingId")
}
}

} catch _ {
print("Doesn't save the current position")
}

self.savedPositionForCurrentBook = position as! [String: Any]
}

/// Closes and save the reader current instance.
Expand Down
16 changes: 16 additions & 0 deletions Source/FolioReaderPage.swift
Expand Up @@ -469,6 +469,22 @@ open class FolioReaderPage: UICollectionViewCell, UIWebViewDelegate, UIGestureRe
return CGFloat(0)
}


/// Get reading position offset
///
/// - Parameters:
/// - usingId: will remove this....
/// - value: The position of <p> tag
/// - Returns: Offset position to scroll to
func getReadingPositionOffset(usingId: Bool, value: Int) -> CGFloat? {
let horizontal = readerConfig.scrollDirection == .horizontal

guard let strOffset = webView?.js("getReadingPositionOffset(\(usingId.description), \(value), \(horizontal.description))"), let number = NumberFormatter().number(from: strOffset) else {
return nil
}
return CGFloat(number)
}

// MARK: Mark ID

/**
Expand Down
64 changes: 59 additions & 5 deletions Source/Resources/Bridge.js
Expand Up @@ -164,6 +164,14 @@ function getReadingTime() {
return readingTimeMinutes;
}

// Get Element offset in the page
var getElementOffset = function(target, horizontal) {
if (horizontal) {
return document.body.clientWidth * Math.floor(target.offsetTop / window.innerHeight);
}
return target.offsetTop;
}

/**
Get Vertical or Horizontal paged #anchor offset
*/
Expand All @@ -174,11 +182,7 @@ var getAnchorOffset = function(target, horizontal) {
elem = document.getElementsByName(target)[0];
}

if (horizontal) {
return document.body.clientWidth * Math.floor(elem.offsetTop / window.innerHeight);
}

return elem.offsetTop;
return getElementOffset(elem, horizontal);
}

function findElementWithID(node) {
Expand Down Expand Up @@ -615,3 +619,53 @@ var onClassBasedListenerClick = function(schemeName, attributeContent) {
// Set the custom link URL to the event
window.location = schemeName + "://" + attributeContent + positionParameterString;
}

//Get Read Position Implementation
function isAfter(el, isHorizontal) {
var rect = el.getBoundingClientRect();

var isAfter;
if(isHorizontal)
isAfter = rect.left > 0;
else
isAfter = rect.top > 0;

return isAfter;
}

function getLineId(isHorizontal){
var lines = document.body.getElementsByTagName("p");
var visibleSpanId = 0;
var visibleLine;

//var orientation = isHorizontal === "true" ? true:false
//var orientation = isHorizontal.length === 4 ? true:false

console.log(isHorizontal === true)

for (var i = 0, max = lines.length; i < max; i++) {
if (isAfter(lines[i], isHorizontal)){
console.log("entrou no if")
visibleSpanId = i;
visibleLine = lines[i]
break;
}
}
var usingId = visibleLine.id != 'undefined' && visibleLine.id != "";

return JSON.stringify({
usingId: usingId,
value: usingId ? visibleLine.id : visibleSpanId
});
}

function getReadingPositionOffset(usingId, value, isHorizontal) {
var elm;
if (usingId) {
elm = document.getElementById(value);
} else {
elm = document.getElementsByTagName("p")[value];
}
return getElementOffset(elm, isHorizontal);
}