package Ġcom . nx g . app . data . source . local Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . app search . app .* Ċ import Ġandroidx . app search . exceptions . App Search Exception Ċ import Ġandroidx . app search . local storage . LocalStorage Ċ import Ġcom . google . common . util . concurrent . Future Callback Ċ import Ġcom . google . common . util . concurrent . F utures Ċ import Ġcom . nx g . app . data . Audio Record Doc Ċ import Ġcom . nx g . app . data . source . I Audio Record Doc DataSource Ċ import Ġcom . nx g . aud i ore cord . Log Util Ċ import Ġjava . util . concurrent . Linked BlockingQueue Ċ import Ġjava . util . concurrent . ThreadPoolExecutor Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠApp Search æķ°æį® æºĲ Ċ Ġ*/ Ċ class ĠAudio Record Doc Local DataSource Ġ@ Inject Ġconstructor ( context : ĠContext ) Ġ: ĊĠĠĠ ĠI Audio Record Doc DataSource Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Audio Record Local DataSource " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDATABASE _ NAME Ġ= Ġ" audio _ record _ master _ app " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNAME _ SPACE Ġ= Ġ" Audio Record NP " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä½¿çĶ¨ æĹł çķĮ éĺŁåĪĹ ï¼Ī å¦Ĥ ĠLinked BlockingQueue ï¼ī ä½ľä¸º çŃīå¾ħ éĺŁåĪĹ ï¼Į å½ĵ æīĢæľīçļĦ æł¸å¿ĥ çº¿ç¨ĭ éĥ½ åľ¨ å¤ĦçĲĨ ä»»åĬ¡ æĹ¶ ï¼Į ĊĠĠĠĠ Ġ* Ġ æĸ° æıĲäº¤ çļĦ ä»»åĬ¡ éĥ½ä¼ļ è¿Ľåħ¥ éĺŁåĪĹ çŃīå¾ħ ãĢĤ åĽłæŃ¤ ï¼Į ä¸įä¼ļ æľī å¤§äºİ Ġcore PoolSize ĠçļĦ çº¿ç¨ĭ ä¼ļ è¢« åĪĽå»º ï¼Ī maximum PoolSize Ġ ä¹Ł å°Ĩ å¤± åİ» ä½ľçĶ¨ ï¼īãĢĤ ĊĠĠĠĠ Ġ* Ġ è¿Ļç§į çŃĸçķ¥ éĢĤ åĲĪ æ¯ıä¸ª ä»»åĬ¡ éĥ½ å®Įåħ¨ çĭ¬ç«ĭ äºİ åħ¶ä»ĸ ä»»åĬ¡ çļĦ æĥħåĨµ ï¼Ľ ä¾ĭå¦Ĥ ç½ĳç«Ļ æľįåĬ¡åĻ¨ ãĢĤ ĊĠĠĠĠ Ġ* Ġ è¿Ļç§į ç±»åŀĭçļĦ çŃīå¾ħ éĺŁåĪĹ åı¯ä»¥ ä½¿ ç ŀ ¬ éĹ´ çĪ Ĩ åıĳ çļĦ é«ĺ é¢ĳ è¯·æ±Ĥ åıĺ å¾Ĺ å¹³ æ»ĳ ãĢĤ ĊĠĠĠĠ Ġ* Ġå½ĵ ä»»åĬ¡ æĮģ ç»Ń åĪ° è¾¾ çļĦ å¹³åĿĩ éĢŁåº¦ è¶ħè¿ĩ åı¯ å¤ĦçĲĨ éĢŁåº¦ æĹ¶ ï¼Į åı¯èĥ½ å¯¼èĩ´ çŃīå¾ħ éĺŁåĪĹ æĹł éĻĲ å¢ŀ éķ¿ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Executor Ġ= ĠThreadPool Executor ( ĊĠĠĠĠĠĠĠĠ 4 , Ġ 4 , Ġ 3 0 L , ĠTimeUnit . SECONDS , ĠLinked BlockingQueue () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOpen Ġa Ġdatabase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġsession Future Ġ= ĠLocal Storage . create Search Session ( ĊĠĠĠĠĠĠĠ ĠLocal Storage . Search Context . Builder ( context , Ġ/* database Name =*/ DATABASE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġa Ġschema ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Schema () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġset Schema Request Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSet Schema Request . Builder (). add Document Classes ( Audio Record Doc :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġset Schema Future Ġ= ĠF utures . transform Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Future , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġsession Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession ?. set Schema ( set Schema Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġm Executor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcreate Audio Record Doc ( a : ĠAudio Record Doc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġput Audio Record ( a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate Audio Record Doc ( a : ĠAudio Record Doc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġput Audio Record ( a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġread Audio Record Doc ( ĊĠĠĠĠĠĠĠ Ġquery Expression : ĠString , ĊĠĠĠĠĠĠĠ Ġfuture Callback : ĠFuture Callback < SearchResults > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġquery Audio Record ( query Expression , Ġfuture Callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete Audio Record Doc ( ids : ĠCollection < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Audio Record ( ids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPut Ġa Ġdocument Ġin Ġthe Ġdatabase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġput Audio Record ( audio Record Doc : ĠAudio Record Doc ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* val Ġaudio Record Doc Ġ= ĠAudio Record Schema ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace Ġ= ĠNAME _ SPACE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġaudio Record File . name , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcreateTime Ġ= Ġaudio Record File . lastModified (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġget W AV File Duration ( audio Record File . absolute Path ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath Ġ= Ġaudio Record File . absolute Path ĊĠĠĠĠĠĠĠ Ġ) */ ĊĊĠĠĠĠĠĠĠ Ġval Ġput Request Ġ= ĠPut Documents Request . Builder (). add Documents ( audio Record Doc ). build () ĊĠĠĠĠĠĠĠ Ġval Ġput Future Ġ= ĠF utures . transform Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Future , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġsession Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession ?. put ( put Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġm Executor ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠF utures . add Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Future , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠFuture Callback < App Search Batch Result < String , ĠVoid > ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠApp Search Batch Result < String , ĠVoid > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġmap Ġof Ġsuccessful Ġresults Ġfrom ĠId Ġto ĠVoid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccessful Results Ġ= Ġresult ?. suc cesses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . i ( TAG , Ġ" successful Results Ġ$ successful Results ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets Ġmap Ġof Ġfailed Ġresults Ġfrom ĠId Ġto ĠApp SearchResult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfailed Results Ġ= Ġresult ?. failures ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . i ( TAG , Ġ" failed Results Ġ$ failed Results ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . e ( TAG , Ġ" Failed Ġto Ġput Ġdocuments .", Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Executor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĮģ ä¹ħ åĮĸ åĪ° ç£ ģ çĽĺ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpersist 2 Disk () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Flush Future Ġ= ĠF utures . transform Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Future , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġsession Ġ-> Ġsession ?. request Flush () Ġ}, Ġm Executor ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠF utures . add Callback ( request Flush Future , Ġobject Ġ: ĠFuture Callback < Void ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠVoid ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSuccess ! ĠDatabase Ġupdates Ġhave Ġbeen Ġpersisted Ġto Ġdisk . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . e ( TAG , Ġ" persist 2 Disk ĠonSuccess Ġ$ result ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . e ( TAG , Ġ" Failed Ġto Ġflush Ġdatabase Ġupdates .", Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġm Executor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġremove Ġa Ġdocument Ġin Ġthe Ġdatabase ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġremove Audio Record ( ids : ĠCollection < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremove Request Ġ= ĠRemove By Document Id Request . Builder ( NAME _ SPACE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Ids ( ids ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġremove Future Ġ= ĠF utures . transform Async ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Future , Ġ{ Ġsession Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession ?. remove ( remove Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Executor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åħ³éĹŃ ä¼ļ è¯Ŀ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclose Future Ġ= ĠF utures . transform < App Search Session , ĠUnit >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Future , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġsession Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġm Executor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæł¹æį® åħ³éĶ®åŃĹ æŁ¥è¯¢ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġquery Audio Record ( ĊĠĠĠĠĠĠĠ Ġ@ NonNull Ġquery Expression : ĠString , ĊĠĠĠĠĠĠĠ Ġfuture Callback : ĠFuture Callback < SearchResults > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsearch Spec Ġ= ĠSearch Spec . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Filter Namespaces ( NAME _ SPACE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (); ĊĊĠĠĠĠĠĠĠ Ġval Ġsearch Future Ġ= ĠF utures . transform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Future , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġsession Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession ?. search ( query Expression , Ġsearch Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Executor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠF utures . add Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Future , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfuture Callback , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Executor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Future Callback Ġ= Ġobject Ġ: ĠFuture Callback < SearchResults > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( search Results : ĠSearch Results ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiterate SearchResults ( search Results ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( t : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . e ( TAG , Ġ" Failed Ġto Ġsearch Ġaudio Ġrecord Ġdoc Ġin ĠApp Search .", Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éģįåİĨ ç»ĵæŀľ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġiterate SearchResults ( search Results : ĠSearch Results ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠF utures . transform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Results ?. next Page , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġpage : ĠList < SearchResult >? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGets ĠGeneric Document Ġfrom ĠSearch Result . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeneric Document : ĠGeneric Document Ġ= Ġpage ! ![ 0 ]. generic Document ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġschema Type Ġ= Ġgeneric Document . schema Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Record Doc : ĠAudio Record Doc ? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( schema Type Ġ== ĠAudio Record Doc :: class . java . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConverts ĠGeneric Document Ġobject Ġto ĠAudio Record Doc Ġobject . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Document . to Document Class ( Audio Record Doc :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠApp Search Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Util . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġconvert ĠGeneric Document Ġto ĠNote ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Record Doc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Executor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊ Ċ }