/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 Ġ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 . location . ui Ċ Ċ import Ġandroid . app . Dialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . fragment . app . Dialog Fragment Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . duck duck go . app . browser . R Ċ import Ġcom . duck duck go . app . browser . favicon . Fav icon Manager Ċ import Ġcom . duck duck go . mobile . android . ui . view . g one Ċ import Ġcom . duck duck go . app . global . view . website From Geo Locations Api Origin Ċ import Ġcom . duck duck go . app . location . data . Location Permission Type Ċ import Ġdagger . android . support . Android Support Injection Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠSite Location Permission Dialog Ġ: ĠDialog Fragment () Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġfav icon Manager : ĠF av icon Manager ĊĊĠĠĠ Ġprivate Ġvar Ġfav icon Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġinterface ĠSite Location Permission Dialog Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Site Location Permission Selected ( domain : ĠString , Ġpermission : ĠLocation Permission Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġlistener : ĠSite Location Permission Dialog Listener ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( parent Fragment Ġis ĠSite Location Permission Dialog Listener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Fragment Ġas ĠSite Location Permission Dialog Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Ġas ĠSite Location Permission Dialog Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attach ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAndroid Support Injection . inject ( this ) ĊĠĠĠĠĠĠĠ Ġsuper . on Attach ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġis Cancel able Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Dialog ( savedInstanceState : ĠBundle ?): ĠDialog Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġroot View Ġ= Ġlayout Inflater . inflate ( R . layout . content _ site _ location _ permission _ dialog , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġroot View . findViewById < TextView >( R . id . site Permission Dialog Title ) ĊĠĠĠĠĠĠĠ Ġval Ġsubtitle Ġ= Ġroot View . findViewById < TextView >( R . id . site Permission Dialog Subtitle ) ĊĠĠĠĠĠĠĠ Ġval Ġfav icon Ġ= Ġroot View . findViewById < ImageView >( R . id . site Permission Dialog Fav icon ) ĊĠĠĠĠĠĠĠ Ġval Ġallow Always Ġ= Ġroot View . findViewById < TextView >( R . id . site Allow Always Location Permission ) ĊĠĠĠĠĠĠĠ Ġval Ġallow Once Ġ= Ġroot View . findViewById < TextView >( R . id . site Allow Once Location Permission ) ĊĠĠĠĠĠĠĠ Ġval Ġdeny Once Ġ= Ġroot View . findViewById < TextView >( R . id . site Den y Once Location Permission ) ĊĠĠĠĠĠĠĠ Ġval Ġdeny Always Ġ= Ġroot View . findViewById < TextView >( R . id . site Den y Always Location Permission ) ĊĠĠĠĠĠĠĠ Ġval Ġextra Divider Ġ= Ġroot View . findViewById < View >( R . id . site Allow Once Location Permission Divider ) ĊĠĠĠĠĠĠĠ Ġval Ġanother Divider Ġ= Ġroot View . findViewById < View >( R . id . site Den y Location Permission Divider ) ĊĊĠĠĠĠĠĠĠ Ġval Ġalert Dialog Ġ= ĠAlertDialog . Builder ( require Activity (), ĠR . style . AlertDialog Theme ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setView ( root View ) ĊĊĠĠĠĠĠĠĠ Ġvalidate Bundle Arguments () ĊĠĠĠĠĠĠĠ Ġpopulate Title ( title ) ĊĠĠĠĠĠĠĠ Ġpopulate Subtitle ( subtitle ) ĊĠĠĠĠĠĠĠ Ġpopulate Fav icon ( favicon ) ĊĠĠĠĠĠĠĠ Ġconfigure Listeners ( allow Always , Ġallow Once , Ġdeny Once , Ġdeny Always ) ĊĠĠĠĠĠĠĠ Ġhide Extra Views ( allow Once , Ġdeny Once , Ġextra Divider , Ġanother Divider ) ĊĠĠĠĠĠĠĠ Ġmake C ancellable () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġalert Dialog . create () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detach () Ġ{ ĊĠĠĠĠĠĠĠ Ġfav icon Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġsuper . on Detach () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Origin Url (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrequire Arguments (). getString ( KEY _ REQUEST _ ORIGIN ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Tab Id (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrequire Arguments (). getString ( KEY _ TAB _ ID ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Editing Permissions (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrequire Arguments (). getBoolean ( KEY _ EDIT ING _ PERMISSION ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpopulate Title ( title : ĠTextView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtitle . text Ġ= ĠgetString ( R . string . prec ise Location Site Dialog Title , Ġget Origin Url (). website From Geo Locations Api Origin ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpopulate Subtitle ( subtitle : ĠTextView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( get Origin Url (). website From Geo Locations Api Origin () Ġ== ĠD DG _ DOMAIN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle . text Ġ= ĠgetString ( R . string . prec ise Location DD G Dialog Subtitle ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle . text Ġ= ĠgetString ( R . string . prec ise Location Site Dialog Subtitle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpopulate Fav icon ( imageView : ĠImageView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorigin Url Ġ= Ġget Origin Url () ĊĠĠĠĠĠĠĠ Ġval Ġtab Id Ġ= Ġget Tab Id () ĊĊĠĠĠĠĠĠĠ Ġfav icon Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġfav icon Job Ġ= Ġthis . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfav icon Manager . load To View From Local Or Fallback ( tab Id , Ġorigin Url , ĠimageView ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfigure Listeners ( ĊĠĠĠĠĠĠĠ Ġallow Always : ĠTextView , ĊĠĠĠĠĠĠĠ Ġallow Once : ĠTextView , ĊĠĠĠĠĠĠĠ Ġdeny Once : ĠTextView , ĊĠĠĠĠĠĠĠ Ġdeny Always : ĠTextView ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorigin Url Ġ= Ġget Origin Url () ĊĠĠĠĠĠĠĠ Ġallow Always . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Site Location Permission Selected ( origin Url , ĠLocation Permission Type . ALLOW _ ALWAYS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġallow Once . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Site Location Permission Selected ( origin Url , ĠLocation Permission Type . ALLOW _ ON CE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdeny Once . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Site Location Permission Selected ( origin Url , ĠLocation Permission Type . DEN Y _ ON CE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdeny Always . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Site Location Permission Selected ( origin Url , ĠLocation Permission Type . DEN Y _ ALWAYS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Extra Views ( ĊĠĠĠĠĠĠĠ Ġallow Once : ĠTextView , ĊĠĠĠĠĠĠĠ Ġdeny Once : ĠTextView , ĊĠĠĠĠĠĠĠ Ġdivider One : ĠView , ĊĠĠĠĠĠĠĠ Ġdivider Two : ĠView ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Editing Permissions ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdivider One . g one () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdivider Two . g one () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallow Once . g one () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeny Once . g one () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake C ancellable () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Cancel able Ġ= Ġis Editing Permissions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Bundle Arguments () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( arguments Ġ== Ġnull ) Ġthrow ĠIllegalArgumentException (" Missing Ġarguments Ġbundle ") ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġrequire Arguments () ĊĠĠĠĠĠĠĠ Ġif Ġ(! args . containsKey ( KEY _ REQUEST _ ORIGIN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Bundle Ġarguments Ġrequired Ġ[ KEY _ REQUEST _ ORIGIN ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( args . getString ( KEY _ REQUEST _ ORIGIN ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Bundle Ġarguments Ġcan 't Ġbe Ġnull Ġ[ KEY _ REQUEST _ ORIGIN ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! args . containsKey ( KEY _ TAB _ ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Bundle Ġarguments Ġrequired Ġ[ KEY _ TAB _ ID ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( args . getString ( KEY _ TAB _ ID ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Bundle Ġarguments Ġcan 't Ġbe Ġnull Ġ[ KEY _ TAB _ ID ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! args . containsKey ( KEY _ EDIT ING _ PERMISSION )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Bundle Ġarguments Ġrequired Ġ[ KEY _ EDIT ING _ PERMISSION ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS ITE _ LOCATION _ PERMISSION _ TAG Ġ= Ġ" Site Location Permission " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ REQUEST _ ORIGIN Ġ= Ġ" KEY _ REQUEST _ ORIGIN " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ EDIT ING _ PERMISSION Ġ= Ġ" KEY _ SCREEN _ FROM " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ TAB _ ID Ġ= Ġ" TAB _ ID " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠD DG _ DOMAIN Ġ= Ġ" duck duck go . com " ĊĊĠĠĠĠĠĠĠ Ġfun Ġinstance ( origin : ĠString , Ġis Editing Permission : ĠBoolean , Ġtab Id : ĠString ): ĠSite Location Permission Dialog Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSite Location Permission Dialog (). also Ġ{ Ġfragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . putString ( KEY _ REQUEST _ ORIGIN , Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . putString ( KEY _ TAB _ ID , Ġtab Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . put Boolean ( KEY _ EDIT ING _ PERMISSION , Ġis Editing Permission ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . arguments Ġ= Ġbundle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ