package Ġcom . andre apiv et ta . bl u . data . jobs Ċ Ċ import Ġcom . andre apiv et ta . bl u . data . model .* Ċ import Ġcom . andre apiv et ta . bl u . data . twitter . getF avor iters Url Ċ import Ġcom . andre apiv et ta . bl u . data . twitter . get Ret weet ers Url Ċ import Ġio . realm . Realm List Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġorg . json . JSONException Ċ import Ġorg . json . JSONObject Ċ import Ġorg . js oup . J soup Ċ import Ġtim ber . log . Tim ber Ċ import Ġtwitter 4 j .* Ċ import Ġjava . net . Socket TimeoutException Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġand rea Ġon Ġ 1 7 / 0 9 / 1 6 . Ċ Ġ*/ Ċ object ĠNotifications DataProvider Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠhttpClient Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Interceptor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . proceed ( it . request (). newBuilder (). add Header (" user - agent ", Ġ" Mozilla / 5 . 0 ( X 1 1 ; Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Linux Ġx 8 6 _ 6 4 ) ĠAppleWebKit / 5 3 7 . 3 6 Ġ( KHTML , Ġlike ĠGecko ) ĠChrome / 5 3 . 0 . 2 7 8 5 . 1 1 6 ĠSafari / 5 3 7 . 3 6 "). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĊĠĠĠ Ġfun Ġretrieve Tweet Info ( twitter : ĠTwitter ): ĠMutable List < Tweet Info > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtwitter . getUser Timeline ( Paging ( 1 , Ġ 1 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠTweet Info ( it . id , Ġget F avor iters ( it . id ), Ġget Ret weet ers ( it . id )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĊĠĠĠ Ġfun Ġretrieve Ment ions ( twitter : ĠTwitter ): ĠMutable List < Mention > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtwitter . getM ent ions Timeline ( Paging ( 1 , Ġ 2 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠM ention . valueOf ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĊĠĠĠ Ġfun Ġretrieve Follow ers ( twitter : ĠTwitter ): ĠMutable List < Follower > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfollow ers Ġ= ĠArrayList < Follower >() ĊĠĠĠĠĠĠĠ Ġval Ġids Ġ= Ġtwitter . get Follow ers IDs (- 1 ) ĊĠĠĠĠĠĠĠ Ġdo Ġfollow ers . addAll ( ids . i Ds . map (:: Follower )) Ġwhile Ġ( ids . hasNext ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġfollow ers ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġretrieve Direct Messages ( twitter : ĠTwitter ): ĠMutable List < Direct Message > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirect Messages Ġ= Ġtwitter . get Direct Messages ( Paging ( 1 , Ġ 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġdirect Messages . addAll ( twitter . get Sent Direct Messages ( Paging ( 1 , Ġ 2 0 0 ))) ĊĠĠĠĠĠĠĠ Ġreturn Ġdirect Messages ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsafe Retrieve Follow ed Users ( twitter : ĠTwitter ): ĠMutable List < User Follow ed > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfriends Number Ġ= Ġtwitter . show User ( twitter . id ). friends Count ĊĠĠĠĠĠĠĠ Ġif Ġ( friends Number Ġ< Ġ 2 8 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers Ġ= ĠArrayList < User Follow ed >( friends Number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcursor : ĠLong Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpag able Follow ings : ĠPag able Response List < User > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpag able Follow ings Ġ= Ġtwitter . getF riends List ( twitter . id , Ġcursor , Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers . addAll ( pag able Follow ings . map Ġ{ ĠUser Follow ed . valueOf ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġpag able Follow ings . next Cursor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor Ġ!= Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġusers ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsafe Retrieve Follow ed Users ( twitter : ĠTwitter , Ġon Next : Ġ( List < User Follow ed >) Ġ-> ĠUnit ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( twitter . show User ( twitter . id ). friends Count Ġ> Ġ 2 8 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvar Ġcursor : ĠLong Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfollow ings Ġ= Ġtwitter . getF riends List ( twitter . id , Ġcursor , Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Next ( follow ings . map Ġ{ ĠUser Follow ed . valueOf ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġfollow ings . next Cursor ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor Ġ!= Ġ 0 L ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget F avor iters ( tweet ID : ĠLong ): ĠRealm List < UserId >? Ġ= Ġget Users ( getF avor iters Url ( tweet ID )) ĊĊĠĠĠ Ġfun Ġget Ret weet ers ( tweet ID : ĠLong ): ĠRealm List < UserId >? Ġ= Ġget Users ( get Ret weet ers Url ( tweet ID )) ĊĊĠĠĠ Ġprivate Ġfun Ġget Users ( url : ĠString ): ĠRealm List < UserId >? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġget Json ( url ) ĊĠĠĠĠĠĠĠ ĠRealm List (* J soup . parse ( json . getString (" html Users ")). getElementsBy Tag (" img ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . has Attr (" data - user - id ") Ġ&& Ġit . attr (" data - user - id "). isNotBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠUserId ( it . attr (" data - user - id "). to Long ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array ()) ĊĠĠĠ Ġ} Ġcatch Ġ( exception : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . e ( exception , Ġ" Error Ġgetting Ġusers !") ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ġcatch Ġ( exception : ĠSocket TimeoutException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . e ( exception , Ġ" Timeout Ġgetting Ġusers !") ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( JSONException :: class , ĠSocket TimeoutException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget Json ( url : ĠString ): ĠJSONObject Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJSONObject ( httpClient . new Call ( Request . Builder (). url ( url ). build ()). execute (). body (). string ()) Ċ Ċ }