/** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠSK ĠTele com ĠCo ., ĠLtd . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp : www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . sk t . n ugu . sample app . activity Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . net . Network Info Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . design . widget . Navigation View Ċ import Ġandroid . support . v 4 . widget . Drawer Layout Ċ import Ġandroid . support . v 7 . app . ActionBar Drawer Toggle Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroid . widget . TextView Ċ import Ġcom . sk t . n ugu . sdk . agent . aud iop layer . Audio Player Agent Interface Ċ import Ġcom . sk t . n ugu . sdk . core . interfaces . connection . Connection Status Listener Ċ import Ġcom . sk t . n ugu . sdk . platform . android . ux . widget . N ugu Snackbar Ċ import Ġcom . sk t . n ugu . sdk . platform . android . speech re cognizer . Speech Recognizer Aggregator Ċ import Ġcom . sk t . n ugu . sdk . platform . android . speech re cognizer . Speech Recognizer Aggregator Interface Ċ import Ġcom . sk t . n ugu . sdk . platform . android . login . auth . N ugu OAuth Ċ import Ġcom . sk t . n ugu . sample app . Build Config Ċ import Ġcom . sk t . n ugu . sample app . R Ċ import Ġcom . sk t . n ugu . sample app . client . Client Manager Ċ import Ġcom . sk t . n ugu . sample app . client . Exponent ial Back Off Ċ import Ġcom . sk t . n ugu . sample app . client . Token Refresh er Ċ import Ġcom . sk t . n ugu . sample app . service . Music Player Service Ċ import Ġcom . sk t . n ugu . sample app . template . Template Fragment Ċ import Ġcom . sk t . n ugu . sample app . template . Template Renderer Ċ import Ġcom . sk t . n ugu . sample app . utils .* Ċ import Ġcom . sk t . n ugu . sample app . widget . Chrome Window Controller Ċ import Ġcom . sk t . n ugu . sdk . agent . system . System Agent Interface Ċ import Ġcom . sk t . n ugu . sdk . platform . android . login . auth . Credentials Ċ import Ġcom . sk t . n ugu . sdk . platform . android . login . auth . N ugu OAuth Error Ċ import Ġcom . sk t . n ugu . sdk . platform . android . ux . widget . N ugu Button Ċ import Ġcom . sk t . n ugu . sdk . platform . android . ux . widget . N ugu Toast Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠSpeech Recognizer Aggregator Interface . On State ChangeListener , ĊĠĠĠ ĠNavigation View . On Navigation ItemSelected Listener ĊĠĠĠ Ġ, ĠConnection Status Listener ĊĠĠĠ Ġ, ĠAudio Player Agent Interface . Listener ĊĠĠĠ Ġ, ĠSystem Agent Interface Listener ĊĠĠĠ Ġ, ĠToken Refresh er . Listener Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" MainActivity " ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpermissions Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . Manifest . permission . RECORD _ AUDIO ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġrequest Code Ġ= Ġ 1 0 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġinvoke Activity ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( Intent ( context , ĠMainActivity :: class . java )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠNotification Type Ġ{ ĊĠĠĠĠĠĠĠ ĠTO AST , ĠV O ICE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġnotification Type Ġ= ĠNotification Type . TO AST ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġconnection Status : ĠConnection Status Listener . Status Ġ= ĠConnection Status Listener . Status . DIS CONNECTED ĊĊĠĠĠ Ġprivate Ġval Ġbtn Start Listening : ĠN ugu Button Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠfindViewById < N ugu Button >( R . id . fab ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġdrawer Layout : ĠDraw er Layout Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠfindViewById < Drawer Layout >( R . id . drawer _ layout ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġnav View : ĠNavigation View Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠfindViewById < Navigation View >( R . id . nav _ view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġversion : ĠTextView Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . tv _ version ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtool Bar : Ġandroid . support . v 7 . widget . Toolbar Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠfindViewById < android . support . v 7 . widget . Toolbar >( R . id . toolbar ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġon Request Permission Result Handler : ĠOn Request Permission Result Handler Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠOn Request Permission Result Handler ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġchrome Window Controller : ĠChrome Window Controller ĊĊĠĠĠ Ġprivate Ġval Ġspeech Recognizer Aggregator : ĠSpeech Recognizer Aggregator Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠClient Manager . speech Recognizer Aggregator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtemplate Renderer Ġ= ĠTemplate Renderer ( support FragmentManager , ĠR . id . template _ container ) ĊĠĠĠ Ġprivate Ġval Ġtoken Refresh er Ġ= ĠToken Refresh er ( N ugu OAuth . getClient ()) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġinit Btn Listeners () ĊĠĠĠĠĠĠĠ ĠSound Pool Compat . load ( this ) ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġobserver Ġfor Ġconnection ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). add Connection Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġobserver Ġfor Ġaud iop layer ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). add Audio Player Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġa Ġrenderer Ġfor Ġdisplay Ġagent . ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). set Display Renderer ( template Renderer ) ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġlistener Ġfor Ġsystem Ġagent . ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). add System Agent Listener ( this ) ĊĊĠĠĠĠĠĠĠ Ġchrome Window Controller Ġ= ĠChrome Window Controller ( this , Ġobject Ġ: ĠChrome Window Controller . On Chrome Window Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Expand Started () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( btn Start Listening . is Fab ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Start Listening . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ/* ĠType Ġis Ġbutton Ġ*/ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Start Listening . is Activated Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Hidden Finished () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( btn Start Listening . is Fab ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Start Listening . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ/* ĠType Ġis Ġbutton Ġ*/ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Start Listening . is Activated Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeech Recognizer Aggregator . stop Listening () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspeech Recognizer Aggregator . addListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Manager . getClient (). add Dialog UX State Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Manager . getClient (). add AS R Result Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Manager . getClient (). tts Agent ?. addListener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġversion . text Ġ= Ġ" v ${ Build Config . VERSION _ NAME }" ĊĊĠĠĠĠĠĠĠ Ġtoken Refresh er . set Listener ( this ) ĊĠĠĠĠĠĠĠ Ġtoken Refresh er . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ"[ on Resume ]") ĊĠĠĠĠĠĠĠ Ġif Ġ( Preference Helper . trigger Id ( this ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Manager . keyword Detector ?. keyword Resource Ġ= ĠClient Manager . aria Resource ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Manager . keyword Detector ?. keyword Resource Ġ= ĠClient Manager . t inker bell Resource ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġspeech Recognizer Aggregator . addListener ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck ĠPermission ĊĠĠĠĠĠĠĠ Ġif Ġ(! Permission Utils . check Permissions ( this , Ġpermissions )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Request Permission Result Handler . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠOn Request Permission Result Handler . On Permission Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Granted () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Start Listening With Trigger () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Denied () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Canceled () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Start Listening With Trigger () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġconnect Ġto Ġserver ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). connect () ĊĠĠĠĠĠĠĠ Ġ// Ġupdate Ġview ĊĠĠĠĠĠĠĠ Ġupdate View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Start Listening With Trigger () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Preference Helper . enable N ugu ( this ) Ġ&& ĠPreference Helper . enable Trigger ( this ) Ġ&& Ġ! speech Recognizer Aggregator . isActive ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspeech Recognizer Aggregator . start Listening With Trigger () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ"[ on Pause ]") ĊĠĠĠĠĠĠĠ Ġspeech Recognizer Aggregator . remove Listener ( this ) ĊĠĠĠĠĠĠĠ Ġspeech Recognizer Aggregator . stop () ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġchrome Window Controller . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspeech Recognizer Aggregator . remove Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Manager . getClient (). remove Dialog UX State Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Manager . getClient (). remove AS R Result Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Manager . getClient (). tts Agent ?. remove Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠSound Pool Compat . release () ĊĠĠĠĠĠĠĠ ĠMusic Player Service . stop Service ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġclear Ġa Ġrenderer Ġfor Ġdisplay Ġagent . ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). set Display Renderer ( null ) ĊĠĠĠĠĠĠĠ Ġ// Ġremove Ġobserver Ġfor Ġconnection ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). remove Connection Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ// Ġremove Ġlistener Ġfor Ġsystem agent ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). remove System Agent Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ// Ġshutdown Ġa Ġserver ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). shutdown () ĊĊĠĠĠĠĠĠĠ Ġtoken Refresh er . stop () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( chrome Window Controller . is Shown ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchrome Window Controller . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( clear All Templates ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear All Templates (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . fragments . filter Ġ{ Ġit Ġ!= Ġnull Ġ&& Ġit Ġis ĠTemplate Fragment Ġ}. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ĠTemplate Fragment ). close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . isNotEmpty ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠForward Ġresults Ġto ĠPermission Utils ĊĠĠĠĠĠĠĠ Ġon Request Permission Result Handler . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Btn Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġbtn Start Listening . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Permission Utils . check Permissions ( this , Ġpermissions )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Request Permission Result Handler . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠOn Request Permission Result Handler . On Permission Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Granted () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeech Recognizer Aggregator . start Listening () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Denied () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ"[ request Permissions :: on Denied ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Canceled () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ"[ request Permissions :: on Canceled ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeech Recognizer Aggregator . start Listening () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAction Bar Drawer Toggle ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtool Bar , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawer Layout . add Drawer Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync State () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnav View . set Navigation ItemSelected Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġspeech Recognizer Aggregator State : ĠSpeech Recognizer Aggregator Interface . State Ġ= ĊĠĠĠĠĠĠĠ ĠSpeech Recognizer Aggregator Interface . State . WAIT ING ĊĊĠĠĠ Ġoverride Ġfun Ġon StateChanged ( state : ĠSpeech Recognizer Aggregator Interface . State ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ"[ on StateChanged ::$ state ]") ĊĠĠĠĠĠĠĠ Ġif Ġ( speech Recognizer Aggregator State Ġ!= Ġstate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSpeech Recognizer Aggregator Interface . State . EXPECT ING _ SPE E CH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Volume Utils . is Mute ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Toast . with ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . volume _ mute ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. y Offset ( findViewById < Frame Layout >( R . id . fl _ bottom _ sheet ). height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. duration ( N ugu Toast . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠSpeech Recognizer Aggregator Interface . State . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Start Listening With Trigger () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġspeech Recognizer Aggregator State Ġ= Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Navigation ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nav _ setting Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Activity . invoke Activity ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate View () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġenabled Ġstate Ġof Ġthis Ġ[ btn Start Listening ] ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Preference Helper . enable N ugu ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Start Listening . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run On Ui Thread ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Start Listening . isEnabled Ġ= Ġis Connected () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! chrome Window Controller . is Shown ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Start Listening . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Start Listening . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Connected (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconnection Status Ġ== ĠConnection Status Listener . Status . CONNECTED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Connection Status Changed ( status : ĠConnection Status Listener . Status , Ġreason : ĠConnection Status Listener . Changed Reason ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( connection Status Ġ!= Ġstatus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Status Ġ= Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠConnection Status Listener . Status . CONNECT ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( reason ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . UN RE COVER ABLE _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . DNS _ TIME DOUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . CONNECTION _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . CONNECTION _ TIME DOUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . REQUEST _ TIME DOUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . PING _ TIME DOUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . FAILURE _ PROTOCOL _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . INTERNAL _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . SERVER _ INTERNAL _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . SERVER _ SIDE _ DIS CONNECT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . SERVER _ ENDPOINT _ CHANGED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġchecking Ġconnection Ġstatus Ġfor Ġdebugging . Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" reconnect ing ( reason =$ reason )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ/* Ġnothing Ġto Ġdo Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( status Ġ== ĠConnection Status Listener . Status . DIS CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( reason ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . NONE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . SUCCESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . CLIENT _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . SERVER _ ENDPOINT _ CHANGED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġno Ġerror Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . UN RE COVER ABLE _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . DNS _ TIME DOUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . CONNECTION _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . CONNECTION _ TIME DOUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . REQUEST _ TIME DOUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . PING _ TIME DOUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . FAILURE _ PROTOCOL _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . INTERNAL _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . SERVER _ INTERNAL _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . SERVER _ SIDE _ DIS CONNECT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġonly Ġserver - initi ative - directive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġyou Ġwant Ġto Ġreconnect Ġto Ġthe Ġserver , Ġrun Ġthe Ġcode Ġbelow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠBut Ġit Ġcan Ġbe Ġrecursive , Ġso Ġyou Ġneed Ġto Ġmanage Ġthe Ġcount Ġof Ġattempts . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( N ugu OAuth . getClient (). is Sid Supported ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExp onent ial Back Off . await Connected And Retry ( this , Ġobject Ġ: ĠExp onent ial Back Off . Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Retry () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClient Manager . getClient (). disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClient Manager . getClient (). connect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( reason : ĠExp onent ial Back Off . ErrorCode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Network Connected ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( notification Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Type . TO AST Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . drawer _ layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . device _ gw _ error _ 0 0 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. duration ( N ugu Snackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Type . VOICE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSound Pool Compat . play ( Sound Pool Compat . Local TT S . DEVICE _ GATE WAY _ SERVER _ ERROR _ TRY _ AG AIN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( notification Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Type . TO AST Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . drawer _ layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . device _ gw _ error _ 0 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. duration ( N ugu Snackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Type . VOICE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSound Pool Compat . play ( Sound Pool Compat . Local TT S . DEVICE _ GATE WAY _ NETWORK _ ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Status Listener . Changed Reason . INVALID _ AUTH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠAuthentication Ġfailed ĠPlease Ġrefresh Ġyour Ġaccess _ token . Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperform Re voke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( status Ġ== ĠConnection Status Listener . Status . CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExp onent ial Back Off . reset () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon StateChanged ( activity : ĠAudio Player Agent Interface . State , Ġcontext : ĠAudio Player Agent Interface . Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ"[ on StateChanged - Audio Player ] Ġactivity : Ġ$ activity , Ġcontext : Ġ$ context ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity Ġ== ĠAudio Player Agent Interface . State . PLAY ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Player Service . start Service ( this , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Re voke ( reason : ĠSystem Agent Interface . Re voke Reason ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ"[ on Re voke ] ĠThe Ġdevice Ġhas Ġbeen Ġrev oked Ġ($ reason )") ĊĠĠĠĠĠĠĠ Ġperform Re voke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Exception ( code : ĠSystem Agent Interface . Exception Code , Ġdescription : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem Agent Interface . Exception Code . PLAY _ ROUT ER _ PROCESS ING _ EXCEPTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( notification Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Type . TO AST Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . drawer _ layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . device _ gw _ error _ 0 0 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. duration ( N ugu Snackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Type . VOICE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSound Pool Compat . play ( Sound Pool Compat . Local TT S . DEVICE _ GATE WAY _ PLAY _ ROUT ER _ ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem Agent Interface . Exception Code . TT S _ SPE AK ING _ EXCEPTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( notification Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Type . TO AST Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . drawer _ layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . device _ gw _ error _ 0 0 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. duration ( N ugu Snackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Type . VOICE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSound Pool Compat . play ( Sound Pool Compat . Local TT S . DEVICE _ GATE WAY _ TT S _ ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem Agent Interface . Exception Code . UN AUTHORIZ ED _ REQUEST _ EXCEPTION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠNothing Ġto Ġdo Ġbecause Ġhandle Ġon Ġ[ on Connection Status Changed ] Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPlease Ġcheck Ġif Ġyou Ġcan Ġrenew Ġthe Ġrefresh _ token Ġaccording Ġto Ġdevice Ġcondition ĊĠĠĠĠ Ġ* ĠIt Ġis Ġrecommended Ġto Ġproceed Ġto Ġthe Ġidle Ġstate . ĊĠĠĠĠ Ġ* ĠReturn Ġ{@ code Ġtrue } Ġif Ġthe Ġtoken Ġneeds Ġto Ġbe Ġrefresh _ token , ĠOtherwise , Ġit Ġis Ġcalled Ġ 3 0 Ġseconds Ġagain . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Should RefreshToken (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( chrome Window Controller . is Shown ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Credentials Changed ( credentials : ĠCredentials ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPreference Helper . credentials ( this , Ġcredentials . toString ()) ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). disconnect () ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). connect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSee Ġmore Ġdetails Ġin Ġ[ Login Activity . handle OAuth Error ] Ġ**/ ĊĠĠĠ Ġoverride Ġfun Ġon RefreshToken Error ( error : ĠN ugu OAuth Error ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" An Ġunexpected Ġerror Ġhas Ġoccurred . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Please Ġcheck Ġthe Ġlogs Ġfor Ġdetails \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ error ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( error . error Ġ== ĠN ugu OAuth Error . NETWORK _ ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . device _ gw _ error _ 0 0 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( error . code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu OAuth Error . USER _ ACCOUNT _ CLOSED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . code _ user _ account _ closed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu OAuth Error . USER _ ACCOUNT _ PA USED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . code _ user _ account _ paused ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu OAuth Error . USER _ DEVICE _ DIS CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . code _ user _ device _ disconnected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu OAuth Error . USER _ DEVICE _ UN EXPECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . code _ user _ device _ unexpected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( error . error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu OAuth Error . UN AUTHORIZ ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . error _ un authorized ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu OAuth Error . UN AUTHORIZ ED _ CLIENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . error _ un authorized _ client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu OAuth Error . INVALID _ TOKEN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . error _ invalid _ token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu OAuth Error . INVALID _ CLIENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error . description Ġ== ĠN ugu OAuth Error . FINISHED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . service _ finished ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . error _ invalid _ client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu OAuth Error . ACCESS _ DEN IED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . error _ access _ den ied ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġdetail ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠN ugu Snackbar . with ( findViewById ( R . id . base Layout )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . device _ gw _ error _ 0 0 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġperform Re voke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġperform Re voke () Ġ{ ĊĠĠĠĠĠĠĠ ĠClient Manager . getClient (). disconnect () ĊĠĠĠĠĠĠĠ ĠN ugu OAuth . getClient (). clear Authorization () ĊĠĠĠĠĠĠĠ ĠPreference Helper . credentials ( this @ MainActivity , Ġ"") ĊĠĠĠĠĠĠĠ ĠLogin Activity . invoke Activity ( this ) ĊĠĠĠĠĠĠĠ Ġfinish Affinity () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Network Connected (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconn Mgr Ġ= Ġthis @ MainActivity . getSystem Service ( Context . CONNECT IVITY _ SERVICE ) Ġas ĠConnect ivity Manager ĊĠĠĠĠĠĠĠ Ġval Ġactive Network Info : ĠNetwork Info ? Ġ= Ġconn Mgr . active Network Info ĊĠĠĠĠĠĠĠ Ġreturn Ġactive Network Info ?. isConnected Ġ?: Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ