/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC . Ċ Ġ* Ċ Ġ* ĠThis Ġcode Ġmay Ġonly Ġbe Ġused Ġunder Ġthe ĠBSD Ġstyle Ġlicense Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / LICENSE . txt Ċ Ġ* Ċ Ġ* ĠCode Ġdistributed Ġby ĠGoogle Ġas Ġpart Ġof Ġthis Ġproject Ġis Ġalso Ġsubject Ġto Ġan Ġadditional ĠIP Ġrights Ċ Ġ* Ġgrant Ġfound Ġat Ċ Ġ* Ġhttp :// polymer . github . io / PAT ENTS . txt Ċ Ġ*/ Ċ Ċ package Ġar cs . android . storage . service Ċ Ċ import Ġandroid . os . IB inder Ċ import Ġar cs . android . storage . Storage Service Message Proto Ċ import Ġar cs . android . storage . decode Ċ import Ġar cs . android . storage . decode Storage Service Message Proto Ċ import Ġar cs . android . storage . to Proto Ċ import Ġar cs . core . storage . Storage Key Ċ import Ġar cs . core . storage . Unt yped Active Store Ċ import Ġar cs . core . storage . Unt yped Proxy Message Ċ import Ġar cs . core . util . statistics . Transaction Statistics Sink Ċ import Ġar cs . flags . Build Flag Disabled Error Ċ import Ġar cs . flags . Build Flags Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ Ċ /** ĠImplementation Ġof Ġ[ I Storage Channel ] Ġfor Ġcommunic ating Ġwith Ġan Ġ[ Unt yped Active Store ]. Ġ*/ Ċ class ĠStorage Channel Impl ( ĊĠ Ġval Ġstore : ĠUnt yped Active Store , ĊĠ Ġscope : ĠCor outine Scope , ĊĠ Ġprivate Ġval Ġstatistics Sink : ĠTransaction Statistics Sink , ĊĠ Ġprivate Ġval Ġlistener Token : ĠInt , ĊĠ Ġ/** ĠCallback Ġto Ġtrigger Ġwhen Ġchannel Ġcloses . Ġ*/ ĊĠ Ġprivate Ġval ĠonClose Callback : Ġsuspend Ġ( Storage Key ) Ġ-> ĠUnit , ĊĠ Ġ/** ĠCallback Ġto Ġtrigger Ġwhen Ġa Ġproxy Ġmessage Ġhas Ġbeen Ġreceived Ġand Ġsent Ġto Ġthe Ġstore . Ġ*/ ĊĠ Ġprivate Ġval Ġon Proxy Message Callback : Ġsuspend Ġ( Storage Key , ĠUnt yped Proxy Message ) Ġ-> ĠUnit Ċ ) Ġ: ĠBase Storage Channel ( scope , Ġstatistics Sink ) Ġ{ ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġif Ġ(! Build Flags . STORAGE _ SERVICE _ NG ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠBuild Flag Disabled Error (" STORAGE _ SERVICE _ NG ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġoverride Ġval Ġtag Ġ= Ġ" Storage Channel " ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAn Ġimplementation Ġof Ġ[ IB inder . Death Recipient ] Ġthat Ġwill Ġremove Ġa Ġstore Ġcallback Ġif Ġthe Ġclient ĊĠĠ Ġ* Ġprocess Ġthat Ġadded Ġit Ġdi ed . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThis Ġis Ġlinked Ġwhen Ġthe Ġcallback Ġis Ġattached , Ġand Ġun linked Ġfrom Ġdeath Ġwhen Ġthe Ġcallback Ġis ĊĠĠ Ġ* Ġremoved . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġdeath Recipient Ġ= ĠI Binder . Death Recipient Ġ{ ĊĠĠĠ Ġ// ĠLaunch Ġthis Ġon Ġthe Ġaction Ġlauncher , Ġso Ġit Ġhappens Ġafter Ġany Ġregist rations Ġthat Ġmay ĊĠĠĠ Ġ// Ġbe Ġin Ġflight . ĊĠĠĠ Ġaction Launcher . launch Ġ{ ĊĠĠĠĠĠ Ġstore . off ( listener Token ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠsendMessage ( encoded Message : ĠByteArray , Ġresult Callback : ĠI Result Callback ) Ġ{ ĊĠĠĠ Ġaction Launcher . launch Ġ{ ĊĠĠĠĠĠ Ġstatistics Sink . trace And Measure ("$ tag . sendMessage ") Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Callback . wrap Exception (" sendMessage Ġfailed ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcheck Channel Is Open () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġproto Ġ= Ġencoded Message . decode Storage Service Message Proto () ĊĠĠĠĠĠĠĠĠĠ Ġrequire ( proto . message Case Ġ== ĠStorage Service Message Proto . Message Case . PROXY _ MESSAGE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġa ĠProxy Message Proto , Ġbut Ġreceived Ġ${ proto . message Case }" ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġproto . proxy Message . decode () ĊĠĠĠĠĠĠĠĠĠ Ġstore . on Proxy Message ( message . with Id ( listener Token )) ĊĠĠĠĠĠĠĠĠĠ Ġon Proxy Message Callback ( store . storage Key , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġidle Store () Ġ{ ĊĠĠĠ Ġstore . idle () ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġclose () Ġ{ ĊĠĠĠ Ġstore . off ( listener Token ) ĊĠĠĠ Ġthis . as Binder (). unlink To Death ( death Recipient , ĠUN LINK _ TO _ DE ATH _ FLAGS ) ĊĠĠĠ ĠonClose Callback ( store . storage Key ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ// ĠThe Ġdocumentation Ġprovides Ġno Ġinformation Ġabout Ġthese Ġflags , Ġand Ġany Ġexamples Ġseem Ġto ĊĠĠĠ Ġ// Ġalways Ġuse Ġ 0 , Ġso Ġwe Ġuse Ġ 0 Ġhere . ĊĠĠĠ Ġconst Ġval ĠUN LINK _ TO _ DE ATH _ FLAGS Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠLINK _ TO _ DE ATH _ FLAGS Ġ= Ġ 0 ĊĊĠĠĠ Ġsuspend Ġfun Ġcreate ( ĊĠĠĠĠĠ Ġstore : ĠUnt yped Active Store , ĊĠĠĠĠĠ Ġscope : ĠCor outine Scope , ĊĠĠĠĠĠ Ġstatistics Sink : ĠTransaction Statistics Sink , ĊĠĠĠĠĠ Ġmessage Callback : ĠI Message Callback , ĊĠĠĠĠĠ ĠonClose Callback : Ġsuspend Ġ( Storage Key ) Ġ-> ĠUnit , ĊĠĠĠĠĠ Ġon Proxy Message Callback : Ġsuspend Ġ( Storage Key , ĠUnt yped Proxy Message ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠStorage Channel Impl Ġ{ ĊĠĠĠĠĠ Ġval Ġlistener Token Ġ= Ġstore . on Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠ Ġmessage Callback . on Message ( ĊĠĠĠĠĠĠĠĠĠ ĠStorage Service Message Proto . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Proxy Message ( message . to Proto ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toByteArray () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĠStorage Channel Impl ( ĊĠĠĠĠĠĠĠ Ġstore , ĊĠĠĠĠĠĠĠ Ġscope , ĊĠĠĠĠĠĠĠ Ġstatistics Sink , ĊĠĠĠĠĠĠĠ Ġlistener Token , ĊĠĠĠĠĠĠĠ ĠonClose Callback , ĊĠĠĠĠĠĠĠ Ġon Proxy Message Callback ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . as Binder (). link To Death ( it . death Recipient , ĠLINK _ TO _ DE ATH _ FLAGS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ