package Ġcom . oasis f eng . is land . service Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . admin . Device Admin Service Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Service Connection Ċ import Ġandroid . content . pm . Service Info Ċ import Ġandroid . os . Build . VERSION . SDK _ INT Ċ import Ġandroid . os . Build . VERSION _ CODES . O Ċ import Ġandroid . os . Build . VERSION _ CODES . Q Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . Message Queue Ċ import Ġandroid . os . Process Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġcom . oasis f eng . is land . Persistent Service ĊĊ Ċ /** Ċ Ġ* ĠPersistent Ġhelper Ġservice . Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠO asis Ġon Ġ 2 0 1 9 - 1 0 - 1 2 . Ċ Ġ*/ Ċ @ Requires Api ( O ) Ġclass ĠIsland Persistent Service : ĠDevice Admin Service () Ġ{ ĠĠĠĠĠĠ Ġ// ĠTODO : ĠF allback Ġto Ġforeground Ġservice Ġfor Ġunmanaged Ġuser . ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Initializing Ġpersistent Ġservices ...") ĊĠĠĠĠĠĠĠ ĠL ooper . get Main Looper (). queue . add Idle Handler ( m Initializer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Persistent Services ( pkg : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Persistent Service . SERVICE _ INTERFACE ). set Package ( pkg ); Ġval Ġuid Ġ= ĠProcess . my Uid () ĊĠĠĠĠĠĠĠ Ġval Ġcandidates Ġ= Ġpackage Manager . query Intent Services ( intent , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcandidates . forEach Ġ{ Ġif Ġ( it . service Info . application Info . uid Ġ== Ġuid ) Ġbind Persistent Service ( it . service Info ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Persistent Service ( service : ĠService Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= ĠComponent Name ( service . packageName , Ġservice . name ) ĊĠĠĠĠĠĠĠ Ġval Ġcomponent Name Ġ= Ġcomponent . flatten To Short String () ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Starting Ġpersistent Ġservice : Ġ$ component Name ") ĊĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= ĠPersistent Service Connection ( component ) ĊĠĠĠĠĠĠĠ Ġm Connections . add ( connection ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Wrong Constant ") Ġval Ġresult Ġ= Ġbind Service ( Intent ( Persistent Service . SERVICE _ INTERFACE ). set Component ( component ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection , ĠB IND _ AUTO _ CREATE Ġor ĠB IND _ NOT _ FO REG ROUND Ġor Ġ( if Ġ( SDK _ INT Ġ>= ĠQ ) ĠB IND _ INCLUDE _ CAP AB IL ITIES Ġelse Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Ġresult ) ĠLog . e ( TAG , Ġ" Failed Ġto Ġstart Ġpersistent Ġservice : Ġ$ component Name ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠL ooper . get Main Looper (). queue . remove Idle Handler ( m Initializer ) ĊĠĠĠĠĠĠĠ Ġm Connections . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ġun bind Service ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĠLog . e ( TAG , Ġ" Error Ġdisconnect ing Ġ${ it . m Component }", Ġe ) Ġ}} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġun bind Service ( conn : ĠService Connection ) Ġ= Ġsuper . unbind Service ( conn ). also Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( conn Ġis ĠPersistent Service Connection ) ĠLog . i ( TAG , Ġ" Stopping Ġpersistence Ġservice : Ġ${ conn . m Component . flatten To Short String () }") Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Initializer Ġ= ĠMessage Queue . Idle Handler Ġ{ Ġfalse . also Ġ{ Ġbind Persistent Services () Ġ} Ġ} ĊĠĠĠ Ġprivate Ġval Ġm Connections Ġ= ĠArrayList < Persistent Service Connection >() ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠPersistent Service Connection ( val Ġm Component : ĠComponent Name ) Ġ: ĠService Connection Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( component : ĠComponent Name , Ġbinder : ĠI Binder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Connected : Ġ${ component . flatten To Short String () }") Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( name : ĠComponent Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Disconnected : Ġ${ name . flatten To Short String () }") Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Null Binding ( name : ĠComponent Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Qu ited : Ġ${ name . flatten To Short String () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Connections . remove ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun bind Service ( this ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Is land . PS "