package Ġcom . th om ask u enne th . android bu ch . call log demo Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . database . Content Observer Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . os .* Ċ import Ġandroid . provider . Call Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget .* Ċ import Ġandroid . widget . Adapter View . On ItemClickListener Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . cursor adapter . widget . Simple Cursor Adapter Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlin . concurrent . thread Ċ Ċ private Ġconst Ġval ĠREQUEST _ READ _ CALL _ LOG Ġ= Ġ 1 2 3 Ċ private Ġconst Ġval ĠREQUEST _ WRITE _ CALL _ LOG Ġ= Ġ 3 2 1 Ċ class ĠCall Log Demo Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠ Ġprivate Ġval Ġcontent Observer Ġ= Ġobject Ġ: ĠContent Observer ( handler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChange ( self Change : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Adapter () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġcontent Observer Was Registered Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcursor Adapter : ĠSimple Cursor Adapter ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġcursor Adapter Ġ= ĠSimple Cursor Adapter ( this , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . layout . simple _ list _ item _ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĠarrayOf ( Call Log . Calls . NUMBER ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( android . R . id . text 1 ), Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcursor Adapter . view Binder Ġ= ĠSimple Cursor Adapter . View Binder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠView , Ġcursor : ĠCursor , ĠcolumnIndex : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column Index Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getColumnIndex ( Call Log . Calls . NUMBER )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnumber Ġ= Ġcursor . getString ( column Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis New Ġ= Ġcursor . getInt ( cursor . getColumnIndex ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log . Calls . NEW )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNew Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Ġ+= Ġ" Ġ( ne u )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( view Ġas ĠTextView ). text Ġ= Ġnumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlist view . adapter Ġ= Ġcursor Adapter ĊĠĠĠĠĠĠĠ Ġlist view . on ItemClickListener Ġ= ĠOn ItemClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_: ĠAdapter View < *> ?, Ġ_: ĠView ?, Ġposition : ĠInt , Ġ_: ĠLong Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcursor Adapter . getItem ( position ) Ġas ĠCursor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Log Id Ġ= Ġc . getLong ( c . getColumnIndex ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log . Calls ._ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Call Log Data ( call Log Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Adapter () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġif Ġ( content Observer Was Registered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . unregister Content Observer ( content Observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( grant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ READ _ CALL _ LOG Ġ-> Ġupdate Adapter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ WRITE _ CALL _ LOG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( check Self Permission ( Manifest . permission . READ _ CALL _ LOG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( array Of ( Manifest . permission . READ _ CALL _ LOG ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ READ _ CALL _ LOG ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! content Observer Was Registered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . register Content Observer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log . Calls . CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , Ġcontent Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Observer Was Registered Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġget Mis sed Calls () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ Ġcursor Adapter . change Cursor ( c ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( check Self Permission ( Manifest . permission . WRITE _ CALL _ LOG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( array Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ CALL _ LOG ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ WRITE _ CALL _ LOG ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Security Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget Mis sed Calls (): ĠCursor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( Call Log . Calls . NUMBER , ĠCall Log . Calls . DATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log . Calls . NEW , ĠCall Log . Calls ._ ID ) ĊĠĠĠĠĠĠĠ Ġval Ġselection Ġ= ĠCall Log . Calls . TYPE Ġ+ Ġ" Ġ= Ġ? " ĊĠĠĠĠĠĠĠ Ġval Ġselection Args Ġ= ĠarrayOf ( Call Log . Calls . MIS SED _ TYPE . toString ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontent Resolver . query ( Call Log . Calls . CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprojection , Ġselection , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Args , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Call Log Data ( id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( check Self Permission ( Manifest . permission . WRITE _ CALL _ LOG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( Call Log . Calls . NEW , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwhere Ġ= ĠCall Log . Calls ._ ID Ġ+ Ġ" Ġ= Ġ? " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselection Args Ġ= ĠarrayOf ( id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . update ( Call Log . Calls . CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues , Ġwhere , Ġselection Args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }