Several Improvements

This commit is contained in:
automactic 2016-05-15 10:52:54 -04:00
parent bd429fa1f4
commit 4cc59ab187
12 changed files with 104 additions and 24 deletions

View File

@ -103,6 +103,8 @@
97C11F961C6D1F120048C867 /* LibraryTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C11F951C6D1F120048C867 /* LibraryTabBarController.swift */; }; 97C11F961C6D1F120048C867 /* LibraryTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C11F951C6D1F120048C867 /* LibraryTabBarController.swift */; };
97CCC4E81C1F0D970041DAEE /* BarButtonItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97CCC4E71C1F0D970041DAEE /* BarButtonItems.swift */; }; 97CCC4E81C1F0D970041DAEE /* BarButtonItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97CCC4E71C1F0D970041DAEE /* BarButtonItems.swift */; };
97DA06C71CB6DA3400EBA609 /* LibraryLocalBookDetailTBVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DA06C61CB6DA3400EBA609 /* LibraryLocalBookDetailTBVC.swift */; }; 97DA06C71CB6DA3400EBA609 /* LibraryLocalBookDetailTBVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DA06C61CB6DA3400EBA609 /* LibraryLocalBookDetailTBVC.swift */; };
97DF23551CE807A1003E1E5A /* GlobalOperationQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF23541CE807A1003E1E5A /* GlobalOperationQueue.swift */; };
97DF23571CE8083C003E1E5A /* LibraryScanOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97DF23561CE8083C003E1E5A /* LibraryScanOperation.swift */; };
97E067241C52980F0079C13C /* MainVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E067231C52980F0079C13C /* MainVC.swift */; }; 97E067241C52980F0079C13C /* MainVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E067231C52980F0079C13C /* MainVC.swift */; };
97E067261C52AA000079C13C /* MainVCWebViewD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E067251C52AA000079C13C /* MainVCWebViewD.swift */; }; 97E067261C52AA000079C13C /* MainVCWebViewD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E067251C52AA000079C13C /* MainVCWebViewD.swift */; };
97E067281C52AC360079C13C /* MainVCOtherD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E067271C52AC360079C13C /* MainVCOtherD.swift */; }; 97E067281C52AC360079C13C /* MainVCOtherD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E067271C52AC360079C13C /* MainVCOtherD.swift */; };
@ -289,6 +291,8 @@
97C11F951C6D1F120048C867 /* LibraryTabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryTabBarController.swift; sourceTree = "<group>"; }; 97C11F951C6D1F120048C867 /* LibraryTabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryTabBarController.swift; sourceTree = "<group>"; };
97CCC4E71C1F0D970041DAEE /* BarButtonItems.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarButtonItems.swift; sourceTree = "<group>"; }; 97CCC4E71C1F0D970041DAEE /* BarButtonItems.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BarButtonItems.swift; sourceTree = "<group>"; };
97DA06C61CB6DA3400EBA609 /* LibraryLocalBookDetailTBVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryLocalBookDetailTBVC.swift; sourceTree = "<group>"; }; 97DA06C61CB6DA3400EBA609 /* LibraryLocalBookDetailTBVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryLocalBookDetailTBVC.swift; sourceTree = "<group>"; };
97DF23541CE807A1003E1E5A /* GlobalOperationQueue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlobalOperationQueue.swift; sourceTree = "<group>"; };
97DF23561CE8083C003E1E5A /* LibraryScanOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryScanOperation.swift; sourceTree = "<group>"; };
97E067231C52980F0079C13C /* MainVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainVC.swift; sourceTree = "<group>"; }; 97E067231C52980F0079C13C /* MainVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainVC.swift; sourceTree = "<group>"; };
97E067251C52AA000079C13C /* MainVCWebViewD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainVCWebViewD.swift; sourceTree = "<group>"; }; 97E067251C52AA000079C13C /* MainVCWebViewD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainVCWebViewD.swift; sourceTree = "<group>"; };
97E067271C52AC360079C13C /* MainVCOtherD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainVCOtherD.swift; sourceTree = "<group>"; }; 97E067271C52AC360079C13C /* MainVCOtherD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainVCOtherD.swift; sourceTree = "<group>"; };
@ -822,9 +826,11 @@
97E5712A1CA0525300FF4F1D /* Operation */ = { 97E5712A1CA0525300FF4F1D /* Operation */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
97DF23541CE807A1003E1E5A /* GlobalOperationQueue.swift */,
970103F91C6824FA00DC48F6 /* RefreshLibraryOperation.swift */, 970103F91C6824FA00DC48F6 /* RefreshLibraryOperation.swift */,
97B50C7E1CA1E4810010BD79 /* UIOperations.swift */, 97B50C7E1CA1E4810010BD79 /* UIOperations.swift */,
973970EC1CB9A04C00350507 /* SearchOperation.swift */, 973970EC1CB9A04C00350507 /* SearchOperation.swift */,
97DF23561CE8083C003E1E5A /* LibraryScanOperation.swift */,
); );
name = Operation; name = Operation;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1073,6 +1079,7 @@
97E570FC1CA0500400FF4F1D /* AlertOperation.swift in Sources */, 97E570FC1CA0500400FF4F1D /* AlertOperation.swift in Sources */,
97E5710C1CA0500400FF4F1D /* LocationCapability-iOS.swift in Sources */, 97E5710C1CA0500400FF4F1D /* LocationCapability-iOS.swift in Sources */,
97E571001CA0500400FF4F1D /* CalendarCondition.swift in Sources */, 97E571001CA0500400FF4F1D /* CalendarCondition.swift in Sources */,
97DF23551CE807A1003E1E5A /* GlobalOperationQueue.swift in Sources */,
97E571121CA0500400FF4F1D /* NegatedCondition.swift in Sources */, 97E571121CA0500400FF4F1D /* NegatedCondition.swift in Sources */,
97E571251CA0500400FF4F1D /* TimeoutObserver.swift in Sources */, 97E571251CA0500400FF4F1D /* TimeoutObserver.swift in Sources */,
970103FB1C6824FA00DC48F6 /* RefreshLibraryOperation.swift in Sources */, 970103FB1C6824FA00DC48F6 /* RefreshLibraryOperation.swift in Sources */,
@ -1140,6 +1147,7 @@
9714D8D71C6E5C2600AABCA7 /* LTBarButtonItem.swift in Sources */, 9714D8D71C6E5C2600AABCA7 /* LTBarButtonItem.swift in Sources */,
97E571221CA0500400FF4F1D /* ReachabilityCondition.swift in Sources */, 97E571221CA0500400FF4F1D /* ReachabilityCondition.swift in Sources */,
97E570FE1CA0500400FF4F1D /* BlockOperation.swift in Sources */, 97E570FE1CA0500400FF4F1D /* BlockOperation.swift in Sources */,
97DF23571CE8083C003E1E5A /* LibraryScanOperation.swift in Sources */,
973381631C331D660016CEFB /* ArticleCells.swift in Sources */, 973381631C331D660016CEFB /* ArticleCells.swift in Sources */,
97E571211CA0500400FF4F1D /* PushCapability-OSX.swift in Sources */, 97E571211CA0500400FF4F1D /* PushCapability-OSX.swift in Sources */,
97E571241CA0500400FF4F1D /* SilentCondition.swift in Sources */, 97E571241CA0500400FF4F1D /* SilentCondition.swift in Sources */,

View File

@ -21,11 +21,5 @@ extension UIApplication {
guard settings.types.contains(UIUserNotificationType.Badge) else {return} guard settings.types.contains(UIUserNotificationType.Badge) else {return}
//UIApplication.sharedApplication().applicationIconBadgeNumber = downloader.taskCount ?? 0 //UIApplication.sharedApplication().applicationIconBadgeNumber = downloader.taskCount ?? 0
} }
// MARK: - App Delegate Accessor
class var appDelegate: AppDelegate {
return UIApplication.sharedApplication().delegate as! AppDelegate
}
} }

View File

@ -12,7 +12,7 @@ import UIKit
class Book: NSManagedObject { class Book: NSManagedObject {
// MARK: - Add/Update Book // MARK: - Add Book
class func add(metadata: [String: AnyObject], context: NSManagedObjectContext) -> Book? { class func add(metadata: [String: AnyObject], context: NSManagedObjectContext) -> Book? {
guard let book = insert(Book.self, context: context) else {return nil} guard let book = insert(Book.self, context: context) else {return nil}
@ -44,7 +44,7 @@ class Book: NSManagedObject {
if let favIcon = metadata["favicon"] as? NSData { if let favIcon = metadata["favicon"] as? NSData {
book.favIcon = favIcon book.favIcon = favIcon
} else if let favIcon = metadata["favicon"] as? String { } else if let favIcon = metadata["favicon"] as? String {
book.favIcon = NSData(base64EncodedString: favIcon, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) book.favIcon = NSData(base64EncodedString: favIcon, options: .IgnoreUnknownCharacters)
} }
if let meta4url = book.meta4URL { if let meta4url = book.meta4URL {
@ -89,14 +89,33 @@ class Book: NSManagedObject {
var dateFormatted: String? { var dateFormatted: String? {
guard let date = date else {return nil} guard let date = date else {return nil}
return Utilities.formattedDateStringFromDate(date)
let formatter = NSDateFormatter()
formatter.dateFormat = "MM-dd-yyyy"
formatter.dateStyle = .MediumStyle
return formatter.stringFromDate(date)
} }
var fileSizeFormatted: String? { var fileSizeFormatted: String? {
return Utilities.formattedFileSizeStringFromByteCount(fileSize) return NSByteCountFormatter.stringFromByteCount(fileSize, countStyle: .File)
} }
var articleCountFormatted: String? { var articleCountFormatted: String? {
func formattedNumberStringFromDouble(num: Double) -> String {
let sign = ((num < 0) ? "-" : "" )
let abs = fabs(num)
guard abs >= 1000.0 else {
if abs - Double(Int(abs)) == 0 {
return "\(sign)\(Int(abs))"
} else {
return "\(sign)\(abs)"
}
}
let exp: Int = Int(log10(abs) / log10(1000))
let units: [String] = ["K","M","G","T","P","E"]
let roundedNum: Double = round(10 * abs / pow(1000.0,Double(exp))) / 10;
return "\(sign)\(roundedNum)\(units[exp-1])"
}
return Utilities.formattedNumberStringFromDouble(Double(articleCount)) + (articleCount >= 1 ? " articles" : " article") return Utilities.formattedNumberStringFromDouble(Double(articleCount)) + (articleCount >= 1 ? " articles" : " article")
} }
@ -143,8 +162,6 @@ class Book: NSManagedObject {
} }
} }
// MARK: - States // MARK: - States
var spaceState: BookSpaceState { var spaceState: BookSpaceState {

View File

@ -10,6 +10,14 @@ import Foundation
import CoreData import CoreData
import UIKit import UIKit
// MARK: - App Delegate Accessor
extension UIApplication {
class var appDelegate: AppDelegate {
return UIApplication.sharedApplication().delegate as! AppDelegate
}
}
// MARK: - UI // MARK: - UI
extension UIStoryboard { extension UIStoryboard {

View File

@ -0,0 +1,18 @@
//
// GlobalOperationQueue.swift
// Kiwix
//
// Created by Chris Li on 5/14/16.
// Copyright © 2016 Chris. All rights reserved.
//
import UIKit
class GlobalOperationQueue: OperationQueue {
static let sharedInstance = GlobalOperationQueue()
var isRefreshingLibrary: Bool {
let op = operation(String(RefreshLibraryOperation))
return op != nil
}
}

View File

@ -32,11 +32,11 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.5</string> <string>1.5.1</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>201605091</string> <string>1</string>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
<false/> <false/>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>

View File

@ -102,7 +102,7 @@ class LibraryOnlineTBVC: UITableViewController, NSFetchedResultsControllerDelega
configureMessage() configureMessage()
configureRotatingStatus() configureRotatingStatus()
configureEmptyTableBackground() configureEmptyTableBackground()
UIApplication.globalOperationQueue.addOperation(refreshOperation) GlobalOperationQueue.sharedInstance.addOperation(refreshOperation)
} }
// MARK: - ToolBar Button // MARK: - ToolBar Button

View File

@ -0,0 +1,13 @@
//
// LibraryScanOperation.swift
// Kiwix
//
// Created by Chris Li on 5/14/16.
// Copyright © 2016 Chris. All rights reserved.
//
import UIKit
class LibraryScanOperation: Operation {
}

View File

@ -45,5 +45,23 @@
<string>%d download tasks</string> <string>%d download tasks</string>
</dict> </dict>
</dict> </dict>
<key>%d articles</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@articles@</string>
<key>articles</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>zero</key>
<string>No download task</string>
<key>one</key>
<string>%d download task</string>
<key>other</key>
<string>%d download tasks</string>
</dict>
</dict>
</dict> </dict>
</plist> </plist>

View File

@ -23,7 +23,7 @@ class Network: NSObject, NSURLSessionDelegate, NSURLSessionDownloadDelegate, NSU
lazy var session: NSURLSession = { lazy var session: NSURLSession = {
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("org.kiwix.www") let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("org.kiwix.www")
configuration.allowsCellularAccess = false configuration.allowsCellularAccess = false
configuration.discretionary = true configuration.discretionary = false
return NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil) return NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
}() }()

View File

@ -31,19 +31,19 @@ extension Utilities {
return formatter.stringFromNumber(number) return formatter.stringFromNumber(number)
} }
class func formattedNumberStringFromDouble(var num: Double) -> String { class func formattedNumberStringFromDouble(num: Double) -> String {
let sign = ((num < 0) ? "-" : "" ) let sign = ((num < 0) ? "-" : "" )
num = fabs(num) let abs = fabs(num)
guard num >= 1000.0 else { guard abs >= 1000.0 else {
if num - Double(Int(num)) == 0 { if abs - Double(Int(abs)) == 0 {
return "\(sign)\(Int(num))" return "\(sign)\(Int(abs))"
} else { } else {
return "\(sign)\(num)" return "\(sign)\(abs)"
} }
} }
let exp: Int = Int(log10(num) / log10(1000)) let exp: Int = Int(log10(abs) / log10(1000))
let units: [String] = ["K","M","G","T","P","E"] let units: [String] = ["K","M","G","T","P","E"]
let roundedNum: Double = round(10 * num / pow(1000.0,Double(exp))) / 10; let roundedNum: Double = round(10 * abs / pow(1000.0,Double(exp))) / 10;
return "\(sign)\(roundedNum)\(units[exp-1])" return "\(sign)\(roundedNum)\(units[exp-1])"
} }

View File

@ -11,6 +11,10 @@ What you need:
1. Make sure Xcode is at least launched once and commnad line tool is installed 1. Make sure Xcode is at least launched once and commnad line tool is installed
2. Install Macports 2. Install Macports
3. sudo port install autoconf automake libtool 3. sudo port install autoconf automake libtool
<!--HomeBrew:
* brew install autoconf automake libtool gettext
* brew link --force gettext-->
### Compile xz-5.2.2 ### Compile xz-5.2.2
1. Download xz-5.2.2 1. Download xz-5.2.2