package Ġcom . alg ol ia . instant search . voice . ui Ċ Ċ import Ġandroid . Manifest . permission . RECORD _ AUDIO Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . alg ol ia . instant search . voice . R Ċ import Ġcom . google . android . material . sn ackbar . Base Transient Bottom Bar Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ Ċ /** ĠHelper Ġfunctions Ġfor Ġvoice Ġpermission Ġhandling . Ġ*/ Ċ object ĠVoice Ġ{ ĊĊĠĠĠ Ġconst Ġval ĠPermission Request Record Audio Ġ= Ġ 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġwhether Ġthe Ġ[ permission Ġresults ][ grant Result ] Ġconfirm Ġit Ġhas Ġbeen Ġ[ gr anted ][ PackageManager . PERMISSION _ GRAN TED ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġis Permission Granted ( grant Result : ĠInt Array ) Ġ= ĊĠĠĠĠĠĠĠ Ġgrant Result [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĊĠĠĠ Ġ/** ĠGets Ġwhether Ġthe Ġ[ request 's Ġcode ][ request Code ] Ġand Ġ[ results ][ grant Results ] Ġare Ġvalid , Ġby Ġrespectively Ġchecking ĊĠĠĠĠ Ġ* Ġthat Ġit Ġmatches Ġthe Ġ[ request Ġidentifier ][ Permission Request Record Audio ] Ġand Ġthat Ġthey Ġare Ġnot Ġempty . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġis Record Permission With Results ( request Code : ĠInt , Ġgrant Results : ĠInt Array ) Ġ= ĊĠĠĠĠĠĠĠ Ġrequest Code Ġ== ĠPermission Request Record Audio Ġ&& Ġgrant Results . isNotEmpty () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġwhether Ġyour Ġapplication Ġwas Ġgranted Ġthe Ġ[ recording Ġpermission ][ RECORD _ AUDIO ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠContext . is Record Audio Permission Granted () Ġ= ĊĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( this , ĠREC ORD _ AUDIO ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġwhether Ġyour Ġactivity Ġshould Ġshow ĠUI Ġwith Ġr ationale Ġfor Ġrequesting Ġthe Ġ[ recording Ġpermission ][ RECORD _ AUDIO ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠActivity . should Explain Permission () Ġ= ĊĠĠĠĠĠĠĠ ĠActivity Compat . should Show Request Permission R ationale ( this , ĠREC ORD _ AUDIO ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġthe Ġ[ recording Ġpermission ][ RECORD _ AUDIO ] Ġfrom Ġyour Ġactivity .*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠActivity . request Recording Permission () Ġ{ ĊĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( RECORD _ AUDIO ), ĠPermission Request Record Audio ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠOpen s Ġthe Ġapplication 's Ġsettings Ġfrom Ġa Ġgiven Ġcontext , Ġso Ġthe Ġuser Ġcan Ġenable Ġthe Ġrecording Ġpermission .*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠContext . open AppSettings () Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( Settings . ACTION _ APPLICATION _ DETAILS _ SETTINGS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setData ( Uri . from Parts (" package ", ĠpackageName , Ġnull )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠDisplays Ġthe Ġr ationale Ġbehind Ġrequesting Ġthe Ġrecording Ġpermission Ġvia Ġa ĠSn ackbar . ĊĠĠĠĠ Ġ* Ġ@ param Ġanchor Ġthe Ġview Ġon Ġwhich Ġthe ĠSn ackBar Ġwill Ġbe Ġan ch ored . ĊĠĠĠĠ Ġ* Ġ@ param Ġwhy Allow Ġa Ġdescription Ġof Ġwhy Ġthe Ġpermission Ġshould Ġbe Ġgranted . ĊĠĠĠĠ Ġ* Ġ@ param Ġbutton Allow Ġa Ġcall Ġto Ġaction Ġfor Ġgrant ing Ġthe Ġpermission . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun ĠActivity . show Permission R ationale ( ĊĠĠĠĠĠĠĠ Ġanchor : ĠView , ĊĠĠĠĠĠĠĠ Ġwhy Allow : ĠCharSequence ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġbutton Allow : ĠCharSequence ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwhy Text Ġ= Ġwhy Allow Ġ?: ĠgetString ( R . string . permission _ ration ale ) ĊĠĠĠĠĠĠĠ Ġval Ġbutton Text Ġ= Ġ( button Allow Ġ?: ĠgetString ( R . string . permission _ button _ again )) ĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( anchor , Ġwhy Text , ĠSn ackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( button Text ) Ġ{ Ġrequest Recording Permission () Ġ}. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGu ides Ġthe Ġuser Ġto Ġmanually Ġenable Ġrecording Ġpermission Ġin Ġthe Ġapp 's Ġsettings . ĊĠĠĠĠ Ġ* Ġ@ param Ġanchor Ġthe Ġview Ġon Ġwhich Ġthe ĠSn ackBar Ġwill Ġbe Ġan ch ored . ĊĠĠĠĠ Ġ* Ġ@ param Ġwhy Enable Ġa Ġdescription Ġof Ġwhy Ġthe Ġpermission Ġshould Ġbe Ġenabled . ĊĠĠĠĠ Ġ* Ġ@ param Ġbutton Enable Ġa Ġcall Ġto Ġaction Ġfor Ġenabling Ġthe Ġpermission . ĊĠĠĠĠ Ġ* Ġ@ param Ġhow Enable Ġinstructions Ġto Ġmanually Ġenable Ġthe Ġpermission Ġin Ġsettings . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġshow Permission Manual Instructions ( ĊĠĠĠĠĠĠĠ Ġanchor : ĠView , ĊĠĠĠĠĠĠĠ Ġwhy Enable : ĠCharSequence ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġbutton Enable : ĠCharSequence ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġhow Enable : ĠCharSequence ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġanchor . context ĊĠĠĠĠĠĠĠ Ġval Ġwhy Text Ġ= Ġ( why Enable Ġ?: Ġcontext . getText ( R . string . permission _ enable _ ration ale )) ĊĠĠĠĠĠĠĠ Ġval Ġbutton Text Ġ= Ġ( button Enable Ġ?: Ġcontext . getText ( R . string . permission _ button _ enable )) ĊĠĠĠĠĠĠĠ Ġval Ġhow Text Ġ= Ġ( how Enable Ġ?: Ġcontext . getText ( R . string . permission _ enable _ instructions )) ĊĊĠĠĠĠĠĠĠ Ġval Ġsn ackbar Ġ= ĠSn ackbar . make ( anchor , Ġwhy Text , ĠSn ackbar . LENGTH _ LONG ). setAction ( button Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( anchor , Ġhow Text , ĠSn ackbar . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Callback ( object Ġ: ĠBase Transient Bottom Bar . Base Callback < Snackbar >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Dis missed ( transient Bottom Bar : ĠSn ackbar ?, Ġevent : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . open AppSettings () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsn ackbar . view . findViewById < TextView >( R . id . sn ackbar _ text ). max Lines Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġsn ackbar . show () ĊĠĠĠ Ġ} Ċ }