package Ġcom . hol lab rowser . me force . utils Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Log Ċ import Ġandroid . webkit . WebView Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . annotation . Nullable Ċ import Ġcom . hol lab rowser . me force . R Ċ import Ġcom . hol lab rowser . me force . constant . INT ENT _ ORIGIN Ċ import Ġjava . net . UR ISyntaxException Ċ import Ġjava . util . regex . Matcher Ċ import Ġjava . util . regex . Pattern ĊĊ Ċ class ĠIntent Utils (@ field : NonNull Ġ@ param : NonNull Ġprivate Ġval Ġm Activity : ĠActivity ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtab ĊĠĠĠĠ Ġ* Ġ@ param Ġurl ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġintent For Url (@ Nullable Ġtab : ĠWebView ?, Ġ@ NonNull Ġurl : ĠString ): ĠIntent ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġintent : ĠIntent ĊĠĠĠĠĠĠĠ Ġintent Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . parse Uri ( url , ĠIntent . URI _ INT ENT _ SCHEME ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠUR ISyntaxException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" Browser ", Ġ" Bad ĠURI Ġ" Ġ+ Ġurl Ġ+ Ġ": Ġ" Ġ+ Ġex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ BRO WS ABLE ) ĊĠĠĠĠĠĠĠ Ġintent . component Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġintent . selector Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( m Activity . package Manager . resolve Activity ( intent , Ġ 0 ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSL : ĠNot Ġsure Ġwhat Ġthat Ġspecial Ġcase Ġis Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpack ag ename Ġ= Ġintent . get Package () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( packag ename Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ VIEW , ĠUri . parse ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" market :// search ? q = pname :" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġpack ag ename ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ BRO WS ABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// m Activity . startActivity ( intent ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( tab Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( INT ENT _ ORIGIN , Ġtab . hashCode ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġm : ĠMatcher Ġ= ĠAC CEPT ED _ URI _ SCHEMA . matcher ( url ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( m . matches () Ġ&& Ġ! is Special ized Handler Available ( intent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġintent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠstartActivity For Intent ( a Intent : ĠIntent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Activity . startActivity IfNeeded ( a Intent , Ġ- 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠstartActivity For Url (@ Nullable Ġtab : ĠWebView ?, Ġ@ NonNull Ġurl : ĠString ): ĠBoolean ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġintent For Url ( tab , Ġurl ) ĊĠĠĠĠĠĠĠ Ġreturn Ġintent ?. let Ġ{ ĠstartActivity For Intent ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSearch Ġfor Ġintent Ġhandlers Ġthat Ġare Ġspecific Ġto Ġthis ĠURL Ġa ka , Ġspecialized ĊĠĠĠĠ Ġ* Ġapps Ġlike Ġgoogle Ġmaps Ġor Ġyoutube ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Special ized Handler Available (@ NonNull Ġintent : ĠIntent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpm Ġ= Ġm Activity . package Manager ĊĠĠĠĠĠĠĠ Ġval Ġhandlers Ġ= Ġpm . query Intent Activities ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . GET _ RESOL VED _ FILTER ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( handlers . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( resolve Info Ġin Ġhandlers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= Ġresolve Info . filter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ// ĠNo Ġintent Ġfilter Ġmatches Ġthis Ġintent ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠError Ġon Ġthe Ġside Ġof Ġstay ing Ġin Ġthe Ġbrowser , Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNOTICE : ĠUse Ġof Ġ&& Ġinstead Ġof Ġ|| Ġwill Ġcause Ġthe Ġbrowser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġlaunch Ġa Ġnew Ġintent Ġfor Ġevery ĠURL , Ġusing ĠOR Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġla unches Ġa Ġnew Ġone Ġif Ġthere Ġis Ġa Ġnon - browser Ġapp Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcan Ġhandle Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPrevious ly Ġwe Ġchecked Ġthe Ġnumber Ġof Ġdata Ġpaths , Ġbut Ġit Ġis Ġunnecessary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfilter . count Data Author ities () Ġ== Ġ 0 Ġ|| Ġfilter . count Data Paths () Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filter . count Data Author ities () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeneric Ġhandler , Ġskip ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSh ares Ġa ĠURL Ġto Ġthe Ġsystem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġurl ĠĠ Ġthe ĠURL Ġto Ġshare . ĠIf Ġthe ĠURL Ġis Ġnull ĊĠĠĠĠ Ġ* Ġor Ġa Ġspecial ĠURL , Ġno Ġsharing Ġwill Ġoccur . ĊĠĠĠĠ Ġ* Ġ@ param Ġtitle Ġthe Ġtitle Ġof Ġthe ĠURL Ġto Ġshare . ĠThis ĊĠĠĠĠ Ġ* Ġis Ġoptional . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġshare Url (@ Nullable Ġurl : ĠString ?, Ġ@ Nullable Ġtitle : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( url Ġ!= Ġnull Ġ&& Ġ! url . is Special Url ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshare Intent Ġ= ĠIntent ( Intent . ACTION _ SEND ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshare Intent . type Ġ= Ġ" text / plain " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare Intent . putExtra ( Intent . EXTRA _ SUBJECT , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshare Intent . putExtra ( Intent . EXTRA _ TEXT , Ġurl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Activity . startActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . create Chooser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare Intent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Activity . getString ( R . string . dialog _ title _ share ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAC CEPT ED _ URI _ SCHEMA Ġ= ĠPattern . compile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"( ? i )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ Ġ// Ġswitch Ġon Ġcase Ġins ensitive Ġmatching ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'(' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ Ġ// Ġbegin Ġgroup Ġfor Ġschema ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( ?: http | https | file ) ://" Ġ+ Ġ" |( ?: inline | data | about | javascript ): " Ġ+ Ġ" |( ?: .* : .* @ )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ')' Ġ+ Ġ"( .* )" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }