// ĠCopyright Ġ( c ) Ġ 2 0 1 5 , ĠIntel ĠCorporation Ċ // ĠAll Ġrights Ġreserved . Ċ // Ċ // ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ // Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ċ // Ġmet : Ċ // Ċ // Ġ 1 . ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ċ // Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ // Ġ 2 . ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ċ // Ġcopyright Ġnotice , Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ċ // Ġin Ġthe Ġdocumentation Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ċ // Ġdistribution . Ċ // Ġ 3 . ĠNeither Ġthe Ġname Ġof Ġthe Ġcopyright Ġholder Ġnor Ġthe Ġnames Ġof Ġits Ċ // Ġcontributors Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ċ // Ġthis Ġsoftware Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ // Ċ // ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ċ // Ġ" AS ĠIS " ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT Ċ // ĠLIMITED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR Ċ // ĠA ĠPARTICULAR ĠPURPOSE ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT Ċ // ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , Ċ // ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT Ċ // ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , Ċ // ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY Ċ // ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ċ // Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE Ċ // ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ċ package Ġorg . moe . kotlin rss reader Ċ Ċ import Ġorg . moe . nat j . general . Pointer Ċ import Ġorg . moe . nat j . objc . SEL Ċ import Ġorg . moe . nat j . objc . ann . Selector Ċ import Ġorg . moe . kotlin rss reader . common . Book marks Ċ import Ġorg . moe . kotlin rss reader . common . RSS Feed Ċ import Ġorg . moe . kotlin rss reader . common . RSS Feed Item Ċ import Ġapple . c . Globals Ċ import Ġapple . core graphics . c . Core Graphics Ċ import Ġapple . core graphics . struct . CG Size Ċ import Ġapple . foundation .* Ċ import Ġapple . foundation . struct . NS Range Ċ import Ġapple . u ikit .* Ċ import Ġapple . u ikit . c . UIKit Ċ import Ġapple . u ikit . enums .* Ċ import Ġapple . u ikit . struct . UI Edge Insets Ċ Ċ class ĠRSS Reader Controller Ġprotected Ġconstructor ( peer : ĠPointer ) Ġ: ĠCustom Cell Table Controller ( peer ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġloader Thread : ĠThread ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġview Did Load () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . view Did Load () ĊĊĠĠĠĠĠĠĠ ĠsetTitle (" RSS ĠReader ") ĊĊĠĠĠĠĠĠĠ Ġval Ġbm button Ġ= ĠUI Bar Button Item . alloc (). initWith Title Style Target Action (" Book marks ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUI Bar Button Item Style . Plain , Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS EL (" show Book marks ")) ĊĠĠĠĠĠĠĠ Ġnavigation Item (). set Right Bar Button Item ( bm button ) ĊĊĠĠĠĠĠĠĠ Ġload URL ( Book marks . bookmarks [ 0 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġoverride Ġfun Ġprepare Controller () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnib Ġ= ĠU IN ib . nib With N ib Name Bundle (" RSS Cell ", ĠNS Bundle . main Bundle ()) ĊĠĠĠĠĠĠĠ Ġtable View (). register N ib For Cell Re use Identifier ( nib , ĠCELL _ IDENTIFIER ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload URL ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loader Thread Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġloader Thread Ġ= ĠThread ( object Ġ: ĠRunnable Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfeed Ġ= ĠRSS Feed ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! feed . last ErrorMessage . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error ( feed . last ErrorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobals . dispatch _ sync ( Globals . dispatch _ get _ main _ queue (), Ġobject Ġ: ĠGlobals . Block _ dispatch _ sync Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall _ dispatch _ sync () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġfeed . items ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Finished Ġloading Ġurl Ġ" Ġ+ Ġurl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable View (). reload Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable View (). scroll Rect To Visible Animated ( Core Graphics . C GRect Make ( 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 , Ġ 1 . 0 ), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloader Thread Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġloader Thread !!. start () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġhandle Error ( errorMessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġalert View Ġ= ĠUI Alert View . alloc (). init () ĊĠĠĠĠĠĠĠ Ġalert View . setMessage (" Cannot ĠShow ĠR ss Ġnews : Ġ" Ġ+ ĠerrorMessage ) ĊĠĠĠĠĠĠĠ Ġalert View . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġoverride Ġfun Ġsetup Cell AtIndex ( cell : ĠUIT ableView Cell , Ġrow Data : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcell Ġas ĠRSS Cell ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġrow Data Ġas ĠRSS Feed Item ĊĊĠĠĠĠĠĠĠ Ġc . rss Title (). setText ( i . title ) ĊĠĠĠĠĠĠĠ Ġc . rss Description (). setText ( i . description ) ĊĠĠĠĠĠĠĠ Ġc . rss Date (). setText ( i . pub Date ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Selector (" show Book marks ") ĊĠĠĠ Ġfun Ġshow Book marks () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġb ms Ġ= ĠSimple Table Controller . alloc (). init () ĊĠĠĠĠĠĠĠ Ġb ms . setTitle (" Book marks ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( bm Ġin ĠBook marks . bookmarks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb ms . add ( bm ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( UI Device . current Device (). user Interface Id iom () Ġ== ĠUI User Interface Id iom . Phone ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb ms . listener Ġ= Ġ( object Ġ: ĠSimple Table Controller . EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtable View Did Select Row ( table View : ĠUIT ableView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload URL ( row ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Controller (). pop ViewController Animated ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Controller (). push ViewController Animated ( b ms , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġctrl Ġ= ĠU IP op over Controller . alloc (). initWith Content ViewController ( b ms ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb ms . listener Ġ= Ġ( object Ġ: ĠSimple Table Controller . EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtable View Did Select Row ( table View : ĠUIT ableView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload URL ( row ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctrl . dismiss Popover Animated ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctrl . present Popover From Bar Button Item Per mitted Arrow Directions Animated ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Item (). right Bar Button Item (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠU IP op over Arrow Direction . Any , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtable View Height For Row AtIndex Path ( table View : ĠUIT ableView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Path : ĠNS Index Path ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġoptions . get ( index Path . row (). toInt ()) Ġas ĠRSS Feed Item ĊĠĠĠĠĠĠĠ Ġvar Ġt tm Ġ= Ġitem . description ĊĠĠĠĠĠĠĠ Ġif Ġ( tt m !!. endsWith ("\ n ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt tm Ġ+= Ġ"-" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmeasure Ġ= ĠNSString . string With String ( tt m ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWidth : Ġ 2 Ġ* Ġ 1 0 Ġpixel Ġmargin Ġ+ Ġ 5 Ġpixel Ġpadding ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠCG Size ( table View . bounds (). size (). width () Ġ- Ġ 1 0 . 0 Ġ* Ġ 2 . 0 Ġ- ĠtextView HP adding , Ġ 1 0 0 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġbounding Ġ= Ġmeasure . bounding Rect With Size Options Attributes Context ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize , ĠtextView Drawing Options , ĠtextView Attributes Ġas ĠNS Dictionary < String , ĠAny >, Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMath . ceil ( bounding . size (). height () Ġ+ ĠtextView V Padding Ġ+ Ġ 1 . 0 ) Ġ+ Ġ 3 9 . 0 Ġ+ Ġ 3 4 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtable View Did Select Row AtIndex Path ( table View : ĠUIT ableView ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Path : ĠNS Index Path ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġoptions . get ( index Path !!. row (). toInt ()) Ġas ĠRSS Feed Item ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġitem . url ĊĠĠĠĠĠĠĠ Ġif Ġ( url Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUI Application . shared Application (). open URL ( NS URL . URL With String ( url )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠtextView HP adding : ĠDouble ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠtextView V Padding : ĠDouble ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠtextView Drawing Options : ĠLong ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠtextView Attributes : ĠNS Dictionary < Any , ĠAny > ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSome Ġconst s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Container Insets Ġ= ĠUI Edge Insets ( 8 . 0 , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 8 . 0 , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Insets Ġ= ĠUI Edge Insets ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Fragment Padding Ġ= Ġ 5 . 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġp add ings ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView HP adding Ġ= Ġtext Container Insets . left () Ġ+ Ġtext Container Insets . right () Ġ+ Ġ 2 . 0 Ġ* Ġline Fragment Padding Ġ+ Ġcontent Insets . left () Ġ+ Ġcontent Insets . right () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView V Padding Ġ= Ġtext Container Insets . top () Ġ+ Ġtext Container Insets . bottom () Ġ+ Ġcontent Insets . top () Ġ+ Ġcontent Insets . bottom () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġoptions ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Drawing Options Ġ= ĠNSString Drawing Options . Uses Line Fragment Origin Ġor ĠNSString Drawing Options . Uses Font Leading ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparagraph Style Ġ= ĠNSMutable Paragraph Style . alloc (). init () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparagraph Style . set Line Break Mode ( NS Line Break Mode . Word Wr apping ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Storage Ġ= ĠN ST ext Storage . alloc (). initWith String ("- ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Storage Attrs Ġ= Ġtext Storage . attributes AtIndex Effective Range ( 0 , ĠNS Range ( 0 , Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Ġ= Ġtext Storage Attrs [ UIKit . NS Font AttributeName ()] Ġas ĠU IF ont ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattributes Ġ: ĠNSMutable Dictionary < Any , Any >? Ġ= ĠNSMutable Dictionary . dictionary With Capacity < Any , ĠAny >( 2 ) Ġas ĠNSMutable Dictionary < Any , Any >? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes !!. put ( UIKit . NS Font AttributeName (), Ġfont ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes !!. put ( UIKit . NS Paragraph Style AttributeName (), Ġparagraph Style ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView Attributes Ġ= Ġattributes ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġexternal Ġfun Ġalloc (): ĠRSS Reader Controller ĊĠĠĠ Ġ} Ċ }