/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠD uck Duck Go Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . duck duck go . app . browser Ċ Ċ import Ġandroid . arch . lifecycle . Observer Ċ import Ġandroid . arch . lifecycle . ViewModel Providers Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent . EXTRA _ TEXT Ċ import Ġandroid . os . Bundle Ċ import Ġcom . duck duck go . app . bookmarks . ui . Book marks Activity Ċ import Ġcom . duck duck go . app . browser . Browser ViewModel . Command Ċ import Ġcom . duck duck go . app . browser . Browser ViewModel . Command . Query Ċ import Ġcom . duck duck go . app . browser . Browser ViewModel . Command . Refresh Ċ import Ġcom . duck duck go . app . feedback . ui . Feedback Activity Ċ import Ġcom . duck duck go . app . global . Duck Duck Go Activity Ċ import Ġcom . duck duck go . app . global . ViewModel Factory Ċ import Ġcom . duck duck go . app . global . intent Text Ċ import Ġcom . duck duck go . app . global . view . Fire Dialog Ċ import Ġcom . duck duck go . app . privacy . ui . Privacy Dashboard Activity Ċ import Ġcom . duck duck go . app . settings . Settings Activity Ċ import Ġcom . duck duck go . app . statistics . pixels . Pixel Ċ import Ġcom . duck duck go . app . statistics . pixels . Pixel . Pixel Name .* Ċ import Ġcom . duck duck go . app . tabs . model . Tab Entity Ċ import Ġcom . duck duck go . app . tabs . ui . Tab Switch er Activity Ċ import Ġorg . jetbrains . ank o . long Toast Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject ĊĊ Ċ class ĠBrowser Activity Ġ: ĠD uck Duck Go Activity () Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠviewModel Factory : ĠViewModel Factory ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġpixel : ĠPixel ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġweb DataManager : ĠWeb DataManager ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Tab : ĠBrowser Tab Fragment ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠBrowser ViewModel Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠViewModel Providers . of ( this , ĠviewModel Factory ). get ( Browser ViewModel :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ browser ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch New Search Or Query ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconfigure Observer s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon New Intent ( intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on New Intent ( intent ) ĊĠĠĠĠĠĠĠ Ġlaunch New Search Or Query ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen New Tab ( tab Id : ĠString , Ġurl : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= ĠBrowser Tab Fragment . newInstance ( tab Id , Ġurl ) ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠ Ġif Ġ( current Tab Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . replace ( R . id . fragment Container , Ġfragment , Ġtab Id ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . hide ( current Tab ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . add ( R . id . fragment Container , Ġfragment , Ġtab Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtransaction . commit () ĊĠĠĠĠĠĠĠ Ġcurrent Tab Ġ= Ġfragment ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Tab ( tab : ĠTab Entity ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tab Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tab . tab Id Ġ== Ġcurrent Tab ?. tab Id ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġsupport FragmentManager . find Fragment By Tag ( tab . tab Id ) Ġas ? ĠBrowser Tab Fragment ĊĠĠĠĠĠĠĠ Ġif Ġ( fragment Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen New Tab ( tab . tab Id , Ġtab . url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠ Ġcurrent Tab ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . hide ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtransaction . show ( fragment ) ĊĠĠĠĠĠĠĠ Ġtransaction . commit () ĊĠĠĠĠĠĠĠ Ġcurrent Tab Ġ= Ġfragment ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Tabs ( fragments : ĠList < Browser Tab Fragment >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠ Ġfragments . forEach Ġ{ Ġtransaction . remove ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġtransaction . commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlaunch New Search Or Query ( intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( launch New Search ( intent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on New Tab Requested () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġshared Text Ġ= Ġintent . intent Text ĊĠĠĠĠĠĠĠ Ġif Ġ( shared Text Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Open In New Tab Requested ( shared Text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfigure Observer s () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . command . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Command ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . selected Tab . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect Tab ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . tabs . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear St ale Tabs ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Tabs Updated ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear St ale Tabs ( updated Tabs : ĠList < Tab Entity > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( updated Tabs Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstale Ġ= Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fragments . map NotNull Ġ{ Ġit Ġas ? ĠBrowser Tab Fragment Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġfragment Ġ-> Ġupdated Tabs . none Ġ{ Ġit . tab Id Ġ== Ġfragment . tab Id Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( st ale . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Tabs ( st ale ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Command ( command : ĠCommand ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . i (" Processing Ġcommand : Ġ$ command ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( command ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠQuery Ġ-> Ġcurrent Tab ?. submit Query ( command . query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRefresh Ġ-> Ġcurrent Tab ?. refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommand . Display Message Ġ-> Ġapplication Context ?. long Toast ( command . message Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlaunch New Search ( intent : ĠIntent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġintent . getBoolean Extra ( NEW _ SEARCH _ EXTRA , Ġfalse ) Ġ|| Ġintent . action Ġ== ĠIntent . ACTION _ AS SIST ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlaunch Privacy Dashboard () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Tab ?. tab Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( Privacy Dashboard Activity . intent ( this , Ġit ), ĠD ASH BOARD _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlaunch Fire () Ġ{ ĊĠĠĠĠĠĠĠ ĠFire Dialog ( context Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixel Ġ= Ġpixel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb DataManager Ġ= Ġweb DataManager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Started Ġ= Ġ{ ĠviewModel . on Clear Requested () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Complete Ġ= Ġ{ ĠviewModel . on Clear Complete () Ġ} ĊĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlaunch Tab Switch er () Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( Tab Switch er Activity . intent ( this )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlaunch New Tab () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . on New Tab Requested () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen In New Tab ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . on Open In New Tab Requested ( query ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlaunch Broken Site Feedback ( url : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( Feedback Activity . intent ( this , Ġtrue , Ġurl )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlaunch Settings () Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( Settings Activity . intent ( this )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlaunch Book marks () Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( Book marks Activity . intent ( this )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠD ASH BOARD _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . received Dashboard Result ( result Code ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Tab ?. on Back Pressed () Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġintent ( context : ĠContext , Ġquery Extra : ĠString ? Ġ= Ġnull , Ġnew Search : ĠBoolean Ġ= Ġfalse ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠBrowser Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ TEXT , Ġquery Extra ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( NEW _ SEARCH _ EXTRA , Ġnew Search ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġintent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNEW _ SEARCH _ EXTRA Ġ= Ġ" NEW _ SEARCH _ EXTRA " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠD ASH BOARD _ REQUEST _ CODE Ġ= Ġ 1 0 0 ĊĠĠĠ Ġ} Ċ Ċ }