package Ġcom . applic aster . quick line . auth Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . text . format . Date Utils Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġcom . applic aster . di . component . Component Provider Ċ import Ġcom . applic aster . plugin _ manager . Generic Plugin I Ċ import Ġcom . applic aster . plugin _ manager . Plugin Ċ import Ġcom . applic aster . plugin _ manager . hook . Application Loader Hook Up I Ċ import Ġcom . applic aster . plugin _ manager . hook . Hook Listener Ċ import Ġcom . applic aster . quick line . auth . k alt ura . IK alt ura API Ċ import Ġcom . applic aster . quick line . auth . k alt ura . K alt ura Flows Ċ import Ġcom . applic aster . quick line . auth . k alt ura . models . Add Device Request Ċ import Ġcom . applic aster . quick line . auth . k alt ura . models . Device Ċ import Ġcom . applic aster . quick line . auth . k alt ura . models . House hold Device Delete Request Ċ import Ġcom . applic aster . quick line . auth . k alt ura . models . List Device Request Ċ import Ġcom . applic aster . quick line . auth . ui . Auth Error Activity Ċ import Ġcom . applic aster . storage . LocalStorage Ċ import Ġcom . applic aster . util . AP Logger Ċ import Ġcom . applic aster . util . Localization Helper Ċ import Ġcom . applic aster . util . OS Util Ċ import Ġcom . google . gson . Json Syntax Exception Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . json . JSONObject Ċ import Ġjava . net . Socket TimeoutException Ċ import Ġjava . util . regex . Pattern ĊĊ Ċ class ĠQuick Line Auth Ġ: ĠApplication Loader Hook Up I , ĠGeneric Plugin I Ġ{ ĊĊĠĠĠ Ġ// Ġtodo : Ġremove Ġdefault Ġvalues ĊĠĠĠ Ġprivate Ġvar Ġpartner Id : ĠLong Ġ= Ġ 3 2 2 3 L ĊĠĠĠ Ġprivate Ġvar Ġk alt ura API Endpoint : ĠString Ġ= ĠK alt ura Flows . K alt ura Endpoint ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġprivate Ġfun Ġtest Login ( ĊĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠ Ġlistener : ĠHook Listener , ĊĠĠĠĠĠĠĠ Ġusername : ĠString , ĊĠĠĠĠĠĠĠ Ġpassword : ĠString , ĊĠĠĠĠĠĠĠ Ġuuid : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Password Registration ( username , Ġpassword , Ġuuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . intent . data Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Hook Finished () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFlow Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , Ġe . error , Ġe . details , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , ĠFlow Exception . Error . K alt ura Plain Login Error , Ġe Ġ= Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġprivate Ġfun Ġrun Initial Flow ( ĊĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠ Ġuri : ĠUri , ĊĠĠĠĠĠĠĠ Ġlistener : ĠHook Listener ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġks Ġ= Ġurl Registration ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġerase Ġthe Ġintent Ġso ĠQ B Ġwill Ġnot Ġtry Ġto Ġopen Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo : Ġchange Ġto Ġsome Ġwelcome Ġscreen Ġurl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . intent . data Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcomplete Ġhook Ġon Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . info ( TAG , Ġ" Successful Ġlogin ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Hook Finished () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFlow Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , Ġe . error , Ġe . details , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , ĠFlow Exception . Error . General Error , Ġe Ġ= Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnot Ġfinish Ġthe Ġhook ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġfun Ġurl Registration ( uri : ĠUri ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġextract Ġinformation ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġfetch Url ( uri . toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġjo Ġ= ĠJSONObject ( json ) ĊĠĠĠĠĠĠĠ Ġval Ġverify User Url Ġ= Ġjo . getString (" verify User Url ") ĊĠĠĠĠĠĠĠ Ġval Ġcontract Id Ġ= Ġjo . getString (" contract Id ") ĊĠĠĠĠĠĠĠ Ġval ĠdeviceId Ġ= Ġjo . getString (" deviceId ") ĊĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" auth " Ġto Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" object Type " Ġto Ġ" K alt ura StringValue ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" value " Ġto Ġ" Quick Line S so " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġsend Ġto ĠK alt ura Ġand Ġget Ġresponse , Ġverify User Url Ġis Ġused Ġas Ġpassword ĊĠĠĠĠĠĠĠ Ġreturn Ġlogin Password Registration ( contract Id , Ġverify User Url , ĠdeviceId , Ġextras ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġfun Ġlogin Password Registration ( ĊĠĠĠĠĠĠĠ Ġusername : ĠString , ĊĠĠĠĠĠĠĠ Ġpassword : ĠString , ĊĠĠĠĠĠĠĠ Ġuuid : ĠString , ĊĠĠĠĠĠĠĠ Ġextras : ĠMap < String , ĠAny >? Ġ= Ġnull ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġk alt ura API Ġ= ĠK alt ura Flows . make K alt ura API ( k alt ura API Endpoint ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlogged In Ġ= ĠK alt ura Flows . login ( k alt ura API , Ġusername , Ġpassword , Ġuuid , Ġpartner Id , Ġextras ) ĊĠĠĠĠĠĠĠ ĠAP Logger . debug ( TAG , Ġ" Logged Ġin Ġto ĠK alt ura Ġsession ") ĊĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġlogged In . login Session !! ĊĊĠĠĠĠĠĠĠ Ġ// Ġks Ġis Ġgood Ġfor Ġa Ġweek ĊĠĠĠĠĠĠĠ Ġval Ġsession KS Ġ= Ġsession . ks !! ĊĠĠĠĠĠĠĠ Ġval Ġexpires Ġ= Ġsession . expiry !! ĊĠĠĠĠĠĠĠ ĠLocal Storage . set ( KEY _ KS , Ġsession KS , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠ ĠLocal Storage . store Long ( KEY _ KS _ EXPI RES , Ġexpires , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠ ĠLocal Storage . set ( KEY _ USER _ ID , Ġlogged In . user !!. id , ĠNAMES PACE ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġneeded Ġto Ġrenew Ġks ĊĠĠĠĠĠĠĠ Ġval Ġapp Token Ġ= ĠK alt ura Flows . add App Token ( k alt ura API , Ġsession KS , Ġuuid ) ĊĠĠĠĠĠĠĠ ĠLocal Storage . store Object ( KEY _ APP _ TOKEN , Ġapp Token , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠ ĠLocal Storage . set ( KEY _ DEVICE _ ID , Ġuuid , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠ ĠAP Logger . debug ( TAG , Ġ" App Token Ġstored ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġuncomment Ġfor Ġtesting ĊĠĠĠĠĠĠĠ Ġ// ĠK alt ura Flows . renew KS ( k alt ura API , Ġapp Token , Ġuuid , Ġpartner Id ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsession KS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Valid KS (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġks Ġ= ĠLocal Storage . get ( KEY _ KS , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( ks . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġexpires Ġ= ĠLocal Storage . restore Long ( KEY _ KS _ EXPI RES , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġexpires ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . info ( TAG , Ġ" No Ġexpiration Ġtimestamp Ġfound Ġfor Ġstored ĠK S , Ġremoving ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Storage . remove ( KEY _ KS , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġexpire Ġone Ġday Ġearlier . ĊĠĠĠĠĠĠĠ Ġval Ġthreshold Ġ= Ġ( System . currentTimeMillis () Ġ- ĠDate Utils . DAY _ IN _ M ILL IS ) Ġ/ ĠDate Utils . SECOND _ IN _ M ILL IS ĊĠĠĠĠĠĠĠ Ġif Ġ( expires Ġ< Ġthreshold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . info ( TAG , Ġ" KS Ġhas Ġexpired , Ġremoving ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Storage . remove ( KEY _ KS , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Storage . remove ( KEY _ KS _ EXPI RES , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry With Token ( ĊĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠ Ġblock : Ġ() Ġ-> Unit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Syntax Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbroken Ġor Ġincompatible Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Storage . remove ( KEY _ APP _ TOKEN , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , ĠFlow Exception . Error . K alt ura Failed To Recover App Token , Ġe Ġ= Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFlow Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbroken Ġor Ġincompatible Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Storage . remove ( KEY _ APP _ TOKEN , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , Ġe . error , Ġe . details , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSocket TimeoutException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , ĠFlow Exception . Error . Network Timeout , Ġe Ġ= Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnot Ġremove Ġtoken , Ġcan Ġbe Ġnetwork Ġerror Ġas Ġwell ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , ĠFlow Exception . Error . General Error , Ġe Ġ= Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Renew ( ĊĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠ Ġlistener : ĠHook Listener , ĊĠĠĠĠĠĠĠ Ġinitial Error : ĠFlow Exception . Error ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAP Logger . debug ( TAG , Ġ" At tempting Ġto Ġrenew ĠK S Ġusing ĠApp Token ") ĊĠĠĠĠĠĠĠ Ġtry With Token ( activity ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Token Ġ= ĠLocal Storage . restore Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ APP _ TOKEN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK alt ura Flows . App Token :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNAMES PACE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġapp Token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , Ġinitial Error , Ġinitial Error . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ try With Token ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry With Token ( activity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk alt ura API Ġ= ĠK alt ura Flows . make K alt ura API ( k alt ura API Endpoint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsession Info Ġ= ĠK alt ura Flows . renew KS ( k alt ura API , Ġapp Token , Ġapp Token . uuid , Ġpartner Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . debug ( TAG , Ġ" KS Ġwas Ġrenew ed Ġusing ĠApp Token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Storage . set ( KEY _ KS , Ġsession Info . ks , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Storage . store Long ( KEY _ KS _ EXPI RES , Ġsession Info . expiry !! , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Hook Finished () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġprivate Ġfun Ġtry Add Device To House hold ( ĊĠĠĠĠĠĠĠ Ġk alt ura API : ĠIK alt ura API , ĊĠĠĠĠĠĠĠ Ġrequest : ĠAdd Device Request , ĊĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠ Ġlistener : ĠHook Listener ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġk alt ura API . house hold Device Add ( request ). execute () ĊĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . error ( TAG , Ġ" Failed Ġto Ġadd Device To House hold ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , ĠFlow Exception . Error . General Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġresponse . body ()?. result ?. error ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġerror ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . error ( TAG , Ġ" Failed Ġto Ġadd Ġdevice : Ġ" Ġ+ Ġerror . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( error . code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġshow Error Screen ( activity , ĠFlow Exception . Error . General Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 0 1 5 " Ġ-> Ġlistener . on Hook Finished () Ġ// Ġ" Device Ġalready Ġexists ", Ġnot Ġan Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 0 0 1 " Ġ-> Ġon Limit Exceeded ( activity , Ġrequest , Ġk alt ura API , Ġlistener ) Ġ// Ġ" Exceeded Ġlimit " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġshow Error Screen ( activity , ĠFlow Exception . Error . General Error , Ġerror . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlistener . on Hook Finished () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġprivate Ġfun Ġon Limit Exceeded ( ĊĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠ Ġrequest : ĠAdd Device Request , ĊĠĠĠĠĠĠĠ Ġk alt ura API : ĠIK alt ura API , ĊĠĠĠĠĠĠĠ Ġlistener : ĠHook Listener ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġk alt ura API . house hold Device List ( List Device Request ( request . ks )). execute () ĊĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . error ( TAG , Ġ" Failed Ġto Ġadd Device To House hold ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , ĠFlow Exception . Error . General Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġresponse . body ()?. result ?. error ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġerror ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlow Exception . Error . General Error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Device Ġlimit Ġexceeded , Ġfailed Ġto Ġload Ġdevice Ġlist " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdevices Ġ= Ġresponse . body ()?. result ?. objects ĊĠĠĠĠĠĠĠ Ġval Ġnames Ġ= Ġdevices !!. map Ġ{ Ġit . name Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġactivity . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" Delete Ġexisting Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Items ( names ) Ġ{ Ġ_, Ġwhich Ġ-> Ġtry Delete ( devices [ which ], Ġactivity , Ġrequest , Ġk alt ura API , Ġlistener ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( android . R . string . cancel ) Ġ{ Ġ_, Ġ_ Ġ-> Ġactivity . finish () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Delete ( device : ĠDevice , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest : ĠAdd Device Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk alt ura API : ĠIK alt ura API , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener : ĠHook Listener ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAP Logger . info ( TAG , Ġ" Deleting Ġdevice : Ġ${ device . name } Ġ${ device . ud id }") ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelete Result Ġ= Ġk alt ura API . house hold Device Delete ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHouse hold Device Delete Request ( device . ud id , Ġrequest . ks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! delete Result . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . error ( TAG , Ġ" Failed Ġto Ġhouse hold Device Delete ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , ĠFlow Exception . Error . General Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( true Ġ!= Ġdelete Result . body ()?. result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFlow Exception . Error . General Error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġdelete Ġdevice " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Add Device To House hold ( k alt ura API , Ġrequest , Ġactivity , Ġlistener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Error Screen ( ĊĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠ Ġerror : ĠFlow Exception . Error , ĊĠĠĠĠĠĠĠ Ġdetails : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġe : ĠException ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠLocalization Helper . from Plugin Id ( Plugin Id ). get ( error . Message Key , Ġerror . Message Key ) ĊĠĠĠĠĠĠĠ ĠAP Logger . error ( TAG , Ġerror . toString (), Ġe ) ĊĠĠĠĠĠĠĠ Ġactivity . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth Error Activity . show ( activity , Ġmessage , Ġdetails Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . finish () Ġ// Ġmake Ġsure Ġto Ġfinish Ġmain Ġactivity ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Plugin Model ( plugin : ĠPlugin ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġplugin . getConfiguration () ĊĊĠĠĠĠĠĠĠ Ġ// ĠPartner ĠID ĊĠĠĠĠĠĠĠ Ġconfig [" k alt ura _ partner _ id "]. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġit Ġ|| Ġ! it . is Json Primitive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Required Ġplugin Ġconfiguration Ġparameter Ġ' k alt ura _ partner _ id ' Ġis Ġmissing Ġor Ġinvalid " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ let ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpartner Id Ġ= Ġit . as Long Ġ// Ġwill Ġdo Ġstring -> long Ġcast Ġif Ġneeded ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠK alt ura Ġendpoint ĊĠĠĠĠĠĠĠ Ġconfig [" k alt ura _ api _ endpoint "]. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġit Ġ|| Ġ! it . is Json Primitive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Required Ġplugin Ġconfiguration Ġparameter Ġ' k alt ura _ api _ endpoint ' Ġis Ġmissing Ġor Ġnot Ġstring " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ let ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk alt ura API Endpoint Ġ= Ġit . asString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( k alt ura API Endpoint . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Required Ġplugin Ġconfiguration Ġparameter Ġ' k alt ura _ api _ endpoint ' Ġhas Ġempty Ġvalue , Ġsetting Ġto Ġdefault " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk alt ura API Endpoint Ġ= ĠK alt ura Flows . K alt ura Endpoint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! k alt ura API Endpoint . endsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk alt ura API Endpoint Ġ+= Ġ"/" Ġ// ĠOk Http Ġrequires Ġbase Ġurl Ġto Ġend Ġwith Ġ"/" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Plugin Configuration Params ( params : ĠMutable Map < Any ?, ĠAny ?> ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdeprecated ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute On Application Ready ( context : ĠContext , Ġlistener : ĠHook Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġcontext Ġas ? ĠActivity ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġactivity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġnot Ġhappen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . error ( TAG , Ġ" Non - Activity Ġcontext Ġpassed Ġto Ġhook ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Hook Finished () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAP Logger . debug ( TAG , Ġ" At tempting Ġto Ġregister Ġdevice ") ĊĠĠĠĠĠĠĠ Ġval Ġks Ġ= ĠLocal Storage . get ( KEY _ KS , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( ks . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , ĠFlow Exception . Error . General Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdevice ID Ġ= ĠLocal Storage . get ( KEY _ DEVICE _ ID , ĠNAMES PACE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( device ID . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Screen ( activity , ĠFlow Exception . Error . General Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġk alt ura API Ġ= ĠK alt ura Flows . make K alt ura API ( k alt ura API Endpoint ) ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠOS Util . getDevice Name ( activity ) ĊĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= ĠDevice ( name , Ġ 2 2 , Ġdevice ID ) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠAdd Device Request ( ks , Ġdevice ) ĊĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Add Device To House hold ( k alt ura API , Ġrequest , Ġactivity , Ġlistener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute On Startup ( context : ĠContext , Ġlistener : ĠHook Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġcontext Ġas ? ĠActivity ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġactivity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġnot Ġhappen ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . error ( TAG , Ġ" Non - Activity Ġcontext Ġpassed Ġto Ġhook ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Hook Finished () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġactivity . intent . data ĊĠĠĠĠĠĠĠ ĠAP Logger . info ( TAG , Ġ" Intent Ġurl Ġ$ uri ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġuri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Valid KS ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAP Logger . info ( TAG , Ġ" Found Ġnon - expired ĠK S ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Hook Finished () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Renew ( activity , Ġlistener , ĠFlow Exception . Error . Intent Url Missing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ// Ġdo Ġnot Ġfinish Ġthe Ġhook ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( uri . toString (). startsWith ( Test URL Mask )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġuri . getQuery Parameter (" username ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġuri . getQuery Parameter (" password ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġuri . getQuery Parameter (" uuid ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġusername Ġ&& Ġnull Ġ!= Ġpassword Ġ&& Ġnull Ġ!= Ġuuid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Login ( activity , Ġlistener , Ġusername , Ġpassword , Ġuuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! url Reg Ex . contains Match In ( uri . toString ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmaybe Ġsome Ġnon - login ĠURL , Ġtry Ġto Ġrenew Ġand Ġopen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Renew ( activity , Ġlistener , ĠFlow Exception . Error . Intent Url Invalid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ// Ġdo Ġnot Ġfinish Ġthe Ġhook ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Initial Flow ( activity , Ġuri , Ġlistener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Quick Line Auth " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPlugin Id Ġ= Ġ" quick line - k alt ura - authentication " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ APP _ TOKEN Ġ= Ġ" app Token " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ KS Ġ= Ġ" ks " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ USER _ ID Ġ= Ġ" user _ id " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ KS _ EXPI RES Ġ= Ġ" ks _ expires " Ġ// Ġin Ġseconds ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ DEVICE _ ID Ġ= Ġ" device _ id " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNAMES PACE Ġ= Ġ" ch - media - login " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġurl Reg Ex Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . compile (" https :// \\ S + \\. quick line \\. ch / login / \\ S +/ ch media / trusted Login ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Regex () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTest URL Mask Ġ= Ġ" one plus :// test Login " ĊĊĠĠĠĠĠĠĠ Ġ// Ġcant Ġtake Ġit Ġfrom ĠConnection Manager , ĠComponent Provider . getInstance () Ġcall Ġis Ġneeded Ġanyway Ġto Ġinit Ġit ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠhttpClient Ġby Ġlazy Ġ{ ĠComponent Provider . getInstance (). application Component . general HttpClient Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfetch Url ( url : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠhttpClient . do Post ( url , Ġmutable Map Of < String , ĠString >(), Ġmap Of (" Content - Type " Ġto Ġ" application / json ")) ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ