/******************************************************************************* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠCopyright Ġ( C ) Ġ 2 0 1 7 Ġby ĠMax ĠL v Ġ< max . c . lv @ gmail . com > ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠCopyright Ġ( C ) Ġ 2 0 1 7 Ġby ĠMy god ĠStudio Ġ< contact - shadow socks - android @ my god . be > Ġ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify ĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby ĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġthe ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor ĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , ĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense ĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġalong Ġwith Ġthis Ġprogram . ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. ĠĠĠĠĠĠ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ************************************************************************* ******/ Ċ Ċ package Ġcom . github . shadow socks Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Animator Listener Adapter Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Clip Data Ċ import Ġandroid . content . Clipboard Manager Ċ import Ġandroid . content . pm . Application Info Ċ import Ġandroid . content . pm . Package Info Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . Switch Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . core . app . Task Stack Builder Ċ import Ġandroidx . core . content . getSystem Service Ċ import Ġandroidx . recyclerview . widget . Default Item Animator Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . github . shadow socks . App . Companion . app Ċ import Ġcom . github . shadow socks . database . Profile Manager Ċ import Ġcom . github . shadow socks . preference . DataStore Ċ import Ġcom . github . shadow socks . utils .* Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ class ĠApp Manager Ġ: ĠAppCompatActivity (), ĠToolbar . On MenuItem ClickListener Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Static Field Leak ") ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinstance : ĠApp Manager ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġreceiver : ĠBroadcast Receiver ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcached Apps : ĠList < Package Info >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Apps ( pm : ĠPackage Manager ) Ġ= Ġsynchronized ( App Manager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Ġ== Ġnull ) Ġreceiver Ġ= Ġapp . listen For Package Changes Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( App Manager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Apps Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Manager . instance ?. reload Apps () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLabels Ġand Ġicons Ġcan Ġchange Ġon Ġconfiguration Ġ( locale , Ġetc .) Ġchanges , Ġtherefore Ġthey Ġare Ġnot Ġcached . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Apps Ġ= Ġcached Apps Ġ?: Ġpm . get Installed Packages ( PackageManager . GET _ PERMISSION S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . packageName Ġ!= Ġapp . packageName Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . requested Permissions ?. contains ( Manifest . permission . INTER NET ) Ġ?: Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . cached Apps Ġ= Ġcached Apps ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Apps ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĠPro x ied App ( pm , Ġit . application Info , Ġit . packageName ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠPro x ied App ( private Ġval Ġpm : ĠPackage Manager , Ġprivate Ġval Ġapp Info : ĠApplication Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠCharSequence Ġ= Ġapp Info . load Label ( pm ) ĠĠĠ Ġ// Ġcached Ġfor Ġsorting ĊĠĠĠĠĠĠĠ Ġval Ġicon : ĠDrawable Ġget () Ġ= Ġapp Info . load Icon ( pm ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠApp ViewHolder ( view : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( view ), ĠView . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġicon Ġ= Ġview . findViewById < ImageView >( R . id . item icon ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcheck Ġ= Ġview . findViewById < Switch >( R . id . item check ) ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġitem : ĠPro x ied App ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġprox ied Ġget () Ġ= Ġprox ied Apps . contains ( item . packageName ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( app : ĠPro x ied App ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . item Ġ= Ġapp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon . setImage Drawable ( app . icon ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck . text Ġ= Ġapp . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck . isChecked Ġ= Ġprox ied ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prox ied ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprox ied Apps . remove ( item . packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck . isChecked Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprox ied Apps . add ( item . packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! apps Loading . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Store . individual Ġ= Ġprox ied Apps . join ToString ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Store . dirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠApps Adapter Ġ: ĠRecyclerView . Adapter < App ViewHolder >() Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġapps Ġ= ĠlistOf < Prox ied App >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġreload () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapps Ġ= Ġget Apps ( package Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted With ( compare By ({ Ġ! prox ied Apps . contains ( it . packageName ) Ġ}, Ġ{ Ġit . name . toString () Ġ})) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠApp ViewHolder , Ġposition : ĠInt ) Ġ= Ġholder . bind ( apps [ position ]) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠApp ViewHolder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp ViewHolder ( LayoutInflater . from ( parent . context ). inflate ( R . layout . layout _ apps _ item , Ġparent , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġapps . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprox ied Apps : ĠHashSet < String > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtoolbar : ĠToolbar ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbypass Switch : ĠSwitch ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġapp ListView : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġloading View : ĠView ĊĠĠĠ Ġprivate Ġval Ġapps Loading Ġ= ĠAtomic Boolean () ĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler () ĊĠĠĠ Ġprivate Ġval Ġclipboard Ġby Ġlazy Ġ{ Ġget System Service < Clipboard Manager >() !! Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Prox ied Apps ( str : ĠString Ġ= ĠData Store . individual ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprox ied Apps Ġ= Ġstr . split ('\ n '). to HashSet () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġreload Apps () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! apps Loading . compare AndSet ( true , Ġfalse )) Ġload Apps Async () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġload Apps Async () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! apps Loading . compare AndSet ( false , Ġtrue )) Ġreturn ĊĠĠĠĠĠĠĠ Ġapp ListView . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġloading View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġthread (" App Manager - loader ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġapp ListView . adapter Ġas ĠApps Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapps Loading . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . reload () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! apps Loading . compare AndSet ( true , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshort Anim Time Ġ= Ġresources . getInteger ( android . R . integer . config _ short Anim Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp ListView . alpha Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp ListView . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp ListView . animate (). alpha ( 1 F ). duration Ġ= Ġshort Anim Time . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading View . animate (). alpha ( 0 F ). set Listener ( object Ġ: ĠAn imator Listener Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). duration Ġ= Ġshort Anim Time . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . layout _ apps ) ĊĠĠĠĠĠĠĠ Ġtoolbar Ġ= ĠfindViewById ( R . id . toolbar ) ĊĠĠĠĠĠĠĠ Ġtoolbar . setTitle ( R . string . prox ied _ apps ) ĊĠĠĠĠĠĠĠ Ġtoolbar . set Navigation Icon ( theme . resolve ResourceId ( R . attr . home As Up Indicator )) ĊĠĠĠĠĠĠĠ Ġtoolbar . set Navigation OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġparent Activity Intent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ== Ġnull Ġ|| Ġ! should Up Re create Task ( intent ) Ġ&& Ġ! is Task Root ) Ġfinish () Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Stack Builder . create ( this ). add Next Intent With Parent Stack ( intent ). start Activities () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtoolbar . inflate Menu ( R . menu . app _ manager _ menu ) ĊĠĠĠĠĠĠĠ Ġtoolbar . setOn MenuItem ClickListener ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! DataStore . proxy Apps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Store . proxy Apps Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Store . dirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < Switch >( R . id . on Switch ). setOn Checked ChangeListener Ġ{ Ġ_, Ġchecked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Store . proxy Apps Ġ= Ġchecked ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Store . dirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbypass Switch Ġ= ĠfindViewById ( R . id . bypass Switch ) ĊĠĠĠĠĠĠĠ Ġbypass Switch . isChecked Ġ= ĠData Store . bypass ĊĠĠĠĠĠĠĠ Ġbypass Switch . setOn Checked ChangeListener Ġ{ Ġ_, Ġchecked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Store . bypass Ġ= Ġchecked ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData Store . dirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Prox ied Apps () ĊĠĠĠĠĠĠĠ Ġloading View Ġ= ĠfindViewById ( R . id . loading ) ĊĠĠĠĠĠĠĠ Ġapp ListView Ġ= ĠfindViewById ( R . id . list ) ĊĠĠĠĠĠĠĠ Ġapp ListView . layout Manager Ġ= ĠLinearLayoutManager ( this , ĠRecyclerView . VERTICAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġapp ListView . item Animator Ġ= ĠDefault Item Animator () ĊĠĠĠĠĠĠĠ Ġapp ListView . adapter Ġ= ĠApps Adapter () ĊĊĠĠĠĠĠĠĠ Ġinstance Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġload Apps Async () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon MenuItem Click ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ apply _ all Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofiles Ġ= ĠProfile Manager . getAll Profiles () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( profiles Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprox ied App String Ġ= ĠData Store . individual ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofiles . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . individual Ġ= Ġprox ied App String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProfile Manager . update Profile ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DataStore . direct Boot Aware ) ĠDirect Boot . update () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( app ListView , ĠR . string . action _ apply _ all , ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠSn ackbar . make ( app ListView , ĠR . string . action _ export _ err , ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ export _ clipboard Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclipboard . primary Clip Ġ= ĠClip Data . new Plain Text ( Key . individual , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ DataStore . bypass }\ n ${ DataStore . individual }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( app ListView , ĠR . string . action _ export _ msg , ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ import _ clipboard Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprox ied App String Ġ= Ġclipboard . primary Clip ?. getItem At ( 0 )?. text ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! prox ied App String . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġprox ied App String !!. indexOf ('\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( enabled , Ġapps ) Ġ= Ġif Ġ( i Ġ< Ġ 0 ) ĠPair ( prox ied App String , Ġ"") Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( prox ied App String . substring ( 0 , Ġi ), Ġprox ied App String . substring ( i Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbypass Switch . isChecked Ġ= Ġenabled . to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Store . individual Ġ= Ġapps ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Store . dirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( app ListView , ĠR . string . action _ import _ msg , ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Prox ied Apps ( apps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreload Apps () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠIllegalArgumentException ) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( app ListView , ĠR . string . action _ import _ err , ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon KeyUp ( keyCode : ĠInt , Ġevent : ĠKeyEvent ?) Ġ= Ġif Ġ( keyCode Ġ== ĠKeyEvent . KEYCODE _ MENU ) ĊĠĠĠĠĠĠĠ Ġif Ġ( toolbar . is Overflow Menu Showing ) Ġtoolbar . hide Overflow Menu () Ġelse Ġtoolbar . show Overflow Menu () ĊĠĠĠ Ġelse Ġsuper . on KeyUp ( keyCode , Ġevent ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġinstance Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġhandler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} Ċ } Ċ