/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 Ġå¤§ åīį èī¯ ä»ĭ Ġ( OH MA E ĠR y os uke ) Ċ Ġ* Ċ Ġ* ĠThis Ġsoftware Ġis Ġreleased Ġunder Ġthe ĠMIT ĠLicense . Ċ Ġ* Ġhttp :// opensource . org / licenses / MIT Ċ Ġ*/ Ċ Ċ package Ġnet . mm 2 d . orientation . tabs Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroidx . browser . custom tabs . Custom Tabs Callback Ċ import Ġandroidx . browser . custom tabs . Custom Tabs Client Ċ import Ġandroidx . browser . custom tabs . Custom Tabs Service Connection Ċ import Ġandroidx . browser . custom tabs . Custom Tabs Session Ċ import Ġandroidx . lifecycle . Process Lifecycle Owner Ċ Ċ @ Suppress Lint (" Static Field Leak ") Ċ object ĠCustom Tabs Helper Ġ: ĠCustom Tabs Service Connection () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠP REFER RED _ PACK AGES Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġ" com . android . chrome ", Ġ// ĠChrome ĊĠĠĠĠĠĠĠ Ġ" org . mozilla . firefox ", Ġ// ĠFirefox ĊĠĠĠĠĠĠĠ Ġ" com . microsoft . em mx ", Ġ// ĠMicrosoft ĠEdge ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ CUSTOM _ TAB S _ CONNECTION Ġ= ĊĠĠĠĠĠĠĠ Ġ" android . support . custom tabs . action . Custom Tabs Service " ĊĠĠĠ Ġvar ĠpackageName To Bind : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġfun Ġfind PackageName ToUse ( context : ĠContext ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ ĠpackageName To Bind Ġ= Ġfind PackageName ToUse Inner ( context ) ĊĠĠĠĠĠĠĠ Ġreturn ĠpackageName To Bind ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind PackageName ToUse Inner ( context : ĠContext ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbrowsers Ġ= ĠOpen Uri Utils . get Browser Packages ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġcandidate Ġ= Ġcontext . package Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. query Intent Services ( Intent ( ACTION _ CUSTOM _ TAB S _ CONNECTION ), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . service Info ?. packageName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġbrowsers . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( candidate . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( candidate . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcandidate [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠOpen Uri Utils . getDefault Browser Package ( context ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( candidate . contains ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠP REFER RED _ PACK AGES . find Ġ{ Ġcandidate . contains ( it ) Ġ} Ġ?: Ġcandidate [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontext : ĠContext ĊĠĠĠ Ġprivate Ġvar Ġbound : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġvar Ġsession : ĠCustom Tabs Session ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġfun Ġinitialize ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . context Ġ= Ġcontext . application Context ĊĠĠĠĠĠĠĠ ĠProcess Lifecycle Owner . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. lifecycle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Observer ( Custom Tabs Binder ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġbind () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! bound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġfind PackageName ToUse ( context ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbound Ġ= ĠCustom Tabs Client . bind Custom Tabs Service ( context , ĠpackageName , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġun bind () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . unbind Service ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbound Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Custom Tabs Service Connected ( name : ĠComponent Name , Ġclient : ĠCustom Tabs Client ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . warm up ( 0 ) ĊĠĠĠĠĠĠĠ Ġsession Ġ= Ġclient . new Session ( Custom Tabs Callback ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( name : ĠComponent Name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsession Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ