From 097091936410dc37bf126dea83f12a25832c19ea Mon Sep 17 00:00:00 2001 From: Dwayne Harris Date: Sat, 6 Oct 2018 01:10:00 -0700 Subject: [PATCH] Development --- elpha-ios.xcodeproj/project.pbxproj | 149 +++++- .../Contents.json | 5 +- .../Boost Bold.imageset/Repeat-Boost-Bold.pdf | Bin 0 -> 3909 bytes .../Boost Regular.imageset/Contents.json | 12 + .../Repeat-Boost-Regular.pdf | Bin 0 -> 3909 bytes .../toot.pdf => Clock.imageset/Clock.pdf} | Bin 4139 -> 3900 bytes .../Clock.imageset/Contents.json | 12 + .../Compose.imageset/Contents.json | 12 + .../Compose.imageset/Feather-Compose.pdf | Bin 0 -> 3946 bytes .../Down.imageset/Contents.json | 12 + .../Down.imageset/chevron-down.pdf | Bin 0 -> 3840 bytes .../Message.imageset/Contents.json | 12 + .../Message.imageset/Message-Reply.pdf | Bin 0 -> 3894 bytes .../Star Filled.imageset/Contents.json | 12 + .../Star-Favorite-Fill.pdf | Bin 0 -> 3978 bytes .../Star Regular.imageset/Contents.json | 12 + .../Star Regular.imageset/Star-Favorite.pdf | Bin 0 -> 3888 bytes .../Assets.xcassets/Up.imageset/Contents.json | 12 + .../Up.imageset/chevron-up.pdf | Bin 0 -> 3843 bytes elpha-ios/AuthenticationManager.swift | 1 - elpha-ios/Base.lproj/Main.storyboard | 490 +++++++++++++++--- elpha-ios/Date+TimeAgo.swift | 28 +- .../Elpha.xcdatamodel/contents | 4 +- elpha-ios/InstanceViewController.swift | 1 - elpha-ios/InstancesDataManager.swift | 1 - elpha-ios/InstancesTableViewCell.swift | 1 - elpha-ios/MastodonDataManager.swift | 49 +- elpha-ios/TimelineTableViewCell.swift | 24 +- elpha-ios/TimelineTableViewController.swift | 126 ++++- elpha-ios/TimelineViewController.swift | 24 - elpha-ios/TimelinesNavigationController.swift | 2 +- 31 files changed, 853 insertions(+), 148 deletions(-) rename elpha-ios/Assets.xcassets/{Toot.imageset => Boost Bold.imageset}/Contents.json (54%) create mode 100644 elpha-ios/Assets.xcassets/Boost Bold.imageset/Repeat-Boost-Bold.pdf create mode 100644 elpha-ios/Assets.xcassets/Boost Regular.imageset/Contents.json create mode 100644 elpha-ios/Assets.xcassets/Boost Regular.imageset/Repeat-Boost-Regular.pdf rename elpha-ios/Assets.xcassets/{Toot.imageset/toot.pdf => Clock.imageset/Clock.pdf} (80%) create mode 100644 elpha-ios/Assets.xcassets/Clock.imageset/Contents.json create mode 100644 elpha-ios/Assets.xcassets/Compose.imageset/Contents.json create mode 100644 elpha-ios/Assets.xcassets/Compose.imageset/Feather-Compose.pdf create mode 100644 elpha-ios/Assets.xcassets/Down.imageset/Contents.json create mode 100644 elpha-ios/Assets.xcassets/Down.imageset/chevron-down.pdf create mode 100644 elpha-ios/Assets.xcassets/Message.imageset/Contents.json create mode 100644 elpha-ios/Assets.xcassets/Message.imageset/Message-Reply.pdf create mode 100644 elpha-ios/Assets.xcassets/Star Filled.imageset/Contents.json create mode 100644 elpha-ios/Assets.xcassets/Star Filled.imageset/Star-Favorite-Fill.pdf create mode 100644 elpha-ios/Assets.xcassets/Star Regular.imageset/Contents.json create mode 100644 elpha-ios/Assets.xcassets/Star Regular.imageset/Star-Favorite.pdf create mode 100644 elpha-ios/Assets.xcassets/Up.imageset/Contents.json create mode 100644 elpha-ios/Assets.xcassets/Up.imageset/chevron-up.pdf delete mode 100644 elpha-ios/TimelineViewController.swift diff --git a/elpha-ios.xcodeproj/project.pbxproj b/elpha-ios.xcodeproj/project.pbxproj index 82494d5..7170079 100644 --- a/elpha-ios.xcodeproj/project.pbxproj +++ b/elpha-ios.xcodeproj/project.pbxproj @@ -7,6 +7,14 @@ objects = { /* Begin PBXBuildFile section */ + 151AD4D8216899AD00F07403 /* AlamofireImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1517EA842159D72200DE80D6 /* AlamofireImage.framework */; }; + 151AD4D9216899AD00F07403 /* AlamofireImage.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1517EA842159D72200DE80D6 /* AlamofireImage.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 151AD4DD216899E000F07403 /* OAuthSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15A79B13215B438C007A326E /* OAuthSwift.framework */; }; + 151AD4DE216899E000F07403 /* OAuthSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 15A79B13215B438C007A326E /* OAuthSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 151AD4E1216899F900F07403 /* MastodonKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15A79B02215B3CC5007A326E /* MastodonKit.framework */; }; + 151AD4E2216899F900F07403 /* MastodonKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 15A79B02215B3CC5007A326E /* MastodonKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 151AD4E521689A0F00F07403 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 157405C3215890BC00EEAAEB /* Alamofire.framework */; }; + 151AD4E621689A0F00F07403 /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 157405C3215890BC00EEAAEB /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 157405A82150588A00EEAAEB /* InstanceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 157405A72150588A00EEAAEB /* InstanceViewController.swift */; }; 157405B12151A5DA00EEAAEB /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 157405AF2151A5DA00EEAAEB /* README.md */; }; 157405B42151A93E00EEAAEB /* InstancesDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 157405B32151A93E00EEAAEB /* InstancesDataManager.swift */; }; @@ -26,7 +34,6 @@ 15960E7A2132387A00C38CE9 /* MainTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15960E792132387A00C38CE9 /* MainTabBarController.swift */; }; 15960E7C213272CD00C38CE9 /* AuthenticationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15960E7B213272CD00C38CE9 /* AuthenticationManager.swift */; }; 15960E7E21329FED00C38CE9 /* AuthenticateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15960E7D21329FED00C38CE9 /* AuthenticateViewController.swift */; }; - 15960E8021353DCF00C38CE9 /* TimelineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15960E7F21353DCF00C38CE9 /* TimelineViewController.swift */; }; 15960E822136668500C38CE9 /* TimelinesNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15960E812136668500C38CE9 /* TimelinesNavigationController.swift */; }; 15960E84213774FC00C38CE9 /* InstancesTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15960E83213774FC00C38CE9 /* InstancesTableViewController.swift */; }; 15A79B07215B3CD5007A326E /* MastodonKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15A79B02215B3CC5007A326E /* MastodonKit.framework */; }; @@ -94,6 +101,34 @@ remoteGlobalIDString = 4C11830B2150517E007A8298; remoteInfo = "iOS Example"; }; + 151AD4DA216899AD00F07403 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1517EA6F2159D72200DE80D6 /* AlamofireImage.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 4C9043761AABBFC5001B4E60; + remoteInfo = "AlamofireImage iOS"; + }; + 151AD4DF216899E000F07403 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = F43502791A6791B200038A29; + remoteInfo = OAuthSwift; + }; + 151AD4E3216899F900F07403 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 15A79AE7215B3CC5007A326E /* MastodonKit.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 629A4ACC213AF5B100A6386E; + remoteInfo = "MastodonKit-iOS"; + }; + 151AD4E721689A0F00F07403 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 157405B7215890BC00EEAAEB /* Alamofire.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = F8111E3219A95C8B0040E7D1; + remoteInfo = "Alamofire iOS"; + }; 157405C2215890BC00EEAAEB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 157405B7215890BC00EEAAEB /* Alamofire.xcodeproj */; @@ -222,6 +257,23 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 151AD4DC216899AD00F07403 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 151AD4DE216899E000F07403 /* OAuthSwift.framework in Embed Frameworks */, + 151AD4D9216899AD00F07403 /* AlamofireImage.framework in Embed Frameworks */, + 151AD4E2216899F900F07403 /* MastodonKit.framework in Embed Frameworks */, + 151AD4E621689A0F00F07403 /* Alamofire.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 1517EA6F2159D72200DE80D6 /* AlamofireImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = AlamofireImage.xcodeproj; path = Frameworks/AlamofireImage/AlamofireImage.xcodeproj; sourceTree = ""; }; 157405A72150588A00EEAAEB /* InstanceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstanceViewController.swift; sourceTree = ""; }; @@ -245,7 +297,6 @@ 15960E792132387A00C38CE9 /* MainTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabBarController.swift; sourceTree = ""; }; 15960E7B213272CD00C38CE9 /* AuthenticationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationManager.swift; sourceTree = ""; }; 15960E7D21329FED00C38CE9 /* AuthenticateViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticateViewController.swift; sourceTree = ""; }; - 15960E7F21353DCF00C38CE9 /* TimelineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineViewController.swift; sourceTree = ""; }; 15960E812136668500C38CE9 /* TimelinesNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelinesNavigationController.swift; sourceTree = ""; }; 15960E83213774FC00C38CE9 /* InstancesTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstancesTableViewController.swift; sourceTree = ""; }; 15A79AE7215B3CC5007A326E /* MastodonKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MastodonKit.xcodeproj; path = Frameworks/MastodonKit/MastodonKit.xcodeproj; sourceTree = ""; }; @@ -261,9 +312,13 @@ buildActionMask = 2147483647; files = ( 15A79B2E215C63B6007A326E /* AlamofireImage.framework in Frameworks */, + 151AD4D8216899AD00F07403 /* AlamofireImage.framework in Frameworks */, + 151AD4DD216899E000F07403 /* OAuthSwift.framework in Frameworks */, + 151AD4E1216899F900F07403 /* MastodonKit.framework in Frameworks */, 15A79B20215B439A007A326E /* OAuthSwift.framework in Frameworks */, 15A79B07215B3CD5007A326E /* MastodonKit.framework in Frameworks */, 157405D1215890D700EEAAEB /* Alamofire.framework in Frameworks */, + 151AD4E521689A0F00F07403 /* Alamofire.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -285,6 +340,50 @@ name = Products; sourceTree = ""; }; + 151AD4AB2166DCEE00F07403 /* Storyboards */ = { + isa = PBXGroup; + children = ( + 15960E60213145E100C38CE9 /* Main.storyboard */, + 15960E65213145E200C38CE9 /* LaunchScreen.storyboard */, + ); + name = Storyboards; + sourceTree = ""; + }; + 151AD4AC2166DD0200F07403 /* Managers */ = { + isa = PBXGroup; + children = ( + 15960E7B213272CD00C38CE9 /* AuthenticationManager.swift */, + 15A79B42215EB959007A326E /* CoreDataManager.swift */, + 157405B32151A93E00EEAAEB /* InstancesDataManager.swift */, + 15F998342162C0E8009E58DA /* MastodonDataManager.swift */, + ); + name = Managers; + sourceTree = ""; + }; + 151AD4AD2166DD1B00F07403 /* Reusable Views */ = { + isa = PBXGroup; + children = ( + ); + name = "Reusable Views"; + sourceTree = ""; + }; + 151AD4AE2166DD3500F07403 /* Views */ = { + isa = PBXGroup; + children = ( + 159048AE214F5015004F4014 /* InstancesTableViewCell.swift */, + 159026AD2162CF5600D362DD /* TimelineTableViewCell.swift */, + ); + name = Views; + sourceTree = ""; + }; + 151AD4AF2166DDA000F07403 /* Extensions */ = { + isa = PBXGroup; + children = ( + 159026CF2163069600D362DD /* Date+TimeAgo.swift */, + ); + name = Extensions; + sourceTree = ""; + }; 157405B8215890BC00EEAAEB /* Products */ = { isa = PBXGroup; children = ( @@ -333,18 +432,16 @@ children = ( 15960E68213145E200C38CE9 /* Info.plist */, 15960E5A213145E100C38CE9 /* AppDelegate.swift */, - 15960E7B213272CD00C38CE9 /* AuthenticationManager.swift */, 15960E7621322C6F00C38CE9 /* Configuration.swift */, - 15A79B42215EB959007A326E /* CoreDataManager.swift */, - 159026CF2163069600D362DD /* Date+TimeAgo.swift */, - 157405B32151A93E00EEAAEB /* InstancesDataManager.swift */, - 15F998342162C0E8009E58DA /* MastodonDataManager.swift */, 15960E63213145E200C38CE9 /* Assets.xcassets */, 15960E6E21321FA500C38CE9 /* Elpha.xcdatamodeld */, + 151AD4AF2166DDA000F07403 /* Extensions */, 15960E7121322B9F00C38CE9 /* Keychain Helper */, - 15960E65213145E200C38CE9 /* LaunchScreen.storyboard */, - 15960E60213145E100C38CE9 /* Main.storyboard */, + 151AD4AC2166DD0200F07403 /* Managers */, + 151AD4AD2166DD1B00F07403 /* Reusable Views */, + 151AD4AB2166DCEE00F07403 /* Storyboards */, 15960E782132383600C38CE9 /* View Controllers */, + 151AD4AE2166DD3500F07403 /* Views */, ); path = "elpha-ios"; sourceTree = ""; @@ -362,15 +459,12 @@ isa = PBXGroup; children = ( 15960E7D21329FED00C38CE9 /* AuthenticateViewController.swift */, - 159048AE214F5015004F4014 /* InstancesTableViewCell.swift */, 15960E83213774FC00C38CE9 /* InstancesTableViewController.swift */, 157405A72150588A00EEAAEB /* InstanceViewController.swift */, 15960E792132387A00C38CE9 /* MainTabBarController.swift */, 15960E5E213145E100C38CE9 /* SecondViewController.swift */, 15960E812136668500C38CE9 /* TimelinesNavigationController.swift */, - 159026AD2162CF5600D362DD /* TimelineTableViewCell.swift */, 15F9981621629965009E58DA /* TimelineTableViewController.swift */, - 15960E7F21353DCF00C38CE9 /* TimelineViewController.swift */, ); name = "View Controllers"; sourceTree = ""; @@ -410,10 +504,15 @@ 15960E53213145E100C38CE9 /* Sources */, 15960E54213145E100C38CE9 /* Frameworks */, 15960E55213145E100C38CE9 /* Resources */, + 151AD4DC216899AD00F07403 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( + 151AD4DB216899AD00F07403 /* PBXTargetDependency */, + 151AD4E0216899E000F07403 /* PBXTargetDependency */, + 151AD4E4216899F900F07403 /* PBXTargetDependency */, + 151AD4E821689A0F00F07403 /* PBXTargetDependency */, ); name = "elpha-ios"; productName = "elpha-ios"; @@ -683,7 +782,6 @@ 157405B42151A93E00EEAAEB /* InstancesDataManager.swift in Sources */, 15960E5F213145E100C38CE9 /* SecondViewController.swift in Sources */, 15F998352162C0E8009E58DA /* MastodonDataManager.swift in Sources */, - 15960E8021353DCF00C38CE9 /* TimelineViewController.swift in Sources */, 15960E7A2132387A00C38CE9 /* MainTabBarController.swift in Sources */, 15960E7C213272CD00C38CE9 /* AuthenticationManager.swift in Sources */, 15960E7E21329FED00C38CE9 /* AuthenticateViewController.swift in Sources */, @@ -701,6 +799,29 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 151AD4DB216899AD00F07403 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "AlamofireImage iOS"; + targetProxy = 151AD4DA216899AD00F07403 /* PBXContainerItemProxy */; + }; + 151AD4E0216899E000F07403 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = OAuthSwift; + targetProxy = 151AD4DF216899E000F07403 /* PBXContainerItemProxy */; + }; + 151AD4E4216899F900F07403 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "MastodonKit-iOS"; + targetProxy = 151AD4E3216899F900F07403 /* PBXContainerItemProxy */; + }; + 151AD4E821689A0F00F07403 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Alamofire iOS"; + targetProxy = 151AD4E721689A0F00F07403 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 15960E60213145E100C38CE9 /* Main.storyboard */ = { isa = PBXVariantGroup; @@ -838,6 +959,7 @@ 15960E6C213145E200C38CE9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = R9PMLQGTGZ; @@ -857,6 +979,7 @@ 15960E6D213145E200C38CE9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = R9PMLQGTGZ; diff --git a/elpha-ios/Assets.xcassets/Toot.imageset/Contents.json b/elpha-ios/Assets.xcassets/Boost Bold.imageset/Contents.json similarity index 54% rename from elpha-ios/Assets.xcassets/Toot.imageset/Contents.json rename to elpha-ios/Assets.xcassets/Boost Bold.imageset/Contents.json index 64c7edd..630d6e5 100644 --- a/elpha-ios/Assets.xcassets/Toot.imageset/Contents.json +++ b/elpha-ios/Assets.xcassets/Boost Bold.imageset/Contents.json @@ -2,14 +2,11 @@ "images" : [ { "idiom" : "universal", - "filename" : "toot.pdf" + "filename" : "Repeat-Boost-Bold.pdf" } ], "info" : { "version" : 1, "author" : "xcode" - }, - "properties" : { - "preserves-vector-representation" : true } } \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Boost Bold.imageset/Repeat-Boost-Bold.pdf b/elpha-ios/Assets.xcassets/Boost Bold.imageset/Repeat-Boost-Bold.pdf new file mode 100644 index 0000000000000000000000000000000000000000..90ad8c92822fcf8d83e1878391ebe0e59a22e83a GIT binary patch literal 3909 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 H8iW4>0bre& literal 0 HcmV?d00001 diff --git a/elpha-ios/Assets.xcassets/Toot.imageset/toot.pdf b/elpha-ios/Assets.xcassets/Clock.imageset/Clock.pdf similarity index 80% rename from elpha-ios/Assets.xcassets/Toot.imageset/toot.pdf rename to elpha-ios/Assets.xcassets/Clock.imageset/Clock.pdf index c49de6fdefc979db60ded186fb9107d95a3bb7df..744eaf21e5eb115ce633c476d93288862a269144 100644 GIT binary patch delta 495 zcmZ3jut#n}K)tWOwb&s8p4-)2u?WmG+Vw0Wtr6$kdH;GR*GfhjhG&4*xNi|I|N;XeQ zG%~SBHncP_PD)8Lw@kF-vLUEMAy&c8j;pvNv8be?C^e1C*u=t^OI6j?-;E0Z(|w$b delta 721 zcmdlZw_0IBKz(dbblwvKp5Na!OBzdcZ(e&`?SEmtt;2;ytjkz$?X(X#Wqfi;_mjiR zT)IU5xSs#ws=usW7RDGlP;H$O9qkPfLIhPgt7p;_9V$`={d5BPgt#aGyBBf^a-$HjMZf%p+ zzrJA_^LA~?=(%de36{S%eyEQ-!m>Iyf`!pI_%P$mj~WIK9X8CpbIq~&W?=P(UZ%Q? zbnnfJyT0+UuD;j)xOa|#=t1k-l{by=Y_!O@+y7KUFZ$H63s#;xS`uv4pP2o6;P`sp znh$r4ml&~ehke(+;pF%5|Lw4MALMI;R!7}?`SShL%-xS3J}tld;{2KY>;M05jnjSk zll@ZGT6M0}yp-aSqSVA(5Gy|^i_28OKmkM>TN=QGj3(#vh;CM3EaPS|RWLH0Jd0-z zmw|Vqu0ZXJBf9 zsoofiIy2MBU3~IJP!mlJjL=OoHZ{c*Gcz!qJfF`l-o(^6DJjXq&?q(8#5B>+JSD}# xAko0mz}zq?(abE>+>XnJpb~{x1v@*g;*!Lol8U0#G%jOvBO@+VRabvEE&$4C67>K8 diff --git a/elpha-ios/Assets.xcassets/Clock.imageset/Contents.json b/elpha-ios/Assets.xcassets/Clock.imageset/Contents.json new file mode 100644 index 0000000..7d2c86b --- /dev/null +++ b/elpha-ios/Assets.xcassets/Clock.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Clock.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Compose.imageset/Contents.json b/elpha-ios/Assets.xcassets/Compose.imageset/Contents.json new file mode 100644 index 0000000..0d73062 --- /dev/null +++ b/elpha-ios/Assets.xcassets/Compose.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Feather-Compose.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Compose.imageset/Feather-Compose.pdf b/elpha-ios/Assets.xcassets/Compose.imageset/Feather-Compose.pdf new file mode 100644 index 0000000000000000000000000000000000000000..70083485e40df0a563edcdce219fde3c64851b99 GIT binary patch literal 3946 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 literal 0 HcmV?d00001 diff --git a/elpha-ios/Assets.xcassets/Down.imageset/Contents.json b/elpha-ios/Assets.xcassets/Down.imageset/Contents.json new file mode 100644 index 0000000..f994b75 --- /dev/null +++ b/elpha-ios/Assets.xcassets/Down.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "chevron-down.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Down.imageset/chevron-down.pdf b/elpha-ios/Assets.xcassets/Down.imageset/chevron-down.pdf new file mode 100644 index 0000000000000000000000000000000000000000..833821cfb18a7344b2c8fb83be0741ce4c4712ad GIT binary patch literal 3840 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 literal 0 HcmV?d00001 diff --git a/elpha-ios/Assets.xcassets/Star Filled.imageset/Contents.json b/elpha-ios/Assets.xcassets/Star Filled.imageset/Contents.json new file mode 100644 index 0000000..8feb28a --- /dev/null +++ b/elpha-ios/Assets.xcassets/Star Filled.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Star-Favorite-Fill.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Star Filled.imageset/Star-Favorite-Fill.pdf b/elpha-ios/Assets.xcassets/Star Filled.imageset/Star-Favorite-Fill.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d472b6bddf013e1722a6c2b28a4635daa032dc0e GIT binary patch literal 3978 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 literal 0 HcmV?d00001 diff --git a/elpha-ios/Assets.xcassets/Up.imageset/Contents.json b/elpha-ios/Assets.xcassets/Up.imageset/Contents.json new file mode 100644 index 0000000..322d43e --- /dev/null +++ b/elpha-ios/Assets.xcassets/Up.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "chevron-up.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Up.imageset/chevron-up.pdf b/elpha-ios/Assets.xcassets/Up.imageset/chevron-up.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d40fcb7957a5e3fb30c6876db899ee3cc85b5d00 GIT binary patch literal 3843 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 - + - - + + - + - - - - - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + - - - - - - - - - - - + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -654,6 +1001,7 @@ + @@ -690,10 +1038,16 @@ + + + + + + diff --git a/elpha-ios/Date+TimeAgo.swift b/elpha-ios/Date+TimeAgo.swift index 068a409..bb2c9ba 100644 --- a/elpha-ios/Date+TimeAgo.swift +++ b/elpha-ios/Date+TimeAgo.swift @@ -20,58 +20,58 @@ extension Date { if let year = components.year { if (year >= 2) { - return "\(year)y" + return "\(year) years" } else if (year >= 1) { - return "1y" + return "last year" } } if let month = components.month { if (month >= 2) { - return "\(month)m" + return "\(month) months" } else if (month >= 1) { - return "1m" + return "last month" } } if let weekOfMonth = components.weekOfMonth { if (weekOfMonth >= 2) { - return "\(weekOfMonth)w" + return "\(weekOfMonth) weeks" } else if (weekOfMonth >= 1) { - return "1w" + return "last week" } } if let day = components.day { if (day >= 2) { - return "\(day)d" + return "\(day) days" } else if (day >= 1) { - return "1d" + return "yesterday" } } if let hour = components.hour { if (hour >= 2) { - return "\(hour)h" + return "\(hour) hours" } else if (hour >= 1) { - return "1h" + return "an hour ago" } } if let minute = components.minute { if (minute >= 2) { - return "\(minute)m" + return "\(minute) mins" } else if (minute >= 1) { - return "1m" + return "a minute ago" } } if let second = components.second { if (second >= 3) { - return "\(second)s" + return "\(second) seconds" } } - return "Now" + return "just now" } } diff --git a/elpha-ios/Elpha.xcdatamodeld/Elpha.xcdatamodel/contents b/elpha-ios/Elpha.xcdatamodeld/Elpha.xcdatamodel/contents index bb84272..1b0e1b5 100644 --- a/elpha-ios/Elpha.xcdatamodeld/Elpha.xcdatamodel/contents +++ b/elpha-ios/Elpha.xcdatamodeld/Elpha.xcdatamodel/contents @@ -125,6 +125,8 @@ + + @@ -156,7 +158,7 @@ - + diff --git a/elpha-ios/InstanceViewController.swift b/elpha-ios/InstanceViewController.swift index 85ad6b3..3aab039 100644 --- a/elpha-ios/InstanceViewController.swift +++ b/elpha-ios/InstanceViewController.swift @@ -7,7 +7,6 @@ // import AlamofireImage -import Foundation import UIKit import SafariServices diff --git a/elpha-ios/InstancesDataManager.swift b/elpha-ios/InstancesDataManager.swift index ccb52b7..f5e76a9 100644 --- a/elpha-ios/InstancesDataManager.swift +++ b/elpha-ios/InstancesDataManager.swift @@ -8,7 +8,6 @@ import Alamofire import CoreData -import Foundation import UIKit class InstancesDataManager { diff --git a/elpha-ios/InstancesTableViewCell.swift b/elpha-ios/InstancesTableViewCell.swift index c79a9ea..5d77ed8 100644 --- a/elpha-ios/InstancesTableViewCell.swift +++ b/elpha-ios/InstancesTableViewCell.swift @@ -7,7 +7,6 @@ // import AlamofireImage -import Foundation import UIKit class InstancesTableViewCell: UITableViewCell { diff --git a/elpha-ios/MastodonDataManager.swift b/elpha-ios/MastodonDataManager.swift index c2fb168..8389b38 100644 --- a/elpha-ios/MastodonDataManager.swift +++ b/elpha-ios/MastodonDataManager.swift @@ -158,7 +158,7 @@ public class MastodonDataManager { } } - static func upsertStatus(remoteStatus: Status) -> StatusMO? { + static func upsertStatus(_ remoteStatus: Status) -> StatusMO? { func saveStatus(_ status: StatusMO) -> StatusMO? { status.id = remoteStatus.id status.uri = URL(string: remoteStatus.uri) @@ -199,6 +199,11 @@ public class MastodonDataManager { } } + if let reblog = remoteStatus.reblog { + let savedReblog = upsertStatus(reblog) + status.reblog = savedReblog + } + return status } @@ -229,4 +234,46 @@ public class MastodonDataManager { CoreDataManager.shared.saveContext() return client } + + static func getAccountByID(_ id: String) -> AccountMO? { + let request = NSFetchRequest(entityName: "Account") + request.predicate = NSPredicate(format: "id == %@", id) + + do { + let results = try CoreDataManager.shared.getContext().fetch(request) + guard let account = results.first else { + return nil + } + + return account + } catch { + print("\(error)") + return nil + } + } + + static func getRemoteAccountByID(id: String, completion: @escaping (AccountMO?, Error?) -> Void ) { + if let account = getAccountByID(id) { + completion(account, nil) + return + } + + guard let client = AuthenticationManager.shared.getMKClientForSelectedSession() else { + completion(nil, NSError()) + return + } + + let request = Accounts.account(id: id) + + client.run(request) { result in + switch result { + case .success(let account, _): + completion(upsertAccount(account), nil) + return + case .failure(let error): + completion(nil, error) + return + } + } + } } diff --git a/elpha-ios/TimelineTableViewCell.swift b/elpha-ios/TimelineTableViewCell.swift index 06371cd..d75fed7 100644 --- a/elpha-ios/TimelineTableViewCell.swift +++ b/elpha-ios/TimelineTableViewCell.swift @@ -6,13 +6,31 @@ // Copyright © 2018 Elpha. All rights reserved. // -import Foundation import UIKit class TimelineTableViewCell: UITableViewCell { + @IBOutlet var boostView: UIView! + @IBOutlet var boostAvatarImageView: UIImageView! + @IBOutlet var boostDisplayNameLabel: UILabel! + @IBOutlet var boostUsernameLabel: UILabel! + @IBOutlet var replyView: UIView! + @IBOutlet var replyAvatarImageView: UIImageView! + @IBOutlet var replyDisplayNameLabel: UILabel! + @IBOutlet var replyUsernameLabel: UILabel! @IBOutlet var avatarImageView: UIImageView! @IBOutlet var displayNameLabel: UILabel! - @IBOutlet var acctLabel: UILabel! - @IBOutlet var timestampLabel: UILabel! + @IBOutlet var usernameLabel: UILabel! @IBOutlet var contentLabel: UILabel! + @IBOutlet var timestampLabel: UILabel! + @IBOutlet var repliesImageView: UIImageView! + @IBOutlet var repliesLabel: UILabel! + @IBOutlet var boostsImageView: UIImageView! + @IBOutlet var boostsLabel: UILabel! + @IBOutlet var favoritesImageView: UIImageView! + @IBOutlet var favoritesLabel: UILabel! + @IBOutlet var topDividerView: UIView! + @IBOutlet var topLoadMoreView: UIView! + @IBOutlet var bottomDividerView: UIView! + @IBOutlet var bottomLoadMoreView: UIView! + @IBOutlet var attachmentImageView: UIImageView! } diff --git a/elpha-ios/TimelineTableViewController.swift b/elpha-ios/TimelineTableViewController.swift index cc672c0..1ff203e 100644 --- a/elpha-ios/TimelineTableViewController.swift +++ b/elpha-ios/TimelineTableViewController.swift @@ -8,7 +8,6 @@ import AlamofireImage import CoreData -import Foundation import MastodonKit import UIKit @@ -32,10 +31,20 @@ class TimelineTableViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() + let composeButtonItem = UIBarButtonItem(image: UIImage(named: "Compose"), style: .plain, target: self, action: #selector(compose)) + navigationItem.rightBarButtonItem = composeButtonItem + navigationItem.title = "Home" + refreshControl?.addTarget(self, action: #selector(self.fetchTimelineWithDefaultRange), for: .valueChanged) fetchTimelineWithDefaultRange() } + @objc func compose() { + let alertController = UIAlertController(title: "Compose", message: "Toot", preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) + present(alertController, animated: true) + } + func createDefaultTimelines(account: AccountMO) { let context = CoreDataManager.shared.getContext() let timelineNames = [ @@ -62,7 +71,7 @@ class TimelineTableViewController: UITableViewController { DispatchQueue.main.async { let context = CoreDataManager.shared.getContext() let statuses = remoteStatuses.compactMap { status in - return MastodonDataManager.upsertStatus(remoteStatus: status) + return MastodonDataManager.upsertStatus(status) } for (index, status) in statuses.enumerated() { @@ -87,6 +96,7 @@ class TimelineTableViewController: UITableViewController { timeline.addToStatuses(NSSet(array: statuses)) CoreDataManager.shared.saveContext() + self.loading = false self.tableView.reloadData() } case .failure(let error): @@ -123,9 +133,6 @@ class TimelineTableViewController: UITableViewController { } loading = true - defer { - loading = false - } if let selectedTimeline = session.selectedTimeline { var request: Request<[Status]> @@ -183,6 +190,14 @@ class TimelineTableViewController: UITableViewController { return statuses.count } + func getTimelineBoundaries() -> NSSet? { + guard let session = AuthenticationManager.shared.selectedSession, let timeline = session.selectedTimeline else { + return nil + } + + return timeline.boundaries + } + override func numberOfSections(in tableView: UITableView) -> Int { return 1 } @@ -196,23 +211,84 @@ class TimelineTableViewController: UITableViewController { fatalError("Unable to find reusable cell") } + cell.topDividerView.isHidden = false + cell.topLoadMoreView.isHidden = true + cell.boostView.isHidden = true + cell.replyView.isHidden = true + cell.bottomLoadMoreView.isHidden = true + cell.bottomDividerView.isHidden = false + cell.attachmentImageView.isHidden = true + if let statuses = getTimelineStatuses() { let status = statuses[indexPath.row] - if let account = status.account { - let filter = AspectScaledToFillSizeWithRoundedCornersFilter( - size: CGSize(width: 40.0, height: 40.0), - radius: 20.0, - divideRadiusByImageScale: true - ) + let boundaries = getTimelineBoundaries() ?? NSSet() + + let avatarFilter = AspectScaledToFillSizeWithRoundedCornersFilter( + size: CGSize(width: 40.0, height: 40.0), + radius: 20.0, + divideRadiusByImageScale: true + ) + + if indexPath.row != 0 { + if let boundary = boundaries.filtered(using: NSPredicate(format: "statusID = %@", status.id!)).first as? TimelineBoundaryMO { + if boundary.start { + if let previousBoundary = boundaries.filtered(using: NSPredicate(format: "statusID = %@", statuses[indexPath.row - 1])).first as? TimelineBoundaryMO { + if !previousBoundary.start { + cell.topDividerView.isHidden = true + cell.topLoadMoreView.isHidden = false + } + } + } + } + } + + if indexPath.row < statuses.count - 1 { + if let boundary = boundaries.filtered(using: NSPredicate(format: "statusID = %@", status.id!)).first as? TimelineBoundaryMO { + if !boundary.start { + if let nextBoundary = boundaries.filtered(using: NSPredicate(format: "statusID = %@", statuses[indexPath.row + 1])).first as? TimelineBoundaryMO { + if nextBoundary.start { + cell.bottomDividerView.isHidden = true + cell.bottomLoadMoreView.isHidden = false + } + } + } + } + } + + if let reblog = status.reblog { + cell.boostView.isHidden = false - cell.avatarImageView.af_setImage(withURL: account.avatarURL!, filter: filter) - cell.displayNameLabel.text = account.displayName - cell.acctLabel.text = account.acct + if let account = reblog.account { + cell.avatarImageView.af_setImage(withURL: account.avatarURL!, filter: avatarFilter) + cell.displayNameLabel.text = account.displayName + cell.usernameLabel.text = account.acct + } + + if let account = status.account { + cell.boostAvatarImageView.af_setImage(withURL: account.avatarURL!, filter: avatarFilter) + cell.boostDisplayNameLabel.text = account.displayName + cell.boostUsernameLabel.text = account.acct + } + } else { + if let account = status.account { + cell.avatarImageView.af_setImage(withURL: account.avatarURL!, filter: avatarFilter) + cell.displayNameLabel.text = account.displayName + cell.usernameLabel.text = account.acct + } + } + + if let replyAccountID = status.inReplyToAccountID { + if let replyAccount = MastodonDataManager.getAccountByID(replyAccountID) { + cell.replyView.isHidden = false + cell.replyAvatarImageView.af_setImage(withURL: replyAccount.avatarURL!, filter: avatarFilter) + cell.replyDisplayNameLabel.text = replyAccount.displayName + cell.replyUsernameLabel.text = replyAccount.acct + } } if let content = status.content { do { - let styledContent = " \(content)" + let styledContent = " \(content)" let attributedText = try NSAttributedString( data: styledContent.data(using: String.Encoding.unicode, allowLossyConversion: true)!, options: [.documentType: NSAttributedString.DocumentType.html], @@ -225,7 +301,27 @@ class TimelineTableViewController: UITableViewController { } } + if let attachments = status.attachments, let attachment = attachments.anyObject() as? AttachmentMO { + cell.attachmentImageView.isHidden = false + cell.attachmentImageView.af_setImage(withURL: attachment.url!) + } + cell.timestampLabel.text = status.createdAt!.timeAgo() + cell.repliesLabel.text = "0" + cell.boostsLabel.text = NumberFormatter.localizedString(from: NSNumber(value: status.reblogsCount), number: .decimal) + cell.favoritesLabel.text = NumberFormatter.localizedString(from: NSNumber(value: status.favouritesCount), number: .decimal) + + if status.reblogged { + cell.boostsImageView.image = UIImage(named: "Boost Bold") + } else { + cell.boostsImageView.image = UIImage(named: "Boost Regular") + } + + if status.favourited { + cell.favoritesImageView.image = UIImage(named: "Star Filled") + } else { + cell.favoritesImageView.image = UIImage(named: "Star Regular") + } if indexPath.row == statuses.count - 1 && !loading { fetchTimeline(withRange: .max(id: status.id!, limit: fetchLimit)) diff --git a/elpha-ios/TimelineViewController.swift b/elpha-ios/TimelineViewController.swift deleted file mode 100644 index ec9b262..0000000 --- a/elpha-ios/TimelineViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// TimelinesViewController.swift -// elpha-ios -// -// Created by Dwayne Harris on 8/28/18. -// Copyright © 2018 Elpha. All rights reserved. -// - -import UIKit - -class TimelineViewController: UIViewController { - override func viewDidLoad() { - super.viewDidLoad() - - let tootButtonItem = UIBarButtonItem(image: UIImage(named: "Toot"), style: .plain, target: self, action: #selector(compose)) - navigationItem.rightBarButtonItem = tootButtonItem - } - - @objc func compose() { - let alertController = UIAlertController(title: "Compose", message: "Toot", preferredStyle: .alert) - alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) - present(alertController, animated: true) - } -} diff --git a/elpha-ios/TimelinesNavigationController.swift b/elpha-ios/TimelinesNavigationController.swift index 7ed8e53..9f5044e 100644 --- a/elpha-ios/TimelinesNavigationController.swift +++ b/elpha-ios/TimelinesNavigationController.swift @@ -9,5 +9,5 @@ import UIKit class TimelinesNavigationController: UINavigationController { - + }