package Ġnet . slash _ omega . j uk t away . twitter Ċ Ċ import Ġde . green robot . event . EventBus Ċ import Ġio . ktor . client . engine . android . Android Ċ import Ġjp . ne phy . pen ic ill in . Pen ic ill in Client Ċ import Ġjp . ne phy . pen ic ill in . core . em ulation . Official Client Ċ import Ġjp . ne phy . pen ic ill in . core . session . ApiClient Ċ import Ġjp . ne phy . pen ic ill in . core . session . config .* Ċ import Ġjp . ne phy . pen ic ill in . endpoints . common . Tweet Mode . Extended Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġnet . slash _ omega . j uk t away . R Ċ import Ġnet . slash _ omega . j uk t away . app Ċ import Ġnet . slash _ omega . j uk t away . event . action . Account ChangeEvent Ċ import Ġnet . slash _ omega . j uk t away . model . Fav Ret weet Manager Ċ import Ġnet . slash _ omega . j uk t away . model . Tab Manager Ċ import Ġnet . slash _ omega . j uk t away . twitter . Core . consumer Parser Ċ import Ġnet . slash _ omega . j uk t away . twitter . Core . consumer Table Ċ import Ġnet . slash _ omega . j uk t away . twitter . Core . identifier Parser Ċ import Ġnet . slash _ omega . j uk t away . util . J uk t away DB Open Helper . Companion . db Use Ċ import Ġnet . slash _ omega . j uk t away . util . Shared Preference Ċ import Ġorg . jetbrains . ank o . db .* Ċ import Ġjava . io . Serializable Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠCreated Ġon Ġ 2 0 1 8 / 1 2 / 2 3 . Ċ Ġ*/ Ċ Ċ var Ġcurrent Client : ĠApi Client Ġ= ĠPen ic ill in Client Ġ{ Ġ Ġ} ĊĠĠĠ Ġprivate Ġset Ċ Ċ late init Ġvar Ġcurrent Identifier : ĠIdentifier ĊĠĠĠ Ġprivate Ġset Ċ Ċ val Ġidentifier List ĊĠĠĠ Ġget () Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect ( Core . identifier Table , Ġ" consumer Id ", Ġ" at ", Ġ" ats ", Ġ" userId ", Ġ" screen Name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse List ( identifier Parser ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. get OrNull () Ġ?: Ġempty List () Ċ Ċ val Ġconsumer List ĊĠĠĠ Ġget () Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect ( consumer Table , Ġ" id ", Ġ" name ", Ġ" ck ", Ġ" cs "). parse List ( consumer Parser ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. get OrNull () Ġ?: Ġempty List () Ċ Ċ val Ġis Identifier Set ĊĠĠĠ Ġget () Ġ= Ġidentifier List . isNotEmpty () Ċ Ċ object ĠCore Ġ{ ĊĠĠĠ Ġinternal Ġval Ġidentifier Parser Ġ= Ġclass Parser < Identifier >() ĊĠĠĠ Ġinternal Ġval Ġconsumer Parser Ġ= Ġclass Parser < Consumer >() ĊĠĠĠ Ġinternal Ġconst Ġval Ġidentifier Table Ġ= Ġ" identifier Table " ĊĠĠĠ Ġinternal Ġconst Ġval Ġconsumer Table Ġ= Ġ" consumer Table " ĊĠĠĠ Ġprivate Ġvar Ġlast Identifier At s Ġby ĠShared Preference (" twitter core ", Ġ" last Identifier ", Ġ"") ĊĊĠĠĠ Ġfun Ġinitialize () Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Table ( identifier Table , Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" id " Ġto ĠINTEGER Ġ+ ĠPRIMARY _ KEY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" consumer Id " Ġto ĠINTEGER Ġ+ ĠNOT _ NULL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" at " Ġto ĠTEXT Ġ+ ĠNOT _ NULL Ġ+ ĠUNIQUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ats " Ġto ĠTEXT Ġ+ ĠNOT _ NULL Ġ+ ĠUNIQUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" userId " Ġto ĠINTEGER Ġ+ ĠNOT _ NULL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" screen Name " Ġto ĠTEXT Ġ+ ĠNOT _ NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Table ( consumer Table , Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" id " Ġto ĠINTEGER Ġ+ ĠPRIMARY _ KEY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto ĠTEXT Ġ+ ĠNOT _ NULL Ġ+ ĠUNIQUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ck " Ġto ĠTEXT Ġ+ ĠNOT _ NULL Ġ+ ĠUNIQUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cs " Ġto ĠTEXT Ġ+ ĠNOT _ NULL Ġ+ ĠUNIQUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( consumer List . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠiPhone Ġ= ĠOffic ial Client . OAuth 1 a . Twitter For iPhone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( consumer Table , Ġ" name " Ġto Ġ" Twitter Ġfor ĠiPhone ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ck " Ġto ĠiPhone . consumer Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cs " Ġto ĠiPhone . consumer Secret ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( consumer Table , Ġ" name " Ġto Ġ" J uk t away ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ck " Ġto Ġapp . getString ( R . string . j uk t away _ ck ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cs " Ġto Ġapp . getString ( R . string . j uk t away _ cs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Identifier Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Identifier Ġ= Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect ( identifier Table , Ġ" consumer Id ", Ġ" at ", Ġ" ats ", Ġ" userId ", Ġ" screen Name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Args (" ats Ġ= Ġ{ ats }", Ġ" ats " Ġto Ġlast Identifier At s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse Single ( identifier Parser ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Client Ġ= Ġcurrent Identifier . to Client () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġswitch Token ( id : ĠIdentifier ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Client Ġ= Ġcurrent Client ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Identifier Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Client Ġ= Ġid . to Client () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Client . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Identifier At s Ġ= Ġid . ats ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF av Ret weet Manager . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTab Manager . load Tabs () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). post ( Account ChangeEvent ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġadd Token ( set : ĠIdentifier , Ġswitch Client : ĠBoolean Ġ= Ġtrue ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect ( identifier Table , Ġ" id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Args ("( userId Ġ= Ġ{ userId }) Ġand Ġ( consumer Id Ġ= Ġ{ consumer Id })", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" userId " Ġto Ġset . userId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" consumer Id " Ġto Ġset . consumer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse Single ( Long Parser ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( identifier Table , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" consumer Id " Ġto Ġset . consumer Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" at " Ġto Ġset . at , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ats " Ġto Ġset . ats , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" userId " Ġto Ġset . userId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" screen Name " Ġto Ġset . screen Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. is Failure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( switch Client ) Ġswitch Token ( set ) ĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġadd Consumer ( name : ĠString , Ġck : ĠString , Ġcs : ĠString ) Ġ= Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( consumer Table , Ġ" name " Ġto Ġname , Ġ" ck " Ġto Ġck , Ġ" cs " Ġto Ġcs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ!= Ġ- 1 L ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġremove Identifier ( identifier : ĠIdentifier ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( identifier Table , Ġ" at Ġ= Ġ{ at }", Ġ" at " Ġto Ġidentifier . at ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġremove Consumer ( consumer : ĠConsumer ) Ġ= Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconsumer . ck Ġ!= ĠOffic ial Client . OAuth 1 a . Twitter For Android . consumer Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġconsumer . ck Ġ!= Ġapp . getString ( R . string . j uk t away _ ck ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( identifier Table , Ġ" consumer Id Ġ= Ġ{ consumer Id }", Ġ" consumer Id " Ġto Ġconsumer . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( identifier Table , Ġ" id Ġ= Ġ{ id }", Ġ" id " Ġto Ġconsumer . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. is Success ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Consumer ( name : ĠString ) Ġ= Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect ( consumer Table , Ġ" id ", Ġ" name ", Ġ" ck ", Ġ" cs ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Args (" name Ġ= Ġ{ name }", Ġ" name " Ġto Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse Single ( consumer Parser ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Consumer ( consumer Id : ĠLong ) Ġ= Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect ( consumer Table , Ġ" id ", Ġ" name ", Ġ" ck ", Ġ" cs ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Args (" id Ġ= Ġ{ id }", Ġ" id " Ġto Ġconsumer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse Single ( consumer Parser ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠIdentifier ( val Ġconsumer Id : ĠLong , Ġval Ġat : ĠString , Ġval Ġat s : ĠString , Ġval ĠuserId : ĠLong , Ġval Ġscreen Name : ĠString ): ĠSerializable Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġat . hashCode () ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= Ġother Ġis ĠIdentifier Ġ&& Ġthis . at Ġ== Ġother . at ĊĠĠĠ Ġsuspend Ġfun Ġto Client (): ĠApi Client Ġ= Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconsumer Ġ= Ġdb Use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect ( consumer Table , Ġ" id ", Ġ" name ", Ġ" ck ", Ġ" cs ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Args (" id Ġ= Ġ{ id }", Ġ" id " Ġto Ġconsumer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse Single ( consumer Parser ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠPen ic ill in Client Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication ( consumer . ck , Ġconsumer . cs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken ( at , Ġat s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpClient ( Android ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Retries Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretry Interval ( 1 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Tweet Mode Ġ= ĠExtended ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġinline Ġfun Ġ< T > Ġas Client ( block : ĠApi Client . () Ġ-> ĠT ) Ġ= Ġto Client (). use ( block ) Ċ } Ċ Ċ data Ġclass ĠConsumer ( val Ġid : ĠLong , Ġval Ġname : ĠString , Ġval Ġck : ĠString , Ġval Ġcs : ĠString ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġcs . hashCode () ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġ( other Ġas ? ĠConsumer )?. cs Ġ== Ġcs Ċ } Ċ